使用SVR做降雨量预测时RMSE过高且预测值全相同的原因求解
SVR降雨量预测异常问题原因分析与解决方法
异常原因
- 未进行特征与目标的标准化处理:SVR的模型构建依赖特征空间的距离计算,对输入、输出的数值尺度高度敏感。降雨量场景下,月度特征和年度目标的数值量级存在明显差异,未做标准化会导致距离计算完全失效,模型无法学习到输入与输出之间的映射关系。
- 模型参数配置不合理:当前使用的
C=0.1正则化系数过小,正则化强度过高,模型处于严重欠拟合状态;epsilon=0.2的设置未匹配目标值的数值量级,进一步限制了模型的拟合能力,最终模型仅能输出全局均值作为所有样本的预测结果,因此出现所有预测值一致、RMSE过高的现象。 - 特征相关性不足:如果1-12月月度降雨量与年度降雨量的线性/非线性相关性极低,也会导致模型无法学习有效映射,出现同类欠拟合表现,该情况可在排查前两个问题后进一步验证。
解决步骤
- 完成数据标准化处理:使用
StandardScaler分别对训练集的特征和目标拟合缩放器,再对训练集、测试集做统一转换,禁止使用测试集数据拟合缩放器,避免数据泄露。 - 重新调试模型参数:将
gamma参数设置为scale适配标准化后的特征;通过GridSearchCV网格搜索对C(推荐调试范围:1、10、100、1000)、epsilon(推荐调试范围:0.1、0.5、1、2,匹配标准化后的目标量级)做参数寻优。 - 拟合效果校验:调参完成后先查看训练集的预测误差,若训练集误差依旧过高,需要进一步验证特征与目标的相关性是否满足预测任务的基本要求。
参考优化代码
from sklearn.preprocessing import StandardScaler from sklearn.svm import SVR from sklearn.model_selection import GridSearchCV import math from sklearn.metrics import mean_squared_error import pandas as pd import time # 特征标准化 scaler_X = StandardScaler() X_train_scaled = scaler_X.fit_transform(X_train) X_test_scaled = scaler_X.transform(X_test) # 目标标准化(也可直接调整epsilon和C适配原始y量级) scaler_y = StandardScaler() y_train_scaled = scaler_y.fit_transform(y_train.reshape(-1,1)).ravel() # 参数寻优 param_grid = { 'C': [1, 10, 100, 1000], 'gamma': ['scale'], 'epsilon': [0.1, 0.5, 1, 2] } grid = GridSearchCV(SVR(), param_grid, cv=5) grid.fit(X_train_scaled, y_train_scaled) clf = grid.best_estimator_ # 预测与反归一化 y_pred_scaled = clf.predict(X_test_scaled) y_pred = scaler_y.inverse_transform(y_pred_scaled.reshape(-1,1)).ravel() # 指标计算 testScore = math.sqrt(mean_squared_error(y_test,y_pred)) print('Test Score: %.2f RMSE' % (testScore)) df_SVR = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred}) print(df_SVR)
内容的提问来源于stack exchange,提问作者Vijay J
相关产品推荐
相关产品推荐

