Bobo老师机器学习笔记第九课-如何处理多分类任务?

1、什么是多分类任务?

   针对多类问题的分类中,具体讲有两种,即multiclass classification和multilabel classification

multiclass是指分类任务中包含不止一个类别时,每条数据仅仅对应其中一个类别,不会对应多个类别。

multilabel是指分类任务中不止一个分类时,每条数据可能对应不止一个类别标签,例如一条新闻,可以被划分到多个板块。

无论是multiclass,还是multilabel,做分类时都有两种策略,一个是one-vs-​the-rest(one-vs-all),一个是one-vs-one。

简称就是OvR和OvO

2、OvR和OvO的原理是什么?

OvR: 假设有n个类别,选择其中一个作为1类,剩下的n-1作为一类。进行n次分类,选择分类得分最高的。 

OvO:  同样假设有n个类别,则会针对两两类别建立二项分类器,得到k=n*(n-1)/2个分类器。 然后进行K次分类,选择最高的;

通常来说,OvO耗时较多,但较为准确。 

3、Sklearn中是如何实现多类别分类的?

在逻辑回归中,有个参数是:

multi_class : str, {‘ovr’, ‘multinomial’, ‘auto’}, default: ‘ovr’ 声明是多类别分类。

log_reg2 = LogisticRegression(multi_class="multinomial", solver="newton-cg")

利用鸢尾花测试集:

X, y = datasets.load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
log_reg2 = LogisticRegression(multi_class="multinomial", solver="newton-cg")
log_reg2.fit(X_train, y_train)
print log_reg2.score(X_test, y_test)

运行结果是1.0 

此外,在Sklearn中,针对OvR和OvO专门封装了分类器。

X, y = datasets.load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)

log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
log_reg.score(X_test, y_test)

from sklearn.multiclass import OneVsRestClassifier

ovr = OneVsRestClassifier(log_reg)
ovr.fit(X_train, y_train)
print 'ovr:', ovr.score(X_test, y_test)

from sklearn.multiclass import OneVsOneClassifier

ovo = OneVsOneClassifier(log_reg)
ovo.fit(X_train, y_train)
ovo.score(X_test, y_test)
print 'ovo:', ovo.score(X_test, y_test)

分类结果:

ovr: 0.9473684210526315
ovo: 1.0
 

最后注意一下:

1、OneVsOneClassifier和OnevsRestClassifier都是在sklearn中的multiclass下面

2、初始化这两个分类器的时候需要传入分类的模型。

参考文章:

one-vs-rest与one-vs-one以及sklearn的实现

多分类和多标签算法

猜你喜欢

转载自blog.csdn.net/sxb0841901116/article/details/84862802