如何用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
相关产品推荐
相关产品推荐

