Scikit Learn SVR模型不迭代、预测返回全相同值问题求助
SVR预测输出全相同值的原因及解决方案
核心原因分析
- 特征与标签未做标准化处理:SVR(尤其是RBF核)对输入数据的尺度极度敏感,默认参数下如果输入特征(深度)和输出标签(剂量)的数值尺度不匹配,会导致RBF核函数计算的相似度全部接近0,模型无法学到有效规律,最终输出全局均值附近的固定值,你当前输出的1e-15量级数值基本符合这种情况。
- 默认超参数完全不匹配业务场景:SVR默认参数是通用场景下的默认值,针对剂量拟合场景大概率不适配:
C(惩罚系数)默认值为1,若标签取值范围较大、或数据噪声低,C过小会导致模型对拟合误差的惩罚力度不足,直接输出无差别的常数epsilon(不敏感损失阈值)默认值为0.1,若你的剂量数值本身量级远小于0.1、或拟合精度要求高于这个阈值,模型会认为所有预测结果都在可接受误差范围内,不需要做差异化拟合gamma(RBF核带宽系数)默认值为1/特征数(你当前单特征场景下默认值为1),如果深度特征的取值跨度大,gamma过大/过小都会导致核函数的区分度趋近于0,模型无法区分不同输入的差异
- 数据集构建错误:你的代码中未展示
depths_tot、doses_tot的生成逻辑,可能存在深浅剂量数据拼接错误、剂量数据读取异常全为接近0的数值、特征标签对应关系错位等问题。
对应解决步骤
- 对特征和标签分别做标准化处理,示例代码如下:
from sklearn.preprocessing import StandardScaler # 特征标准化 x_scaler = StandardScaler() depths_train_scaled = x_scaler.fit_transform(depths_train.reshape(-1,1)) depths_test_scaled = x_scaler.transform(depths_test.reshape(-1,1)) # 标签标准化(SVR也需要对标签做缩放) y_scaler = StandardScaler() doses_train_scaled = y_scaler.fit_transform(doses_train.reshape(-1,1)).ravel() # 训练模型 custom_reg.fit(depths_train_scaled, doses_train_scaled) # 预测后逆缩放回原剂量尺度 pred_scaled = custom_reg.predict(depths_test_scaled) pred = y_scaler.inverse_transform(pred_scaled.reshape(-1,1))
- 网格搜索适配场景的超参数,示例代码如下:
param_grid = { 'C': [0.1, 1, 10, 100, 1000], 'gamma': ['scale', 'auto', 0.001, 0.01, 0.1, 1], 'epsilon': [0.001, 0.01, 0.1, 0.2] } grid = GridSearchCV(svm.SVR(kernel='rbf'), param_grid, cv=5, scoring='neg_mean_squared_error') grid.fit(depths_train_scaled, doses_train_scaled) # 用最优参数的模型预测 custom_reg = grid.best_estimator_
- 检查数据集合法性:打印
depths_tot、doses_tot的最大值、最小值、均值、标准差,确认数据读取、拼接逻辑正确,不存在异常值覆盖有效数据的问题。
内容的提问来源于stack exchange,提问作者Reginaldo Leão
相关产品推荐
相关产品推荐

