You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多分类场景下如何将Pipeline与cross_val_score结合使用

问题解答

一、多分类场景仅用准确率评估的局限性

  • 当数据集存在类别不均衡时,准确率会被多数类主导,无法真实反映模型对少数类的识别效果。比如某类样本占比90%,模型全部预测为该类就能得到90%的准确率,但实际没有有效分类能力。
  • 准确率无法体现模型的错分代价,比如业务中某类主题分类错误的影响远大于其他类时,准确率完全无法衡量这类风险。
    绝大多数多分类场景都不建议仅用准确率做评估。

二、cross_val_score自定义评估指标的方法

cross_val_score的scoring参数可以直接指定其他评估指标,多分类场景需要搭配对应的平均策略:
常用的内置多分类评估指标字符串:

  • 加权F1:f1_weighted 按各类别样本量加权计算F1,适合类别不均衡场景
  • 宏F1:f1_macro 所有类别F1取算术平均,对小类别表现更敏感
  • 加权精准率/召回率:precision_weighted、recall_weighted
  • 多分类AUC:roc_auc_ovr(一对余模式)、roc_auc_ovo(一对一模式)

同时注意多分类交叉验证建议用StratifiedKFold替代普通KFold,保证每折的类别分布和原数据集一致,避免抽样偏差。
示例代码:

from sklearn.model_selection import StratifiedKFold, cross_val_score

# 用分层5折交叉验证,开启shuffle保证数据打乱
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
# 计算加权F1的交叉验证得分
scores = cross_val_score(pipe, X_train, y_train, cv=cv, scoring='f1_weighted')

# 输出交叉验证结果:均值±标准差,体现模型平均效果和稳定性
print(f"5折交叉验证加权F1:{scores.mean():.3f} ± {scores.std():.3f}")

三、一次返回多个评估指标

如果需要同时看多个指标的交叉验证结果,可以用cross_validate替代cross_val_score,支持传入多个评估指标:
示例代码:

from sklearn.model_selection import cross_validate

# 定义要计算的多个指标
scoring = [
    'accuracy',
    'f1_weighted',
    'precision_weighted',
    'recall_weighted'
]

# 交叉验证返回多个指标结果
results = cross_validate(pipe, X_train, y_train, cv=cv, scoring=scoring)

# 打印各指标的交叉验证结果
for metric in scoring:
    mean_score = results[f'test_{metric}'].mean()
    std_score = results[f'test_{metric}'].std()
    print(f"{metric}: {mean_score:.3f} ± {std_score:.3f}")

四、注意事项

你当前将整个Pipeline传入交叉验证的用法是正确的,不会出现数据泄露问题:每一轮交叉验证的训练集都会独立执行文本向量化、特征选择、模型训练的全流程,不会用到对应验证集的任何信息,评估结果更可信。

内容的提问来源于stack exchange,提问作者Yuxxxxxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:45:02