You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的数值、特征标签对应关系错位等问题。

对应解决步骤

  1. 对特征和标签分别做标准化处理,示例代码如下:
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))
  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_
  1. 检查数据集合法性:打印depths_tot、doses_tot的最大值、最小值、均值、标准差,确认数据读取、拼接逻辑正确,不存在异常值覆盖有效数据的问题。

内容的提问来源于stack exchange,提问作者Reginaldo Leão

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 05:12:00