R² 决定系数详解:原理 + Python手写实现 + 数学公式 + 与 MSE/MAE 比较
在回归任务中,评估模型好坏的指标有很多,除了常见的 MAE(平均绝对误差)、MSE(均方误差)、RMSE(均方根误差)之外,R²(决定系数) 也是非常常见且直观的重要指标。
✅ 一、什么是 R²?
R²,又叫 决定系数(coefficient of determination),是衡量模型拟合优度的一个指标。通俗来讲,R² 表示模型解释了多少比例的目标变量方差:
R² 越接近 1,说明模型越好;
R² 等于 0,说明模型还不如直接用均值来预测;
R² 小于 0,表示模型效果很差,比“瞎猜”还糟糕。
🧠 二、R² 的数学公式
我们先来看它的数学定义:
其中:
:决定系数,衡量模型解释方差的能力
:第 i 个样本的真实值
:第 i 个样本的预测值
:真实值的均值
:残差平方和(Residual Sum of Squares),衡量预测误差
:总变差(Total Sum of Squares),衡量总波动
💻 三、Python手动实现 R²(不使用sklearn)
def r2_score_manual(y_true, y_pred):mean_y = sum(y_true) / len(y_true)ss_tot = sum((yt - mean_y) ** 2 for yt in y_true)ss_res = sum((yt - yp) ** 2 for yt, yp in zip(y_true, y_pred))return 1 - ss_res / ss_tot# 示例
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]print("R² score:", r2_score_manual(y_true, y_pred)) # 输出接近 0.948
🔍 四、R² 与 MAE、MSE、RMSE 的区别和联系
指标 | 含义 | 单位 | 对异常值敏感 | 解释性 |
---|---|---|---|---|
MAE | 平均绝对误差 | 是 | 较低 | 每个误差权重相同 |
MSE | 平均平方误差 | 是(平方单位) | 高 | 放大大误差 |
RMSE | 均方根误差(MSE 开根号) | 是 | 高 | 与原始单位一致 |
R² | 决定系数,模型拟合优度 | 无单位 | 较敏感 | 衡量解释能力强弱 |
✅ MAE:稳健,不惩罚大误差;
✅ MSE/RMSE:适合注重大误差的场景,如金融风险;
✅ R²:衡量模型“解释了多少方差”,是一个更宏观的评估标准。
🧩 五、总结
R² 是一个 相对指标,并非误差的绝对值,而是比较预测值与均值的差距;
在多个模型之间进行对比时,R² 是一个很直观的参考;
若配合 MAE / RMSE 使用,可以获得更全面的模型评估视角。