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
相关产品推荐
相关产品推荐

