本文共 1617 字,大约阅读时间需要 5 分钟。
针对多类问题的分类中,具体讲有两种,即multiclass classification和multilabel classification。
multiclass是指分类任务中包含不止一个类别时,每条数据仅仅对应其中一个类别,不会对应多个类别。
multilabel是指分类任务中不止一个分类时,每条数据可能对应不止一个类别标签,例如一条新闻,可以被划分到多个板块。
无论是multiclass,还是multilabel,做分类时都有两种策略,一个是one-vs-the-rest(one-vs-all),一个是one-vs-one。
简称就是OvR和OvO
OvR: 假设有n个类别,选择其中一个作为1类,剩下的n-1作为一类。进行n次分类,选择分类得分最高的。
OvO: 同样假设有n个类别,则会针对两两类别建立二项分类器,得到k=n*(n-1)/2个分类器。 然后进行K次分类,选择最高的;
通常来说,OvO耗时较多,但较为准确。
在逻辑回归中,有个参数是:
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 OneVsRestClassifierovr = OneVsRestClassifier(log_reg)ovr.fit(X_train, y_train)print 'ovr:', ovr.score(X_test, y_test)from sklearn.multiclass import OneVsOneClassifierovo = 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、初始化这两个分类器的时候需要传入分类的模型。
参考文章:
转载地址:http://cekai.baihongyu.com/