回归模型输出连续数值,例如房价、温度、销量和交付时间。分类中的“预测对或错”不再适用,我们需要衡量预测值与真实值之间相差多少,以及误差是否存在系统性偏向。
一个模型平均误差很小,并不代表所有样本都预测得好;同样,一个模型的 R² 较高,也不代表它满足业务对最大误差的要求。
设真实值为 ,预测值为 ,样本数为 。
MAE 的单位与目标变量相同,直观表示“平均差多少”。它对异常值相对不敏感,适合需要稳定平均误差的场景。
MSE 会放大较大的错误。如果业务特别不能接受少数极端偏差,MSE 很有用;但它的单位是目标单位的平方,解释性不如 MAE 直观。
RMSE 与目标变量使用相同单位,同时保留了对大误差的惩罚。需要注意,RMSE 仍然会被少数异常值明显影响。
R² 衡量模型相对于“永远预测均值”的改进程度。R² 越接近 1 通常越好,但在测试集上出现负数并不矛盾,它表示模型还不如均值基线。
| 业务关注点 | 推荐指标 |
|---|---|
| 平均误差是否容易解释 | MAE |
| 极端大误差必须被重罚 | MSE 或 RMSE |
| 需要与目标单位保持一致 | MAE 或 RMSE |
| 与均值基线比较解释力 | R² |
| 异常值很多 | MAE,并单独分析异常样本 |
| 需要满足误差上限 | MAE + 最大误差分位数 |
不要把 R² 当成唯一指标。最好同时报告 MAE、RMSE 和 R²,并结合业务单位解释。
残差定义为:
观察残差时,可以检查:
如果残差呈现明显结构,说明模型还没有学到数据中的规律。
学习曲线比较不同训练样本量下的训练分数和验证分数,常用于判断继续收集数据是否有帮助:
from sklearn.model_selection import KFold, cross_validate
from sklearn.linear_model import Ridge
cv = KFold(n_splits=5, shuffle=True, random_state=42)
result = cross_validate(
Ridge(alpha=1.0),
X, y,
cv=cv,
scoring=["neg_mean_absolute_error", "neg_root_mean_squared_error", "r2"]
)
mae = -result["test_neg_mean_absolute_error"]
rmse = -result["test_neg_root_mean_squared_error"]
print(f"MAE: {mae.mean():.2f} +/- {mae.std():.2f}")
print(f"RMSE: {rmse.mean():.2f} +/- {rmse.std():.2f}")
print(f"R2: {result['test_r2'].mean():.3f}")
Scikit-Learn 中以 neg_ 开头的损失指标是为了遵循“分数越大越好”的统一接口,因此取负号后才是通常意义上的 MAE 或 RMSE。
共 2 道精选测试题 · 答题进度已自动保存
完成本模块后,可以进入无监督学习,学习没有标签时如何通过聚类和降维发现数据结构。