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

R语言多元线性回归:为什么测试集$R^2$值为负?

测试集计算得到负R²值的原因说明

负R²值不是代码bug,是符合R²数学定义的正常结果,核心含义是你训练的多元线性模型在测试集上的预测效果,还不如直接拿测试集目标变量的平均值做预测的效果好。

R²的取值逻辑

你写的R²计算函数逻辑完全正确,公式为:
R² = 1 - SSE / SST

  • SSE:模型预测值与真实值的残差平方和,衡量当前模型的预测误差
  • SST:真实值与真实值均值的差的平方和,衡量「所有样本直接预测为目标值均值」这个最朴素基准模型的预测误差
    当SSE大于SST时,R²就会小于0,代表当前模型的泛化预测能力还不如最简单的均值基准。

常见误区:R²取值在0~1之间的结论,仅适用于无正则线性回归在训练集上的评估结果。在测试集评估、使用正则项、或者非线性模型场景下,R²完全可以取到负数,不存在取值下限。

该场景下出现负R²的核心原因

核心问题是样本量过小:

  • 总样本一共只有20条,按8:2划分后训练集仅16条、测试集仅4条。
  • 模型用了5个自变量去拟合16条训练样本,非常容易过拟合训练集里的随机噪声,学到的规律完全不具备泛化性。
  • 测试集仅4个样本的情况下,SST的计算本身波动极大,只要模型在这几个样本上预测偏差稍大,SSE很容易就超过SST,算出负值R²。

验证与调整建议

  • 先计算模型在训练集上的R²,你会发现训练集R²不会是负数,甚至可能数值偏高,直接印证过拟合的判断。
  • 可以做个简单验证:把所有测试集样本的预测值都设为测试集Ratio at Birth的均值,算出来的MSE一定会低于你当前模型预测的MSE,这就是负R²的直接来源。
  • 20条样本的极小数据集场景,不适合用简单随机划分训练/测试集的方式评估,建议改用留一交叉验证,评估结果会稳定很多;如果坚持用划分方式,要么扩充样本量,要么减少自变量数量降低过拟合风险。

内容的提问来源于stack exchange,提问作者lmngn23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 23:13:00