使用SVR预测股价时输出全为同一值的问题排查与解决
修复SVR模型预测股价时输出恒定值的问题
我之前用SVR做股价预测时也碰到过一模一样的情况——所有预测值完全相同,这大概率是模型没学到数据里的有效模式。结合你的代码来看,主要有几个可以调整的点,咱们一步步来解决:
先贴出你的原代码方便对照:
import pandas as pd import numpy as np from sklearn.svm import SVR train= pd.read_csv("ntrain1.csv") X_train = train.drop("Close Now",1) Y_train = train["Close Now"] clf = SVR(kernel= 'rbf', C=100000, gamma=0.2, epsilon = 0.1) clf.fit(X_train, Y_train) test= pd.read_csv("ntestbri.csv") X_test = test.drop("Close Now",1) Y_test = test["Close Now"] y_prediksi = clf.predict(X_test) y_prediksi_series = pd.Series(y_prediksi) y_prediksi= pd.DataFrame() y_prediksi["y_prediksi"] = y_prediksi_series y_prediksi.to_csv("npredksibri3.csv") rmse = np.sqrt( mean_squared_error( Y_test, y_prediksi ) ) rmse
问题根源分析
你遇到的恒定预测值问题,常见原因有三个:
- 特征未标准化:SVR对特征的尺度极其敏感,如果你的输入特征量级差异很大,模型会优先关注量级高的特征,甚至直接忽略其他特征,最后只能输出接近训练集目标均值的恒定值。
- 超参数设置不合理:你设置的
C=100000太大了,这会让模型过度追求拟合训练数据,但如果特征没做标准化,反而会导致模型无法捕捉到有效规律;另外gamma=0.2的取值可能也不适合你的数据。 - 特征与目标无相关性:如果输入的特征和
Close Now没有明显关联,模型自然学不到东西,只能输出恒定值。
修复方案及改进代码
针对这些问题,我整理了改进后的代码,一步步解决问题:
import pandas as pd import numpy as np from sklearn.svm import SVR from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error from sklearn.model_selection import GridSearchCV # 加载训练和测试数据 train = pd.read_csv("ntrain1.csv") test = pd.read_csv("ntestbri.csv") # 分离特征和目标变量(注意axis=1,原代码里的drop("Close Now",1)在新版本pandas会报警告) X_train = train.drop("Close Now", axis=1) Y_train = train["Close Now"] X_test = test.drop("Close Now", axis=1) Y_test = test["Close Now"] # 关键步骤:标准化特征 # 必须先拟合训练集的缩放器,再用它转换测试集,避免数据泄露 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 用网格搜索自动找最优超参数,比手动调参靠谱多了 param_grid = { 'C': [10, 100, 1000], # 缩小C的范围,先从合理区间试起 'gamma': [0.001, 0.01, 0.1], # gamma通常取较小值 'epsilon': [0.01, 0.1, 0.5] } # 用5折交叉验证,以负均方误差作为评分标准 grid = GridSearchCV(SVR(kernel='rbf'), param_grid, cv=5, scoring='neg_mean_squared_error') grid.fit(X_train_scaled, Y_train) print("找到的最优超参数:", grid.best_params_) # 使用最优参数的模型做预测 clf = grid.best_estimator_ y_prediksi = clf.predict(X_test_scaled) # 保存预测结果(简化了原代码的DataFrame创建步骤) y_prediksi_df = pd.DataFrame({"y_prediksi": y_prediksi}) y_prediksi_df.to_csv("npredksibri3.csv", index=False) # 计算RMSE(原代码里漏了导入mean_squared_error,这也是个小问题) rmse = np.sqrt(mean_squared_error(Y_test, y_prediksi)) print("最终RMSE值:", rmse)
额外建议
- 先检查一下训练集
Y_train的均值,如果你的恒定预测值和这个均值接近,那基本就是模型没学到东西,标准化和调参后应该会有改善。 - 可以先做个特征相关性分析,比如用
train.corr()["Close Now"]看看每个特征和目标值的相关性,把相关性极低的特征删掉,减少噪音。
内容的提问来源于stack exchange,提问作者Maulita
相关产品推荐
相关产品推荐

