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、初始化这两个分类器的时候需要传入分类的模型。
参考文章: