33·监督学习-回归入门

回归评估指标:MSE、RMSE、MAE 与 R2

evaluationmetrics

好的,资深编程讲师,为您呈上第33课的完整内容。

第33课 - 回归评估指标:MSE、RMSE、MAE 与 R2

课程:机器学习:从入门到实战 当前课:第 33 课 - 回归评估指标:MSE、RMSE、MAE 与 R2 所属模块:监督学习-回归 难度:beginner 标签:evaluation, metrics 上一课:正则化:Ridge、Lasso 与 ElasticNet 下一课:交叉验证:K-Fold 与分层采样


1. 学习目标

学完本课,你将能够:

  • 理解并区分MSE、RMSE、MAE和R2这四种常用回归评估指标的含义。
  • 掌握使用sklearn.metrics计算这四种指标的方法。
  • 了解不同评估指标在解释模型误差和性能方面的优势与局限。
  • 能够根据具体任务选择合适的评估指标来评判模型。

2. 核心概念

训练好一个回归模型(如预测房价、销量)后,我们最关心的问题是:“这个模型到底准不准?”。这就需要评估指标来给我们一个量化的答案。

想象一下,我们在用模型预测一组房子的价格。真实价格是我们已知的答案,预测价格是模型给出的结果。评估指标就是用来衡量这两者之间差异的“尺子”。

  • 误差(Error)误差 = 真实价格 - 预测价格。这个差值可正可负,代表预测是高了还是低了。
  • 绝对误差(Absolute Error)|误差|,即误差的绝对值。我们只关心错了多少,不管错的方向。
  • 平方误差(Squared Error)误差²。平方会放大较大的误差,让模型对“离谱”的预测更敏感。

基于这三种基础概念,衍生出了我们的“四大金刚”指标:

① MAE(平均绝对误差)

  • 通俗解释:平均来说,我们的预测偏离了真实值多少。它的单位和原始数据一致,非常直观。例如,MAE=2万元,表示模型平均少预测或高预测了2万元。
  • 公式MAE = (1/n) * Σ|真实值_i - 预测值_i|
  • 特点:对所有误差一视同仁,对异常值(Outliers)不太敏感。

② MSE(均方误差)

  • 通俗解释:平均来说,我们预测误差的平方是多少。因为平方,它会放大较大误差的影响。
  • 公式MSE = (1/n) * Σ(真实值_i - 预测值_i)²
  • 特点:对大的误差惩罚更重。值的大小难以直观解释(单位是原始数据的平方)。

③ RMSE(均方根误差)

  • 通俗解释:这是MSE的“修正版”。先对MSE开根号,让指标的单位回到和原始数据一致,同时保留了MSE对较大误差敏感的特性。这是最常用的指标之一。
  • 公式RMSE = √(MSE)
  • 特点:单位与原数据一致,比MSE更易解释,对异常值敏感。

④ R²(决定系数)

  • 通俗解释:这是一个“评分”,表示我们的模型解释了多少目标变量的波动。可以理解为:R² = 1 - (模型无法解释的变异 / 总变异)
  • 取值范围:通常在0到1之间。1代表完美拟合,0代表模型不如直接用均值预测,负数代表模型非常糟糕。
  • 特点:是一个相对指标,可以直观判断模型相对于“基准模型”(总是预测均值)的提升程度。

3. 代码示例

我们将使用经典的波士顿房价数据集,训练一个简单的线性回归模型,并计算全部四个评估指标。

# 导入必要的库
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import matplotlib.pyplot as plt

# 1. 加载数据并拆分
# 注意:load_boston在新版sklearn中已移除,这里使用一个替代方法
# 如果你的环境支持load_boston,可以直接使用。否则请使用下面的方法。
# data = load_boston()
# X, y = data.data, data.target

# 替代加载方式(使用fetch_openml)
from sklearn.datasets import fetch_openml
boston = fetch_openml(name='boston', version=1, as_frame=True)
X = boston.data.values
y = boston.target.values.astype(np.float64)

# 拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 2. 训练一个线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 3. 在测试集上进行预测
y_pred = model.predict(X_test)

# 4. 计算评估指标
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)  # 手动计算RMSE
r2 = r2_score(y_test, y_pred)

# 打印结果
print(f"平均绝对误差 (MAE): {mae:.4f}")
print(f"均方误差 (MSE): {mse:.4f}")
print(f"均方根误差 (RMSE): {rmse:.4f}")
print(f"决定系数 (R²): {r2:.4f}")

# 5. 可视化:真实值 vs 预测值
plt.figure(figsize=(8, 6))
plt.scatter(y_test, y_pred, alpha=0.6)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', lw=2) # 理想预测线
plt.xlabel('真实房价')
plt.ylabel('预测房价')
plt.title('真实房价 vs 模型预测房价')
plt.grid(True)
plt.show()

# 6. 可视化残差(误差)
residuals = y_test - y_pred
plt.figure(figsize=(8, 6))
plt.scatter(y_pred, residuals, alpha=0.6)
plt.hlines(y=0, xmin=y_pred.min(), xmax=y_pred.max(), colors='r', linestyles='--')
plt.xlabel('预测房价')
plt.ylabel('残差 (真实值 - 预测值)')
plt.title('残差分布图')
plt.grid(True)
plt.show()

输出示例(你的结果可能因数据拆分略有不同):

平均绝对误差 (MAE): 3.4271
均方误差 (MSE): 24.2911
均方根误差 (RMSE): 4.9286
决定系数 (R²): 0.6688

解释:R²约为0.67,说明我们的线性模型解释了大约67%的房价变异。RMSE约为4.93,意味着平均预测误差在5个单位(房价单位)左右。

4. 实践练习

练习1:指标计算入门 给定一个简单的测试集,包含3个样本的真实值和模型预测值。请手动计算MAE和MSE,并与sklearn函数的结果对比。

  • 真实值 [10, 20, 30]
  • 预测值 [12, 18, 33]
  • 预期输出MAE=2.0, MSE=5.6667 (保留四位小数)

练习2:模型对比 你有两个模型A和B,它们在相同测试集上的评估指标如下:

  • 模型A: MAE=5.2, RMSE=8.1, R²=0.75
  • 模型B: MAE=6.0, RMSE=7.5, R²=0.78

请分析:哪个模型的平均误差更小?哪个模型对异常值更敏感?哪个模型的整体解释力更强?你认为哪个模型更好?为什么?

练习3:理解R² 假设我们有一个数据集,其中目标变量(真实值)的方差(Variance)为 100。一个模型的MSE(测试集)为 25。请计算这个模型的R²分数,并解释这个分数的含义。

5. 常见错误

  1. 混淆MSE和RMSE的单位:MSE的单位是原始数据的平方(如“万元²”),很难直接解释。通常报告RMSE更好,因为它和原始数据单位一致。
  2. 只看R²,忽略绝对误差:R²是一个相对指标。两个模型R²相同,但RMSE可能差异很大。应结合RMSE/MAE等绝对指标一起看。
  3. 不考虑数据分布:如果数据中有非常大的异常值(Outliers),MSE和RMSE会被严重拉高。此时,MAE可能是更稳健的评估指标。
  4. 在训练集上评估:这是最严重的错误!评估必须在未见过的测试集上进行,否则结果(尤其是R²)会过于乐观,无法反映模型泛化能力。
  5. 忽略业务背景:在某些业务中,误差的方向(高估 vs 低估)成本不同。例如,预测火灾风险时,高估(虚报)和低估(漏报)的代价完全不同,此时单纯的MAE可能不够,需要设计更定制的损失函数。

6. 小结

本课我们学习了评估回归模型的四大核心指标:

  • MAE:平均绝对误差,直观,对异常值不敏感。
  • MSE:均方误差,放大大误差的影响。
  • RMSE:均方根误差,最常用,单位直观,对异常值敏感。
  • :决定系数,表示模型解释了多少数据变异,是相对评分。

选择建议

  • 需要直观的误差量级时,看 RMSEMAE
  • 需要比较模型相对于“基准”的整体提升时,看
  • 数据中异常值多,且你不希望它们主导评估时,MAE 可能比 RMSE 更合适。
  • 永远在测试集上计算这些指标。

理解并熟练运用这些指标,是判断和优化回归模型的第一步。在下一课中,我们将学习如何使用交叉验证来更可靠地评估模型性能。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「交叉验证:K-Fold 与分层采样」 以巩固所学知识。