sklearn中Support vector regression输出平坦预测结果的问题咨询
问题原因及解决方案
- 第一个问题:数据预处理存在数据泄露
你当前的MinMaxScaler拟合时使用了全量特征数据集df_ohe,违反了训练/测试集信息隔离的原则,正确的做法是仅用训练集数据拟合scaler:
# 错误写法 # scaler.fit(df_ohe) # 正确写法 scaler.fit(X_train)
这虽然不是直接导致输出全为常数的核心原因,但会导致你后续的模型评估结果不可信。
- 第二个核心问题:SVR默认超参数和你的数据集不匹配,导致模型严重欠拟合
sklearn中SVR的默认参数C=1、epsilon=0.1,针对你这个场景存在两个适配问题:- 森林火灾数据集的
area字段分布极度偏斜,经过log10(area+1)变换后的标签数值范围非常小,默认的epsilon=0.1设置过大,模型认为直接输出标签均值就可以满足损失要求 - 默认
C=1的正则化强度过高,限制了模型的拟合能力,最终模型就会输出全量常数的预测结果
- 森林火灾数据集的
修复步骤
- 先调整核心超参数,你可以先手动测试下列参数验证效果:
svr = SVR(C=100, epsilon=0.001, gamma='scale')
- 后续可以通过网格搜索自动获取最优超参数,示例代码如下:
from sklearn.model_selection import GridSearchCV param_grid = { 'C': [1, 10, 100, 1000], 'epsilon': [0.0001, 0.001, 0.01, 0.1], 'gamma': ['scale', 'auto', 0.01, 0.1] } grid = GridSearchCV(SVR(), param_grid, cv=5, scoring='neg_mean_squared_error') grid.fit(rescaled_X_train, Y_train) # 用最优参数的模型预测 svr_best = grid.best_estimator_ y_pred = svr_best.predict(rescaled_X_test)
调整后你再绘制预测值和真实值的对比图,就不会出现全平坦的输出结果了。
内容的提问来源于stack exchange,提问作者Abijah
相关产品推荐
相关产品推荐

