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

如何用Python获取One-vs-Rest SVC模型参数并实现OVR分类?

如何实现真正的SVM一对多(OVR)分类并获取模型属性

一、获取真正的OVR分类结果

Scikit-learn中的SVC默认采用**一对一(OVO)**逻辑训练,decision_function_shape='ovr'仅会把OVO的决策函数输出转换为OVR格式,底层训练逻辑并未改变,所以切换参数后预测结果一致。

要实现**真正的一对多(OVR)**策略,必须用OneVsRestClassifier包裹SVC,它会为每个类别单独训练一个二分类器,代码示例:

from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC

# 用OneVsRestClassifier包裹SVC,实现真正的OVR训练
model_ovr = OneVsRestClassifier(SVC(kernel='rbf'))
model_ovr.fit(X_train, Y_train)
ovr_predictions = model_ovr.predict(X_test)

二、获取OneVsRestClassifier的相关属性

1. 混淆矩阵(cm)和分类报告(sm)

这两个指标是基于预测结果与真实标签计算的,和直接使用SVC时的方式完全一致:

from sklearn.metrics import confusion_matrix, classification_report

cm = confusion_matrix(Y_test, ovr_predictions, labels=[-1,0,1])
sm = classification_report(Y_test, ovr_predictions)

2. 支持向量、对偶系数、截距

OneVsRestClassifier是多个二分类SVC的集合,这些属性存储在estimators_列表中,每个元素对应一个类别的二分类器,遍历即可获取:

import pandas as pd

# 遍历每个子分类器,获取对应属性
for idx, clf in enumerate(model_ovr.estimators_):
    current_class = model_ovr.classes_[idx]
    print(f"类别 {current_class} 的模型属性:")
    # 支持向量的索引
    support_idx = clf.support_
    # 支持向量数量
    n_support = clf.n_support_
    # 对偶系数
    alpha_df = pd.DataFrame(clf.dual_coef_)
    # 截距
    intercept_df = pd.DataFrame(clf.intercept_)
    
    # 按需打印或保存
    print(f"支持向量数量:{n_support}")
    print(f"截距:\n{intercept_df}")

注:model_ovr.classes_会返回所有类别标签,与你传入的labels对应,可通过索引匹配到每个类别的子模型。

内容的提问来源于stack exchange,提问作者Egidia Tiwi Krama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:00:01