4. 回归模型评估:MSE、RMSE、MAE、R-squared、调整R-squared详解
回归任务是监督学习中最常见的任务之一,其核心目标是预测连续型数值。评估一个回归模型的好坏,不能仅凭直觉,必须依赖一套严谨的量化指标。本章将深入剖析回归模型评估中最核心的五个指标:MSE、RMSE、MAE、R-squared 和 调整 R-squared,帮助你理解它们的数学原理、适用场景以及如何在实际 A/B 测试中正确使用。
4.1 核心概念:残差与误差
在深入指标之前,我们需要明确一个基础概念:残差。对于第 \( i \) 个样本,其真实值为 \( y_i \),模型预测值为 \( \hat{y}_i \),则残差 \( e_i = y_i - \hat{y}_i \)。所有评估指标本质上都是对残差的不同数学变换与聚合。
4.2 五大核心指标详解
下表从数学公式、量纲、对异常值的敏感度以及核心应用场景四个维度,对五个指标进行横向对比。
| 指标 | 公式 | 量纲 | 异常值敏感度 | 核心应用场景 |
|---|---|---|---|---|
| MSE | \( \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 \) | 目标变量的平方 | 极高(平方放大) | 梯度下降优化、理论分析 |
| RMSE | \( \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2} \) | 与目标变量一致 | 高 | 业务可解释性、默认首选 |
| MAE | \( \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i| \) | 与目标变量一致 | 低(线性惩罚) | 异常值较多、稳健评估 |
| R-squared | \( 1 - \frac{SS_{res}}{SS_{tot}} \) | 无量纲(0~1) | 受异常值影响 | 模型解释力、相对比较 |
| 调整 R-squared | \( 1 - \frac{SS_{res}/(n-p-1)}{SS_{tot}/(n-1)} \) | 无量纲(0~1) | 受异常值影响 | 特征选择、防止过拟合 |
4.3 指标深度解读
4.3.1 MSE(均方误差)与 RMSE(均方根误差)
MSE 是回归任务中最常用的损失函数。由于对误差进行了平方,它会对较大的误差给予不成比例的惩罚。这使得 MSE 在优化过程中非常有效,但也导致它对异常值极其敏感。
RMSE 是 MSE 的平方根,它将量纲还原到与原始目标变量相同的单位,因此具有更好的业务可解释性。例如,预测房价时,RMSE 的单位是“元”,而 MSE 的单位是“元的平方”,后者难以直观理解。
4.3.2 MAE(平均绝对误差)
MAE 计算的是预测值与真实值之间绝对差值的平均值。由于没有平方操作,它对异常值的惩罚是线性的,因此比 RMSE 更加稳健。当数据中存在较多噪声或异常值时,MAE 能更真实地反映模型的“典型”表现。
然而,MAE 的导数不连续(在 0 点不可导),这导致它在基于梯度的优化算法中不如 MSE 方便。
4.3.3 R-squared(决定系数)
R-squared 衡量的是模型对目标变量方差的解释比例。其核心思想是比较“模型预测的残差平方和(\( SS_{res} \))”与“使用均值预测的残差平方和(\( SS_{tot} \))”。
- \( R^2 = 1 \):完美拟合,模型解释了所有方差。
- \( R^2 = 0 \):模型效果等同于直接使用均值预测。
- \( R^2 < 0 \):模型比使用均值预测更差,通常意味着模型严重欠拟合或数据变换错误。
4.3.4 调整 R-squared(修正决定系数)
为了解决 R-squared 的上述缺陷,调整 R-squared 引入了对特征数量的惩罚项。公式中的 \( p \) 是特征数量,\( n \) 是样本数量。当加入一个无用的特征时,\( SS_{res} \) 的减少幅度不足以抵消惩罚项,调整 R-squared 会下降。
这使得调整 R-squared 成为特征选择和模型比较中更可靠的指标,尤其是在多元线性回归中。
4.4 指标选择与关系图谱
下面的 SVG 图展示了五个指标之间的逻辑关系与选择路径,帮助你根据实际场景快速决策。
4.5 实战代码示例
以下 Python 代码展示了如何使用 scikit-learn 计算上述五个指标,并对比不同模型的表现。
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 生成示例数据
np.random.seed(42)
X = np.random.rand(100, 3)
y = 2 * X[:, 0] + 3 * X[:, 1] - 1.5 * X[:, 2] + np.random.randn(100) * 0.5
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
# 计算指标
n = len(y_test)
p = X_test.shape[1]
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
# 手动计算调整 R-squared
adj_r2 = 1 - ( (1 - r2) * (n - 1) ) / (n - p - 1)
print(f"MSE: {mse:.4f}")
print(f"RMSE: {rmse:.4f}")
print(f"MAE: {mae:.4f}")
print(f"R-squared: {r2:.4f}")
print(f"Adjusted R-squared: {adj_r2:.4f}")
4.6 在 A/B 测试中的实践要点
在 A/B 测试中,回归模型通常用于预测用户行为(如转化率、收入)或作为 CUPED(方差缩减)的辅助模型。评估这些模型时,需注意以下几点:
- 业务对齐: 优先选择与业务指标量纲一致的指标(RMSE 或 MAE),便于向非技术团队解释。
- 异常值处理: 如果业务指标存在极端值(如高额消费用户),建议以 MAE 为主要评估指标,避免单个异常值主导模型效果判断。
- 模型复杂度控制: 在比较不同特征数量的模型时,必须使用调整 R-squared,而非普通 R-squared,以防止过拟合。
- 多指标综合判断: 不要依赖单一指标。例如,一个模型可能有很高的 R-squared,但 RMSE 仍然很大,说明模型虽然解释了大部分方差,但绝对误差仍然不可接受。