使用LSTM与GRU做时间序列分析出现负R²值问题咨询
负R²值的原因与含义解释
R²的取值范围纠正
你看到的部分资料里R²取值为0~1是错误认知,R²的实际取值范围为(-∞, 1],只有当模型预测效果优于「直接用真实值的均值作为所有样本的预测结果」的朴素基准时,R²才会落在0到1的区间内。
R²的计算公式为:
R² = 1 - (SSR / SST)
其中SSR为预测值与真实值的残差平方和,SST为真实值与真实值均值的残差平方和
当SSR > SST时,R²就会出现负值,代表模型预测效果比直接猜均值还要差。
你场景下出现负R²的常见原因
结合你给出的代码和金融时序预测的场景,最可能的原因有以下几个:
- 归一化/反归一化逻辑遗漏:训练时序模型时你大概率对输入特征做了归一化/标准化处理,但你的
evaluate_model函数直接用原始测试集数据计算指标,预测输出Y_hat是归一化后的小量级数值,而Y_test是原始的收盘价绝对值,两个序列量级差距极大,计算出的残差平方和SSR远大于SST,就会得到负R²。你视觉上觉得拟合效果好,是因为绘图时会自动对齐两个序列的坐标轴范围,看起来走势贴合,但实际数值误差非常大。 - 测试集分布漂移:你用的是2020年的股票数据,9-12月的测试区间可能出现了和训练集完全不同的行情走势,模型虽然捕捉到了短期波动趋势,但绝对价格的误差比直接用训练集收盘价均值做预测还要大,也会出现负R²。
- 数组维度不匹配:检查
Y_test和Y_hat的维度是否完全一致,比如有没有其中一个是二维数组、另一个是一维数组的情况,极端情况下会影响r2_score的计算结果。
负R²的实际含义
当前模型完全不具备预测价值,哪怕视觉上拟合效果符合预期,也属于模型失效的情况,无法用于实际落地。
快速排查方案
- 输出前10组
Y_test和Y_hat的实际数值,直接对比量级差,就能快速定位是不是归一化的问题 - 对预测结果做对应特征的反归一化,转回原始收盘价量级后再重新计算R²
- 手动计算朴素基准的MSE:将
np.mean(Y_test)作为所有样本的预测值计算MSE,和你模型输出的MSE对比,如果模型MSE更高,说明确实是模型拟合效果未达基准要求。
内容的提问来源于stack exchange,提问作者Yohanees Hutagalung
相关产品推荐
相关产品推荐

