【机器学习】决定系数(R²:Coefficient of Determination)

决定系数,也称为 R 平方,是一种用于衡量回归模型预测效果的统计指标。它表示了模型解释目标变量总变异的程度,数值介于 0 和 1 之间,数值越接近 1 表明模型的解释力越强。

1. 的定义和公式

的公式如下:

其中:

  • 是真实值。
  • 是模型的预测值。
  • 是真实值的平均值。
  • 是残差平方和 (Residual Sum of Squares, RSS)。
  • 是总平方和 (Total Sum of Squares, TSS)。

从公式可以看出, 表示残差平方和占总平方和的比例。换句话说, 越接近 1,表示模型的预测越接近真实值,模型解释越充分。

2. 的计算步骤

计算 的步骤如下:

  1. 计算真实值的平均值
  2. 计算残差平方和
  3. 计算总平方和
  4. 计算 ,即使用公式

3. 的解释和意义

  • 解释度 值表示自变量解释因变量变异的比例。例如, 表示模型能解释 80% 的目标变量变异。
  • 值域 的取值范围通常为 [0, 1]。0 表示模型无法解释任何目标变量的变异,1 表示模型可以完全解释目标变量的变异。
  • 负值的情况 :在某些情况下,当模型预测效果极差时(例如,模型欠拟合), 可能为负数。这表示预测值甚至比用平均值预测的效果更差。

4. 的优缺点

优点

  • 直观解释 直接表示了模型对目标变量的解释力。
  • 适用性广:广泛应用于回归模型的效果评价。

缺点

  • 对样本大小敏感 :在小样本数据中, 值容易偏高,可能夸大模型的预测效果。
  • 对异常值敏感 :由于平方的存在, 对异常值敏感,异常值可能会过度影响结果。
  • 无法区分方向性:仅仅反映解释力,不反映模型预测的方向性,容易掩盖预测偏差。

5. 的应用

在回归分析、机器学习和经济学等领域, 是一种常用的评价指标。其应用场景包括:

  • 回归模型效果评价:常用于衡量线性回归、多项式回归等模型的解释力。
  • 经济和金融数据分析:例如评估某些经济指标对 GDP 增长的解释力。
  • 机器学习模型调优:用于评估模型的拟合程度,帮助选择合适的模型或调参。

6. 与其他误差指标的对比

指标 MAE、RMSE
计算方式 残差平方和和总平方和之比 绝对误差或平方误差
值域 [0, 1](可能为负数) 非负值
异常值敏感性 MAE 低,RMSE 高
解释力 表示模型解释的变异比例 表示模型预测误差的均值

7.Python 实现代码

以下是计算 的 Python 代码:

python 复制代码
import numpy as np

def r2_score(y_true, y_pred):
    ss_res = np.sum((y_true - y_pred) ** 2)
    ss_tot = np.sum((y_true - np.mean(y_true)) ** 2)
    return 1 - (ss_res / ss_tot)

# 示例
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])

result = r2_score(y_true, y_pred)
print("R^2:", result)

说明

  1. y_true 是真实值的数组,y_pred 是预测值的数组。
  2. ss_res 是残差平方和,表示误差的总量。
  3. ss_tot 是总平方和,表示目标变量的总变异。
  4. 1 - (ss_res / ss_tot) 得出 值,表示模型对数据变异的解释程度。

图中 的值接近 1 表示模型的预测接近真实值,具有较高的解释力。

8. 图解示例

下面将生成一个包含 计算图解的图示,以便更清楚地理解 在模型解释力上的作用。

上图展示了 的计算过程,其中:

  • 蓝色圆点连线表示真实值
  • 红色叉点连线表示模型的预测值
  • 每条灰色虚线表示预测值与真实值之间的差距,即残差。
python 复制代码
# Re-import necessary libraries due to session context reset
import numpy as np
import matplotlib.pyplot as plt

# Generate sample data for illustration
np.random.seed(0)
x = np.linspace(0, 10, 10)
y_true = 2 * x + 1                       # True relationship (e.g., ground truth values)
y_pred = y_true + np.random.normal(0, 2, 10) # Predicted values with random noise

# Calculate R^2
ss_res = np.sum((y_true - y_pred) ** 2)   # Residual sum of squares
ss_tot = np.sum((y_true - np.mean(y_true)) ** 2) # Total sum of squares
r2_value = 1 - (ss_res / ss_tot)

# Plotting true vs predicted values and lines indicating residuals
plt.figure(figsize=(10, 6))
plt.plot(x, y_true, label="True Values", color="blue", marker='o')
plt.plot(x, y_pred, label="Predicted Values", color="red", marker='x')
plt.hlines(np.mean(y_true), x[0], x[-1], colors='green', linestyles='dashed', label='Mean of True Values')

# Add residual lines
for i in range(len(x)):
    plt.plot([x[i], x[i]], [y_true[i], y_pred[i]], color='gray', linestyle='dotted')

# Adding text and labels
plt.xlabel("x")
plt.ylabel("y")
plt.title(f"Illustration of R² (Coefficient of Determination)\nR² = {r2_value:.2f}")
plt.legend()
plt.grid(True)
plt.show()

为了更直观地理解 ,我们可以用一个散点图展示真实值和预测值的分布:

  1. 绘制真实值与预测值的散点图:展示所有数据点的真实值与预测值之间的差异。
  2. 展示总平方和 (TSS):每个数据点到真实值均值的垂直线表示目标变量的总变异。
  3. 展示残差平方和 (RSS):每个数据点到预测值的垂直线表示模型预测误差。
  4. 理解解释力 :图中 值越大,模型预测值越接近真实值,即解释力越高。
相关推荐
深度学习lover1 小时前
[项目代码] YOLOv8 遥感航拍飞机和船舶识别 [目标检测]
python·yolo·目标检测·计算机视觉·遥感航拍飞机和船舶识别
云起无垠1 小时前
【论文速读】| FirmRCA:面向 ARM 嵌入式固件的后模糊测试分析,并实现高效的基于事件的故障定位
人工智能·自动化
水木流年追梦1 小时前
【python因果库实战10】为何需要因果分析
开发语言·python
m0_675988232 小时前
Leetcode2545:根据第 K 场考试的分数排序
python·算法·leetcode
Leweslyh3 小时前
物理信息神经网络(PINN)八课时教案
人工智能·深度学习·神经网络·物理信息神经网络
love you joyfully4 小时前
目标检测与R-CNN——pytorch与paddle实现目标检测与R-CNN
人工智能·pytorch·目标检测·cnn·paddle
该醒醒了~4 小时前
PaddlePaddle推理模型利用Paddle2ONNX转换成onnx模型
人工智能·paddlepaddle
小树苗1934 小时前
DePIN潜力项目Spheron解读:激活闲置硬件,赋能Web3与AI
人工智能·web3
凡人的AI工具箱4 小时前
每天40分玩转Django:Django测试
数据库·人工智能·后端·python·django·sqlite
qyq14 小时前
Django框架与ORM框架
后端·python·django