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

使用sklearn的OneVsOneClassifier如何获取类别概率估计?

解决OneVsOneClassifier无法输出类别概率的问题

方法一:改用OneVsRestClassifier(最简单方案)

如果业务场景允许替换多分类策略,OneVsRestClassifier原生支持predict_proba,只需替换原代码中的多分类器即可:

smt = SMOTE(random_state=42)
base_model = LogisticRegression()
pipeline = Pipeline([('sampler', smt), ('model', base_model)])

classifier = OneVsRestClassifier(estimator=pipeline)
classifier.fit(X_train, y_train)
yhat_prob = classifier.predict_proba(X_test)

OneVsRest会为每个类别训练独立的二分类模型,最终将所有模型的概率输出按类别聚合,得到每个样本属于各类别的概率值。

方法二:手动实现OneVsOne的概率聚合

如果必须保留OneVsOneClassifier,可以通过遍历其内部训练好的二分类器,收集每个类别在对应子模型中的概率后进行归一化处理:

import numpy as np

def ovo_predict_proba(ovo_classifier, X):
    n_samples = X.shape[0]
    n_classes = len(ovo_classifier.classes_)
    prob_scores = np.zeros((n_samples, n_classes))
    
    # 遍历每个二分类器及其对应的类别对
    for estimator, (class_idx_a, class_idx_b) in zip(ovo_classifier.estimators_, ovo_classifier.pair_indices_):
        # 获取当前二分类器的概率输出
        class_probs = estimator.predict_proba(X)
        # 将概率累加到对应类别的总分数中
        prob_scores[:, class_idx_a] += class_probs[:, 0]
        prob_scores[:, class_idx_b] += class_probs[:, 1]
    
    # 归一化,确保每个样本的概率和为1
    prob_scores = prob_scores / prob_scores.sum(axis=1, keepdims=True)
    return prob_scores

# 使用示例
yhat_prob = ovo_predict_proba(classifier, X_test)

关键说明:

  • OneVsOneClassifier训练完成后,会生成estimators_(所有二分类器实例)和pair_indices_(每个分类器对应的两个类别索引),这两个属性是手动聚合概率的核心依据。
  • 上述代码采用概率累加后归一化的策略,也可以根据需求调整为其他聚合逻辑(比如结合投票权重的概率计算)。
  • 需确保Pipeline中的基础模型(如示例中的LogisticRegression)支持predict_proba方法,否则该方案无法生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:18:24