多分类问题场景下如何正确校准模型输出的概率?
多分类模型概率校准方法说明
首先明确:你提到的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
相关产品推荐
相关产品推荐

