回归模型预测的是数值,不能用分类准确率评价。MAE 表示平均绝对误差,RMSE 对较大的误差更敏感;把它们和逐条残差表一起看,才能发现平均指标背后是哪几个样本出了问题。本文用已经对齐的真值与预测演示评估,不重新训练模型。
先保证真值和预测一一对应
示例核对环境为 Python 3.11、scikit-learn 1.9.1、NumPy 2.4.6;涉及表格的代码还使用 pandas 3.0.6。资料核对日期为 2026 年 10 月 1 日。代码在 CPU 上运行,不需要账号、API 密钥或下载预训练权重。

下面五条真值和预测是人为设定的算例,不是任何生产模型的效果。所有数值先按同一个单位理解,比如“件”;每条样本都有稳定的 sample_id。正式使用时应根据编号合并预测和真值,不能只把两个来源按当前行序拼接。
这里约定 residual = prediction – truth,因此正残差是高估,负残差是低估。官方回归指标说明给出了 MAE、RMSE 和中位绝对误差的定义。MAE 与 RMSE 的单位和目标相同;MSE 的单位是目标单位的平方,不要把三者混成“百分比误差”。
运行指标计算并导出残差表
python -m venv .venv
# Windows PowerShell 中使用这个环境的解释器:
.\.venv\Scripts\python.exe -m pip install scikit-learn==1.9.1 numpy==2.4.6 pandas==3.0.6
.\.venv\Scripts\python.exe demo.py
把下方完整 Python 代码保存为 demo.py,再运行最后一条命令。macOS/Linux 使用 .venv/bin/python 代替 Windows 路径。安装需要网络;完成安装后,这些示例的数据在代码中生成,可离线运行。使用其他版本时先打印 sklearn.__version__,不要把两个环境的报错混在一起排查。
将已核对的数据换入 report 的三列,保留唯一编号和有限数检查,再运行以下完整脚本。它按绝对误差排序,并在当前运行目录导出 regression_residuals.csv。
import numpy as np
import pandas as pd
from sklearn.metrics import mean_absolute_error, root_mean_squared_error, median_absolute_error
report = pd.DataFrame({"sample_id": ["A01", "A02", "A03", "A04", "A05"],
"truth": [10., 20., 30., 40., 50.],
"prediction": [12., 19., 29., 41., 80.]})
if report.empty or report["sample_id"].duplicated().any():
raise ValueError("样本编号必须唯一且非空")
if not np.isfinite(report[["truth", "prediction"]].to_numpy()).all():
raise ValueError("真值和预测必须为有限数")
report["residual"] = report["prediction"] - report["truth"]
report["absolute_error"] = report["residual"].abs()
y, pred = report["truth"], report["prediction"]
print("MAE", mean_absolute_error(y, pred))
print("RMSE", round(root_mean_squared_error(y, pred), 6))
print("MedianAE", median_absolute_error(y, pred))
print(report.sort_values("absolute_error", ascending=False).to_string(index=False))
report.to_csv("regression_residuals.csv", index=False, encoding="utf-8-sig")
assert mean_absolute_error(y, pred) == 7
assert report.loc[report["absolute_error"].idxmax(), "sample_id"] == "A05"
用手算检查平均指标为什么不同
MAE 7.0
RMSE 13.468482
MedianAE 1.0
sample_id truth prediction residual absolute_error
A05 50.0 80.0 30.0 30.0
A01 10.0 12.0 2.0 2.0
A02 20.0 19.0 -1.0 1.0
A03 30.0 29.0 -1.0 1.0
A04 40.0 41.0 1.0 1.0
五条绝对误差为 2、1、1、1、30,因此 MAE 为 7。RMSE 是这些误差平方取均值后开方,约为 13.468482;中位绝对误差为 1。A05 的误差 30 明显推高了 RMSE,但另外四条很接近真值。只报中位数会掩盖 A05,只有 RMSE 又不显示高估还是低估。
核验方法是打开导出的 CSV,确认有五条唯一编号,A05 排在误差清单首位,且 residual 为 30。先回查 A05 的原始输入、真值来源和单位,判断是模型错误、录入问题还是数据来源变化。不能仅因它误差大就删掉,再把删后的分数称为原测试集成绩。
根据实际决策选择评估规则
- 关心一般偏差:查看 MAE,并按业务来源分组检查是否一致。
- 大误差尤其昂贵:同时查看 RMSE、最大误差及失败样本,事先定义检查规则。
- 高估与低估代价不同:残差表保留方向,另按业务定义成本函数;MAE 本身不会区别两种方向。
- 多种目标单位不同:先分别评估每个目标,不能直接拿两个 RMSE 数值排名。
这五条算例只用于验证代码和指标含义,不能用于推断误差分布、稳定性或未来风险。真实评估应留出符合时间和样本关系的测试集,核对标签成熟时间及缺失真值,并和事先选定的简单预测基线对照。
常见报错怎么处理
若找不到 root_mean_squared_error,先检查 scikit-learn 版本;上例按 1.9.1 接口运行。若编号重复,先确定一条样本为何产生多份预测;若有 NaN 或无穷值,保存异常记录并解决真值或预测生成过程。不要悄悄把异常替换成零,这会改变指标含义。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30575.html