(9)机器学习_多分类器OneVsRestClassifier

本文介绍了OneVsRestClassifier(OvR)的概念,它是通过为每个类别创建一个分类器来处理多类分类问题。文章通过实例展示了如何使用sklearn库的OvR与SVM结合进行数据建模,并通过ROC曲线评估分类性能。代码示例中,首先加载鸢尾花数据集,然后进行数据预处理,接着训练和测试模型,并绘制了不同类别的ROC曲线,以展示模型的识别能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是OneVsRestClassifier

OvR为每一个类别配备一个分类器,是目前最常用的一种多类分类策略

c l a s s s k l e a r n . m u l t i c l a s s . O n e V s R e s t C l a s s i f i e r ( e s t i m a t o r , ∗ , n _ j o b s = N o n e ) class sklearn.multiclass.OneVsRestClassifier(estimator, *, n\_jobs=None) classsklearn.multiclass.OneVsRestClassifier(estimator,,n_jobs=None)

estimator:要使用的分类模型
n_jobs:与K折交叉验证相同,n_jobs等于-1时,使用所有处理器工作

2、为什么要使用OneVsRestClassfier

使用OvR可以更好的获取每一个类别的相关信息,比如在建模时遇到需要分品牌,分类别对产品进行处理预测,OvR就是可以是一个思路。
具体sklearn的中文文档给出了如下的介绍:
在这里插入图片描述

3、OvR实现


import numpy as np
from sklearn import svm,datasets
from sklearn.metrics import roc_curve,auc
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
import matplotlib.pyplot as plt


#加载鸢尾数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

#将数据二进制化处理,此处和onehotencoder大概一致
y = label_binarize(y,classes=[0,1,2])
n_classes = y.shape[1]

#加入噪点
n_sample,n_featrues = X.shape
X = np.c_[X,np.random.RandomState(0).randn(n_sample,80*n_featrues)]

#分割数据
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=.5,random_state=0)

#设置分类器,这里实用的是SVC支持向量机
clf =SVC(C=0.2,gamma=0.2,kernel='linear', probability=True, random_state=0)
classifier = OneVsRestClassifier(clf,n_jobs=-1)
classifier.fit(X_train, y_train)
#计算分数,roc_curve要用到
y_score = classifier.decision_function(X_test)

fpr = dict()
tpr = dict()
roc_auc = dict()
#计算aoc值
for i in range(n_classes):
    fpr[i],tpr[i],_=roc_curve(y_test[:,i],y_score[:,i])
    roc_auc[i] = auc(fpr[i],tpr[i])


#画图
plt.figure()
lw = 2
color = ['r', 'g', 'b']
for i in range(3):
    plt.plot(fpr[i], tpr[i], color=color[i],lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[i])
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')

plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

4、附件

三个类别的roc曲线
在这里插入图片描述

5 、参考文献

https://scikit-learn.org.cn/view/679.html
https://www.cnblogs.com/yanshw/p/12691329.html

### 多分类机器学习模型概述 对于多分类问题,即目标变量具有两个以上类别的情况,可以采用多种方法构建和评估模型。常见的策略包括一对多(OvR)、一对一(OvO),以及直接支持多类别的算法。 #### 创建多分类模型的方法 一种常见的方式是一对多 (One-vs-Rest, OvR)[^1] 或者称为 One-vs-All 的方法,在这种方法中,针对每个类别训练一个二元分类器,该分类器区分特定的一类与其他所有的类;另一个方式是一对一(One-vs-One, OvO), 这种方法为每一对类别组合分别建立一个二元分类器。除了这两种基于二分类扩展到多分类的技术外,还有些专门设计用来处理多分类任务的算法如决策树和支持向量机等可以直接应用于多分类场景。 ```python from sklearn.multiclass import OneVsRestClassifier from sklearn.svm import SVC clf = OneVsRestClassifier(SVC()) ``` #### 使用多分类模型 当选择了合适的建模技术之后,则可以通过标准的数据预处理流程准备数据集并拟合所选模型。这通常涉及到特征工程、参数调优等工作。一旦完成这些准备工作就可以利用训练好的模型来进行预测操作了。 ```python # 假设X_train, y_train已经定义好 model.fit(X_train, y_train) predictions = model.predict(new_data_points) ``` #### 评估多分类模型 为了衡量一个多分类系统的有效性,可考虑多个评价指标: - **混淆矩阵**:提供了关于实际值与预测值之间对应情况的具体信息; - **宏平均精度(Macro Precision)** 和 宏平均召回率(Macro Recall): 计算各个类别的精确度/召回率再取均值; - **加权F1得分**: 考虑到了样本不平衡的问题,通过给不同类别赋予不同的权重来计算综合表现. 值得注意的是,虽然 ROC 曲线主要用于描述二分类模型的表现特性,但对于某些类型的多标签或多输出设置也可以适用类似的分析手段。然而更普遍的做法是在多分类情境下关注 PR 曲线下面积(Area Under the Curve of Precision-Recall curve,AUPRC). ```python import numpy as np from sklearn.metrics import confusion_matrix, classification_report y_true = ["cat", "dog", "rabbit"] y_pred = ["cat", "dog", "dog"] print(confusion_matrix(y_true, y_pred)) print(classification_report(y_true, y_pred)) ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛右刀薛面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值