二元分类

二元分类又称逻辑回归,是将一组样本划分到两个不同类别的分类方式。通过线性加权,再经过一个逻辑回归函数,后者将输出值缩放至0至1之间。典型的有如支持向量机分类器或线性分类器;

多元分类

将对象群中的每个实例分到多个类别,超过2个,叫做多元分类。
有一些算法(如随机森林分类器或朴素贝叶斯分类器)可以直接处理多个类。也可以采用两种策略,将二元分类器进行多元分类:

策略一:OVR策略,one vs all; 预测10个类,同时训练10个分类器,预测每个实例是否为某个类别,取10个分类器中得分最高的类别,作为最终类别,进行输出。

策略二:OVO策略, one vs one;预测10个类,每个分类器预测2个不同类别,则一共需要10*9/2=45种分类器,其优势在于,每个分类器所需样本仅是涉及到的两类的样本。适用于那些数据集过大时,预测效果反而下降的分类器。值得注意的是,由于训练每个分类器所需的数据更少,虽然分类器数量增多,但是训练时间可能缩短。

代码:
Scikit-Learn可以检测到你尝试使用二元分类算法进行多类分类任务,它会根据情况自动运行OvR或者OvO。
SVC是个严格的二分类器,Scikit-Learn将其自动转为多分类。

svm_clf = SVC(gamma="auto", random_state=42)
svm_clf.fit(X_train[:1000], y_train[:1000]) # y_train, not y_train_5
svm_clf.predict([some_digit])

强制指定是OVR还是OVO:

from sklearn.multiclass import OneVsRestClassifier
#使用OneVsRestClassifier嵌套,不改变调用方式
ovr_clf = OneVsRestClassifier(SVC(gamma="auto", random_state=42))
ovr_clf.fit(X_train[:1000], y_train[:1000])
ovr_clf.predict([some_digit])

多标签分类

为每个实例输出多个二元标签的分类器,叫做多标签分类。如一个数字,可以既是大于10的数,又是奇数。
传统的多标签分类任务,将标签分开,有几个标签,就建立几个分类器,再将预测结果拼合,深度学习时,需在输出端设置标签个数的输出节点,再给每个结点接sigmoid函数,设置阈值进行判断。
注:KNeighborsClassifier支持多标签分类。

from sklearn.neighbors import KNeighborsClassifier

y_train_large = (y_train >= 10)
y_train_odd = (y_train % 2 == 1)
#两矩阵做列连接
y_multilabel = np.c_[y_train_large, y_train_odd]

knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_multilabel)

多标签分类和多类分类的区别

都有很多潜在类别,但是多标签分类,每个实例可对应多个类别;多类分类,每个实例只能对应一个类别。

多标签多类分类

在多标签的基础上,每个标签,也可以看成是输出,有多个可能出现的值,如一共有3个标签需要输出,每个标签值的取值范围是0至255.