即使你认为自己使用的是样本外 R 平方,其实也不是。原因如下
R方 是评估回归模型最常用的指标之一。任何统计学课程都会教授这个指标,它也是 Scikit-learn 中实现的指标之一。
然而,有人对这一指标的可靠性提出了质疑。在卡内基梅隆大学课程笔记中,教授Cosma Shalizi声称 R方 一无是处。
那么,我们是否应该完全否定 R方 ?
我不这么认为。
尽管 R-Squared 指标存在一个明显的缺陷,但其积极意义不应被忽视。在本文中,我将分析这一指标的局限性,并提出一种改进方案,使其在使用时更加可靠。
R 平方的深层含义是什么?
要了解 R方 的问题所在,我们首先需要理解它的含义。我指的是深层含义,而不是大多数资料中的草率定义。
让我们从一个例子开始。假设我们有一个预测模型(“模型 A”),目的在于预测房子的售价。
假设我们的测试集由四栋房子组成。我们可以通过绘制这四栋房子的曲线(预测价格在 x -轴上,实际价格在 y -轴上)来直观地检查该模型的表现:
预测价格与实际价格对比。虚线:45 度线。
每个点与虚线之间的(垂直或水平)距离就是预测误差。例如,如果模型预测的价格是 15 万美元,而房子已售出 17 万美元,那么预测误差就是-2 万美元。
通常情况下,预测误差会被平方化,使其为正值(并对大误差进行惩罚)。然后取平均值。这些运算的结果称为平均平方误差 (MSE)。
我们可以通过绘制每间房屋的平方误差来直观地显示模型 A 的 MSE:
模型 A 的均方误差 MSE 是绿色方格的平均值。
在本例中,MSE=825,000。作为平方量的平均值,MSE 并不容易解释。事实上,825,000 的 MSE 意味着什么?是好?不好吗?
要回答这个问题,我们需要以某种方式对 MSE 进行 “缩放”。例如,如果我们知道 MSE 的下限和上限,我们就可以对 MSE 进行缩放,以了解它在最坏和最好情况之间的连续体中处于什么位置。
确定下限很容易。事实上,一个完全没有预测错误的模型(“完美模型”)的 MSE = 0。
但是上限呢?
上限其实并不存在:一个模型可以坏到什么程度是没有限制的。例如,有一个模型可以预测任何房屋的售价为 100 万美元。这是非常糟糕的,对吗?那么,一个总是预测 1,000 万美元的模型又如何呢?那总是预测 10 亿美元的模型呢?你就明白了。
既然 MSE 没有理论上的上限,我们就需要找到一个 合理 上限,即一个 “合理糟糕 ”的预测模型。顺理成章的选项是总是预测目标变量均值的模型。我们可以称其为 “非熟练模型”。
让我们直观地比较一下模型 A 的 MSE 和非熟练模型的 MSE。
模型 A 和非熟练模型的均方误差。右图中的横线是实际价格的平均值,即非熟练模型的预测值。
通过取红色方格的平均值,我们知道非熟练模型的 MSE 是 2,500,000 。这样,我们终于有了一个下限和一个合理的上限。
R-方 背后的理念是在完美模型和非熟练模型之间线性缩放模型的 MSE。由于完美模型的 MSE 为 0,因此公式简化为:
分子为模型MSE,分母为非熟练模型MSE。
R 方公式。注意,MSE 是用总和除以数据点数得出的。为简单起见,由于 MSE 的分母会抵消,因此省略。
现在我们可以计算每个模型的 R方 :
我们已经说过,不能保证预测模型的 MSE 小于非熟练模型的 MSE。当我们计算一个新模型(例如 “模型 B”)的 MSE 时,它可能会高于非熟练模型的 MSE。在这种情况下,R方 将为负值:
MSE
既然我们已经理解了 R 平方的深层含义,就可以揭开它隐藏的缺陷了。
那么,问题出在哪里?
R方 是统计学家发明的,他们传统上使用样本内指标。换句话说,他们习惯于在训练模型的相同数据上衡量模型的好坏。
这是数据科学家的羁绊。机器学习的第一条规则是,必须始终对预测模型进行样本外评估,以确保它们能很好地泛化新的观察结果。
我知道你在想什么:
"但我已经在计算样本外 R 平方了!” 你以为你已经在计算了,其实不然。
事实上,即使你在测试集上计算 R方 ,也是如此:
from sklearn.metrics import r2_score
r2_score(y_test, pred_test)
有些信息的泄漏可能并不那么明显。
让我来告诉你为什么(借助一个真实的数据集)。
R 平方永远不会超出样本范围
在这个例子中,我将使用 Pycaret 中的 “房子 ”数据集(MIT 许可 下的 Python 库)。
一家房地产公司要求你开发一个 ML 模型来预测一个城市的房屋售价。
你想从简单的开始,所以你建立了一个 “每平价格 ”模型。这个模型将房屋的平方英尺数作为输入,将这个数字乘以一个系数,然后返回该房屋的预测售价。
让我们直观地看看这个模型在测试集中的表现:
散点图: 每平价格模型预测。
这个模型的 R-方 是 45%,还不错。这意味着我们的模型几乎介于非熟练模型和完美模型之间。
现在,假设房地产公司要求你评估该模型在某些社区的表现是否比其他社区差。事实上,如果他们知道模型的性能因社区而异,那么在使用模型准确性较低的地区的预测时就会更加谨慎。
因此,现在不再计算整个测试集的 _R-方,而是分别计算每个邻域的 R-方。结果就是这样:
单个社区的 R 方(24 个可用社区中仅显示 6 个)。
根据 R-方 ,该模型在 BrkSide 、Edwards 和 IDOTRR 等一些街区的表现非常糟糕(甚至比非熟练模型还差)。
表中只显示了 6 个小区,但如果我们把所有小区都计算在内,并计算它们的加权平均值(权重由每组中的房屋数量决定),我们会发现平均 _R 平方为 -86.7%。
在对单个小区进行评估时,R 平方(45%)尚可的模型怎么会骤降至可怕的 -87%?
这完全说不通。
让我们以单个邻域(如 IDOTRR )为例,来说明发生了什么:
散点图: 每平方英尺价格模型预测(邻近 IDOTRR)。
事实证明,这个社区的房子一般都很便宜(平均 10 万美元,而所有社区的平均价格几乎都是 20 万美元)。
从表面上看,每平方英尺价格模型的表现似乎并不差。事实上,该模型正确地猜测出这些房子并不昂贵(均低于 20 万美元)。
那么,为什么 R-方 如此糟糕(-172%)呢?
不是因为 “每平方英尺价格 ”模型很差,而是因为非熟练模型太好。非熟练模型预测的是目标变量的平均值。由于所有价格都在一个小区间内,非熟练预测接近所有点,因此其 MSE 非常小,是一个非常好的模型。
**非熟练模型如何成为一个非常好的模型?
这是因为,与我们的模型相反,非熟练模型 “知道 ”测试集的平均目标变量。换句话说,测试集中的目标变量向非熟练模型泄漏了一些信息。这意味着不熟练的模型实际上是在作弊!
因此,我们的候选模型与非熟练模型之间的比较是不公平的。我们该如何弥补这一点呢?
走出样本
将一个对测试集价格(每平方英尺价格)一无所知的模型与一个知道测试集平均售价的模型进行比较是不公平的。
为了使比较公平,我们必须使用一个真正不熟练且不作弊的模型,例如一个**总是预测训练集目标值均值的模型。在 Scikit-learn 的行话中,这被称为虚拟回归器。
使用训练集而非测试集目标变量的均值,可以将传统的 R-方 转化为 样本外 R-方 :
R 平方和样本外 R 平方公式。
在 Python 中,oos-R-Squared 可以很容易地计算出来:
def oos_r2_score(y_true, y_pred, y_dummy_pred):
"""Compute out-of-sample R-squared."""
mse_pred = mean_squared_error(y_true, y_pred)
mse_dummy = mean_squared_error(y_true, y_dummy_pred)
oos_r2 = 1 - (mse_pred / mse_dummy)
return oos_r2
让我们来看看将 “每平方英尺价格 ”模型的预测结果与 “Dummy”模型的预测结果进行比较会发生什么。
散点图: 每平方英尺价格模型预测值(邻近 IDOTRR)。Dummy 模型的预测值远高于目标变量的平均值。[图片作者]
现在我们的模型(Price-Per-Square-Foot)和 Dummy 模型打得旗鼓相当。虽然 R-方 非常糟糕(-172%),但 oos-R-Squared 跃升至 61%。
让我们比较一下每个小区的 R-Squared 和 oos-R-Squared:
R-Squared vs. oos-R-Squared on single neighborhoods.
在某些情况下,差异很小(CollgCr、Crawfor_和_Gilbert)。而在其他情况下,差异则很大(BrkSide 和 IDOTRR)。当然,oos-R-Squared 仍然可能是负值(Edwards),因为模型的 MSE 可能高于 Dummy 模型的 MSE。
出于好奇,我们可以用一个更复杂的模型来重复刚才对 Price-Per-Square-Foo 模型所做的工作。
例如,我们可以在数据集的所有特征上训练一个 CatBoost 回归器,然后看看模型在整个测试集和 IDOTRR 邻域上的表现。
正如我们所料,当我们查看整个测试集时,R-Squared 和 oos-R-Squared 实际上是一样的。这是因为训练-测试的拆分是随机进行的,因此 Dummy 模型的预测结果非常接近测试集的平均值。
当我们选择 IDOTRR 邻域时,情况发生了变化。CatBoost 的预测结果非常好,但 R-Squared 会以 77% 的分数(低于模型 85% 的整体表现)来惩罚这种表现。然而,计算 oos-R-Squared 后,模型在该邻域的真正优异表现就显现出来了,得分率高达 97%。
结论
在本文中,我们探讨了 R方 的深层含义,它是在下限和上限之间衡量模型均方误差的一种方法。下限是 0(理论上的完美模型),上限是不熟练的模型在预测目标变量均值时的 MSE。
我们发现这种方法可能会导致不公平的比较,因为在样本外使用时,R-Squared 假设非熟练模型知道测试集中目标变量的均值。这并不是一种公平的比较,可能导致对模型性能过于苛刻的评价。
作为替代方案,我们提出了 oos-R-Squared ,它将模型的 MSE 与假定模型(始终预测训练集中目标变量的均值)的 MSE 进行比较。这种方法可以更准确、更公平地评估模型的性能。

