自动识别任务类型:一维整数y_true且类别≤20→分类;一维浮点y_true与y_pred→回归;二维y_true或概率矩阵y_pred→多标签/多分类;概率未归一化时先softmax/sigmoid校正。

直接用 sklearn.metrics 里的函数拼装就行,不用从头写公式;但关键在于「通用」——得自动适配分类/回归/多标签等任务类型,否则每次换任务都要改逻辑。
怎么让脚本自动识别任务类型并选对指标?
靠目标变量 y_true 的数据形态和 y_pred 的预测形式判断,而不是靠人工传参指定任务类型:
- 如果
y_true是一维整数且取值个数 ≤ 20,y_pred是一维(或概率矩阵的 argmax),默认按 分类 处理 - 如果
y_true是一维浮点数,且y_pred也是一维浮点数,走 回归 路径 - 如果
y_true是二维(如 shape=(n_samples, n_classes))或y_pred是概率矩阵(sum(axis=1) ≈ 1),启用 多标签/多分类 指标 - 遇到
y_pred是概率输出但未归一化,先用softmax或sigmoid校正,再判断;不校正会误判为回归
哪些指标必须包含,哪些可以按需开关?
核心指标要覆盖常见场景,但得允许关闭低信息量项(比如二分类时 f1_macro 和 f1_weighted 重复):
- 分类必开:
accuracy_score、precision_recall_fscore_support(返回 per-class + macro/weighted)、roc_auc_score(仅当有概率输出且为二分类或多标签时计算) - 回归必开:
mean_absolute_error、mean_squared_error(带squared=False输出 RMSE)、r2_score - 可选开关:
classification_report(文本太长,适合调试时开)、confusion_matrix(只在需要可视化时才算,避免内存暴涨) - 注意
log_loss要求输入是概率且严格 > 0 且 eps=1e-15 截断,否则报ValueError: Target is multiclass but average='binary'
怎么安全处理异常预测输出?
真实 pipeline 中 y_pred 可能是 raw logits、nan、inf、维度错位,不能直接喂给 sklearn:
- 用
np.nan_to_num(y_pred, nan=0.0, posinf=1.0, neginf=0.0)清洗 inf/nan - 检查
y_pred.shape == y_true.shape,不等就尝试np.squeeze或 reshape;若仍失败,抛出明确错误:"shape mismatch: y_true has shape {y_true.shape}, y_pred has shape {y_pred.shape}" - 对分类任务,若
y_pred是二维但没归一化,用softmax(y_pred, axis=1)转成概率;别依赖用户自己做这步 - 多标签场景下,
y_pred若是概率,需用threshold=0.5转成 0/1;这个阈值要暴露为参数,默认 0.5,但得提醒用户“该值影响 precision/recall 平衡”
最易被忽略的是指标语义一致性:比如把回归模型的输出强行送进 roc_auc_score,它不会报错,但结果毫无意义。脚本里得在计算前加一层 if not is_classification_task: skip_auc = True 这类守卫逻辑,而不是靠文档提醒。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











