R²(R-squared,决定系数)是回归模型解释了目标变量多少方差(variance)的比例,取值通常在 0 到 1 之间,越接近 1 表示模型在当前这份数据上贴合得越好。
它的算法其实是个"跟笨蛋比"的游戏。假设你要预测房价,最笨的办法是不看任何房子信息,一律报"全市平均价"。这时所有误差加起来,就是分母。现在你训练了一个模型,它看了面积、地段后给出各自的预测,剩下的误差是分子。R² = 1 − 分子 / 分母。换句话说:你的模型比"无脑报均值"强了多少比例。R² = 0.8,意思是模型消掉了八成原本会犯的误差;R² = 0,说明模型跟报均值一样没用;R² 还能是负数——模型比报均值还差,这在测试集上并不罕见。
关键在于:R² 衡量的是"平均而言解释了多少波动",它不衡量"每个预测值对不对"。
几个常见的自欺场景:
- 训练集 R² 很高,线下就崩。 0.95 是模型在它见过的数据上的成绩,不是它的能力上限。没有样本外验证的 R² 基本只能说明"模型记住了"。
- 整体 R² 漂亮,关键区间系统性出错。 比如房价模型 R² = 0.9,但残差随价格单调上升——高价房被系统性低估。而高价房恰恰是最需要预测准的那批。R² 把这种结构性偏差平均掉了。
- 加特征 R² 只升不降。 哪怕塞进一列随机数,训练集 R² 也不会变差。这时该看调整 R²(Adjusted R-squared),它对特征数量做了惩罚。
- 数据泄漏造出的高 R²。 比如把"成交金额"的衍生字段不小心留在了特征里,模型看起来神准,其实是抄了答案。
和相邻指标的区别:
| 指标 | 单位 | 回答的问题 | 容易被误用成 |
|---|---|---|---|
| R² | 无量纲 | 比报均值强多少 | "模型准确率" |
| MAE(平均绝对误差) | 和原变量一致 | 平均错多少 | 忽略大误差 |
| RMSE(均方根误差) | 和原变量一致 | 大误差有多严重 | 跨数据集比较 |
| 调整 R² | 无量纲 | 扣掉特征数量的 R² | 当作泛化指标 |
对从业者:报 R² 时至少同时给出样本外结果、一个绝对误差指标(MAE 或 RMSE)、一条朴素基线,再配一张残差图。残差图比任何单一数字都诚实。
对业务方:看到"模型解释了 90% 的方差",可以追问三句——这个数是在什么数据上算的?基线是什么?在我们最关心的那个区间里,误差有多大?
R² 是个好用的入门体检指标,但它是体温计,不是诊断书。把它当唯一指标,你测的是模型的自我感觉,不是它上线后的表现。具体评估口径以各家官方文档和你的验证方案为准。
