模型评估指标怎么自定义?用 make_scorer 在交叉验证中核对误差方向

scikit-learn 的交叉验证评分默认遵循“越大越好”。如果业务指标是误差或损失,直接把正的损失函数当评分器会把方向弄反。用 make_scorer(greater_is_better=False) 包装后,可以在交叉验证中核对返回的负分,并在报告时把符号转回正的业务损失。

scikit-learn 的交叉验证评分默认遵循“越大越好”。如果业务指标是误差或损失,直接把正的损失函数当评分器会把方向弄反。用 make_scorer(greater_is_better=False) 包装后,可以在交叉验证中核对返回的负分,并在报告时把符号转回正的业务损失。

准备环境与教学数据

以下代码已在 Windows 的 Python 3.11 独立环境运行。文中数据是人为构造或库自带的教学样本,不代表任何业务系统的效果;例子不调用在线大模型。

模型评估指标怎么自定义?用 make_scorer 在交叉验证中核对误差方向

在空目录安装依赖,把完整代码保存为 demo.py,运行 python demo.py。使用现有 Python 环境时,先核对依赖版本。

python -m pip install numpy==2.4.6 scikit-learn==1.9.1

先用两条手算样本定方向

本文自定义“低估罚3倍、高估罚1倍”的平均绝对损失:真值10、预测8为低估2,罚6;真值10、预测12为高估2,罚2,平均业务损失为4。这个倍数是教学设定,真实场景必须由业务代价和量纲决定。

make_scorer 在 greater_is_better=False 时返回负的损失给搜索与交叉验证,使分数越大越好。程序手算这两条记录并断言为4,再用60条人工回归数据跑3折,打印每折原生负 MAE 和自定义负分。

报告时还原可读的损失

代码把 test_business_score 乘-1,另打印平均正损失;读者看到负分不应误以为模型“有负误差”。使用 GridSearchCV 选模型时也是同样方向:较大的负分代表较低的损失。

自定义评分器只改变选择准则,不改变训练数据或模型优化目标。若业务损失依赖样本金额、分组或阈值,应明确输入与验证方式;不能把任意训练字段偷偷传入测试评分器。

完整可运行代码

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import make_scorer
from sklearn.model_selection import KFold, cross_validate

def asymmetric_mae(truth, prediction):
    error = np.asarray(truth) - np.asarray(prediction)
    penalty = np.where(error > 0, 3 * np.abs(error), np.abs(error))
    return float(np.mean(penalty))

hand = asymmetric_mae([10, 10], [8, 12])
assert np.isclose(hand, 4.0)
print("hand_checked_positive_loss", hand)
scorer = make_scorer(asymmetric_mae, greater_is_better=False)
x = np.arange(60, dtype=float)
X = x.reshape(-1, 1)
y = 5 + 0.4*x + 2*np.sin(x/5)
cv = KFold(n_splits=3, shuffle=True, random_state=21)
result = cross_validate(LinearRegression(), X, y, cv=cv,
                        scoring={"mae": "neg_mean_absolute_error",
                                 "business": scorer})
neg_mae = result["test_mae"]
neg_business = result["test_business"]
assert np.all(neg_mae <= 0) and np.all(neg_business <= 0)
print("fold_negative_mae", np.round(neg_mae, 3).tolist())
print("fold_negative_business", np.round(neg_business, 3).tolist())
print("mean_positive_business_loss",
      round(float(-np.mean(neg_business)), 3))

运行结果与核对

下列是本文代码在上述环境的实际输出。更换运行环境时,先核对输入、代码和断言,再比较输出数值。

hand_checked_positive_loss 4.0
fold_negative_mae [-1.4, -1.159, -1.42]
fold_negative_business [-1.526, -2.497, -3.932]
mean_positive_business_loss 2.652

先核对手算损失为4,再确认两组三折评分均为非正值,mean_positive_business_loss 为取反后的正数。若自定义函数输出的是收益而不是损失,应使用相反的 greater_is_better 设置,先用小样本手算方向再进搜索。

适用边界

三倍惩罚和60条数据均为教学设定,不代表任何行业真实损失。这个评分器不保证模型训练目标与业务损失一致;样本依赖、时间顺序和权重口径仍要另行验证。

常见问题

为什么交叉验证里输出负 MAE?

因为 scikit-learn 评分统一按越大越好选择,损失指标在评分阶段取负。给业务读者报告误差时再取反,并标清单位和计算口径。

参考资料

以下接口行为依据官方文档核对于 2026 年 10 月 1 日;本文的运行结果仅覆盖上述教学输入。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31772.html

赞 (0)
AI小管家的头像AI小管家
回归模型 MAPE 为什么会暴涨?检查零真值并对照 MAE
上一篇 2026年10月1日 下午9:26
AI 音频标注怎么做?用 Label Studio 标记语音片段并导出结果
下一篇 2026年10月1日 下午9:26

相关推荐

  • Claude数学建模如何从问题拆解到模型构建

    Claude数学建模的价值,不是直接生成一组看似完整的公式,而是帮助使用者把自然语言问题转换成可分析、可计算、可验证的结构。面对“如何提高效率”“如何合理分配资源”这类表述,第一步应先明确研究对象、决策目标、可用数据、限制条件和最终评价标准。

    11小时前
    200
  • claude教学:从提问到整理资料的AI使用步骤

    Claude更适合承担需要阅读、比较、归纳和改写的工作。面对一份较长的会议记录、调研材料、项目文档或多轮沟通内容,它可以帮助你提炼主题、识别章节结构、抽取关键事实,并将零散信息重新组织成摘要、提纲、表格或行动清单。它也适合用于邮件改写、报告初稿、问答整理和不同语气之间的转换。

    11小时前
    300
  • claude数学能解决哪些题型?从提问到验算的使用指南

    claude数学更适合被当作一个会解释、会追问、能协助检查的数学助手,而不是只负责吐出最终数字的计算器。它可以帮助用户读懂题意、整理已知条件、选择公式、展示推导步骤,也能根据用户提供的解答寻找计算或逻辑上的漏洞。

    11小时前
    200
  • claude教科书中的AI对话使用场景与操作步骤

    本文把“claude教科书”作为学习AI对话方法的主题表达,不把未提供的书籍章节、作者观点、官方功能或具体版本当作已知事实。真正值得掌握的,不是背下一句所谓万能提示词,而是建立一套可重复的对话流程:先明确目标,再补充背景,随后规定输出方式,最后检查结果。

    11小时前
    200
  • claude数学公式怎么用 从文字描述到规范公式的操作步骤

    使用Claude处理数学公式,关键不是直接输入“帮我写公式”,而是把题意中的变量、条件、运算关系和输出格式交代清楚。自然语言往往省略主语、范围或单位,如果这些信息没有说明,生成结果就可能在符号定义、括号范围或等号两侧的逻辑上出现偏差。

    11小时前
    200
联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部