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

多分类问题场景下如何正确校准模型输出的概率?

多分类模型概率校准方法说明

首先明确:你提到的OneVsRestClassifier(CalibratedClassifierCV(XGBClassifier(objective='multi:softprob'), cv=10))写法是可行的,属于多分类校准的实现方案之一,但不是唯一方案,CalibratedClassifierCV本身原生支持多分类场景,无需额外嵌套OneVsRestClassifier也可正常使用。

主流多分类校准方案

  • 方案1:原生多分类整体校准
    直接将支持多分类输出的基模型传入CalibratedClassifierCV即可,默认会对多分类概率输出做统一校准,适合XGBoost、随机森林这类原生支持多分类的模型。如果像你一样已经拆分了独立的预留验证集,可以设置cv="prefit"直接用预留集校准,不需要重新交叉训练模型,算力损耗更低。
  • 方案2:一对余拆分校准
    即你参考的写法,将每个类别单独作为二分类任务分别校准,再将所有类别校准后的概率做归一化处理,适合不同类别区分度差异较大的场景,但缺点是校准后所有类别概率总和可能不严格为1,需要额外处理。

适配你现有流程的校准代码示例

你已经完成了超参数搜索得到了最优模型fitted_model,可以直接基于预留的验证集做校准,不需要重新训练模型:

from sklearn.calibration import CalibratedClassifierCV

# 参数cv="prefit"表示传入的模型已经完成训练,直接用预留验证集拟合校准器
# 小样本场景选method="sigmoid"(Platt缩放),验证集样本量充足可换method="isotonic"(保序回归)
calibrated_clf = CalibratedClassifierCV(fitted_model, cv="prefit", method="sigmoid")
calibrated_clf.fit(X_validation, y_validation)

# 输出校准后的4类别概率和预测标签
calibrated_proba = calibrated_clf.predict_proba(X_test)
calibrated_labels = calibrated_clf.predict(X_test)

如果你希望把校准环节加入超参数搜索流程,可以直接调整你的模型定义:

models = {
    'xgb': Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('clf', CalibratedClassifierCV(
            XGBClassifier(objective='multi:softprob'),
            cv=3, scoring='accuracy'
        ))
    ]),
    'rf': Pipeline(steps=[
        ('preprocessor', preprocessor),
        ('clf', CalibratedClassifierCV(
            RandomForestClassifier(criterion = 'entropy', random_state = 42),
            cv=3, scoring='accuracy'
        ))
    ])
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:51:02