sklearnAPI实现多分类:OneVsOneClassifier

首先声明本人为小白,只是为了方便记录自己的学习过程并且监督自己所写的专栏,有什么问题欢迎各位大佬在评论区指正或者讨论。另外,需要引用请注明出处(虽然不是完全原创但是也是自己辛辛苦苦查资料写的啊QAQ),谢谢。

多分类问题

声明:这部分主要参考周志华老师的西瓜书(《机器学习》)3.5节
基于一些策略,可以利用二分类学习器来解决多分类问题。
多分类学习的基本思路是进行“拆解”,拆分为若干个二分类任务,然后为拆出的每个二分类任务训练一分类器,最后再将这些预测结果进行集成最终获得多分类结果。
最经典的拆分策略有三种:“一对一”(即One vs. One ,OvO),“一对其余”(即One vs. Rest ,OvR),“多对多”(即Many vs. Many ,MvM)。

至于具体策略,下面会简单提一下OvO,OvR的思想,具体分析大家可以再百度或者看周老师的书。
上述三种策略中的前两种在sklearn中都有相应的API,后面会着重讲sklearn.multiclass.OneVsOneClassifier类的用法

书上后面提到的ECOC(纠错输出码,Error Correcting Output Codes)在sklearn中也有相应的API(sklearn.multiclass.OutputCodeClassifier),这里就不讲了,感兴趣的朋友可以去sklearn官网看。(链接:https://scikit-learn.org/dev/modules/generated/sklearn.multiclass.OutputCodeClassifier.html#sklearn.multiclass.OutputCodeClassifier)

OvO

(这样打出来像不像可爱的表情包哈哈哈)
“一对一”就是上述所说的分出的每一个二分类任务中的这两类的“一对一”,然后训练分类器。对于N个类来说,两两配对之后共有N(N-1)/2种结果,所以也需要相应数量的二分类器。在预测结果时,需要将新样本同时提交给所有的二分类器,最终结果由所有二分类器投票产生,获得票数最高的类即为最终结果。

OvR

“一对其余”则是将其中一个类作为正例,其余类的作为反例,所以此时需要N个分类器。

sklearn.multiclass.OneVsOneClassifier

用法讲解

老规矩,先上图(链接:https://scikit-learn.org/dev/modules/generated/sklearn.multiclass.OneVsOneClassifier.html#sklearn.multiclass.OneVsOneClassifier):
在这里插入图片描述

参数

estimator(预估器):最重要的参数,是用于实现fit的预估器对象。我理解的and后面的语句是指这个预估器需要有“决策函数”或“预测概率”(本人翻译可能不太准确)中的其中一个。
decision_function:在拟合的分类器或离群值检测器中,预测与每个类别相关的每个样本的“软”评分,而不是预测所产生的“硬”分类预测。(这里的“软”评分其实本人没有搜到是什么意思,但是我推测这里的意思是重在得到评分)它的输入通常只是一些观察到的数据X。;predict_proba:分类器和聚类器中的一种方法,可以返回每个类/聚类的概率估计。它的输入通常只是一些观察到的数据X。

n_jobs:工作的核数量,默认值为None,除非joblib.parallel_backend中修改了默认值,一般情况为1;-1则代表使用所有的核。

方法

在这里插入图片描述
基本与其他分类器方法相同,这里便不再赘述。

使用举例

这里用的经典的。。。对!鸢尾花数据集!

from sklearn.datasets import load_iris
iris = load_iris()
iris_data = pd.concat([pd.DataFrame(iris.data,columns=iris.feature_names),pd.DataFrame(iris.target,columns=['target'])],axis=1)

得到的iris_data如下:
在这里插入图片描述

from sklearn.multiclass import OneVsOneClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
x = iris_data[iris.feature_names]
y = iris_data['target']
x_train, x_test, y_train, y_test = train_test_split(x,y)
log_reg_ovo.fit(x_train, y_train.values.flatten())
print("准确率为:\n", log_reg_ovo.score(x_test, y_test.values.flatten()))

得到最终结果为:
在这里插入图片描述
当然这只是简单的举例,单次准确率具有一定的随机性。

总结

运用OvO,OvR等策略,放入二分类器就可以解决多分类问题。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值