应使用mean_absolute_error和mean_squared_error计算回归误差,而非score()(返回R²);MAE单位与目标一致且鲁棒,MSE默认返回均方误差(非RMSE),新版本可通过squared=False直接得RMSE;注意输入为一维、多输出需设multioutput参数。

用 mean_absolute_error 和 mean_squared_error 算回归误差,别直接用 score()
回归模型的 score() 方法返回的是 R²,不是 MAE 或 MSE —— 这是新手最常误以为“准确率”的地方。R² 接近 1 表示拟合好,但数值本身不具直观误差意义;MAE 和 MSE 才是你真正能说“平均预测偏差不到 2.3 个单位”的指标。
实操建议:
-
mean_absolute_error(y_true, y_pred)返回标量,单位与目标变量一致,对异常值鲁棒 -
mean_squared_error(y_true, y_pred)默认返回 MSE(非 RMSE),想看均方根误差得手动开方:np.sqrt(mean_squared_error(...)) - 两个函数都要求
y_true和y_pred是一维数组或列向量,形状不匹配会报ValueError: Found array with dim 2. Expected 1 - 如果模型输出是二维(比如
shape=(n_samples, 1)),先用y_pred.ravel()或y_pred.flatten()降维
sklearn 0.22+ 版本里 squared 参数控制 MSE/RMSE
老版本 mean_squared_error 只返回 MSE,新版本加了 squared 参数:设为 False 直接得 RMSE,省去手写 np.sqrt() 的步骤。但要注意默认仍是 squared=True,也就是返回 MSE。
常见错误现象:
立即学习“Python免费学习笔记(深入)”;
- 升级 sklearn 后发现 RMSE 结果变大了——其实是之前一直算的是 MSE,现在没改参数却误当 RMSE 解读
- 代码里写了
mean_squared_error(..., squared=False),但在旧环境(如 sklearn 0.21)运行会报TypeError: mean_squared_error() got an unexpected keyword argument 'squared' - 参数名不能拼错,
squred或square都会触发 KeyError
MAE/MSE 对异常值敏感度不同,选哪个得看业务场景
MAE 把每个误差绝对值相加再平均,单个离群点只贡献它自己的偏差;MSE 对大误差平方放大,一个误差从 2 变成 4,MAE 增加 2,MSE 却增加 12(16−4)。所以 MSE 更“惩罚”严重错误。
使用场景判断:
- 预测房价时,一个样本差了 50 万比十个样本各差 5 万更危险 → 优先看 MSE
- 预测用户次日留存率(0~1 范围),误差天然受限,且业务更关心“平均偏多少”,MAE 更易解释
- 模型上线前做误差分布分析:用
np.abs(y_true - y_pred)得到每个样本 MAE 分量,画直方图看是否集中在 0.05 以内
别漏掉 multioutput 参数,多输出回归容易报错
如果你的模型预测多个目标(比如同时预测温度、湿度、气压),y_true 和 y_pred 是二维的(shape=(n_samples, n_outputs)),默认会报 ValueError: Mean Absolute Error is not defined for multivariate outputs。
解决办法只有显式指定 multioutput:
-
multioutput='raw_values':返回每个输出的独立 MAE/MSE,长度为n_outputs的数组 -
multioutput='uniform_average'(默认):对各输出的误差取算术平均 -
multioutput='variance_weighted':按各输出的方差加权平均(适合各目标量纲差异大时) - 若用
'raw_values',记得检查返回值类型——它不再是标量,而是ndarray,后续除法或比较要小心
模型输出维度、sklearn 版本、异常值容忍度、多目标处理——这四个点任何一个没对齐,MAE/MSE 就会算错或报错,而且错误信息往往不直接指向根源。


















