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

使用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

问题根源分析

你遇到的恒定预测值问题,常见原因有三个:

  1. 特征未标准化:SVR对特征的尺度极其敏感,如果你的输入特征量级差异很大,模型会优先关注量级高的特征,甚至直接忽略其他特征,最后只能输出接近训练集目标均值的恒定值。
  2. 超参数设置不合理:你设置的C=100000太大了,这会让模型过度追求拟合训练数据,但如果特征没做标准化,反而会导致模型无法捕捉到有效规律;另外gamma=0.2的取值可能也不适合你的数据。
  3. 特征与目标无相关性:如果输入的特征和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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:39:45