分类问题(七)多标签分类与多输出分类
多标签分类
到现在为⽌,我们看到的模型与数据都是将⼀条数据分类为⼀个类别。在某些情况下,我们可能需要分类器为每条数据输出多个类别。例如,假设有⼀个⼈脸识别分类器,如果它在同⼀张图⽚上认出了多张⼈脸的话,它应该输出什么呢?显然,它应该为每个它认出的⼈脸打上⼀个标志。
假设这个⼈脸识别分类器已经被训练了可以认出3张脸,⼩明、⼩红与⼩强。当输⼊⼀张图⽚时,假设上⾯有⼩明与⼩强,则分类器应该输出[1, 0, 1]。这种输出多个⼆进制标识的分类系统称为多标签分类系统(multilabel classification system)。端午节的英文
我们暂时不会深⼊⼈脸识别,但是我们可以看⼀个简单的例⼦,作为展⽰:
ighbors import KNeighborsClassifier
y_train_large = (y_train >= 7)
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)
这个代码创建⼀个 y_multilabel 数组,对每条数据,包含两个⽬标类别:第⼀个表⽰的是这个⼿写数字是不是⼀个较⼤的数
(7,8,9),第⼆个类别表⽰的是它是否是⼀个奇数。之后我们创建了⼀个KNeighborsClassifier 实例(KNN⽀持多标签分类,当然,不是所有的分类器都⽀持),然后使⽤多类别的数组进⾏训练。最后我们使⽤模型做预测,可以看到它输出了多个类别:点火正时
knn_clf.predict([X_train[0]])
>array([[Fal, True]])
y[0]
>5
元旦的由来可以看到第⼀条数据是数字5,它分类的结果正确。瞬时速度中心
我们有多种⽅法⽤于评估⼀个多标签分类器,使⽤哪个指标完全取决于项⽬的需求。例如,其中⼀个⽅法是对每个单独的label衡量它的
F1分数(或者任何其他⼆元分类器⾥提到的衡量指标),然后对这些分数就平均。如下所⽰:
y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_multilabel, cv=3)
deal withf1_score(y_multilabel, y_train_knn_pred, average="macro")skyrocket
>0.976410265560605
这个的前提是:假设所有的类别都是同等重要到。但是在实际项⽬中可能并不是这样的。假设我们的图⽚数据中,⼩明的图⽚⽐⼩红与⼩强的多的多,那么我们可能要给⼩明的分数更多的权重。⼀个简单的⽅法是:给每个类别的权重等同于这个类别的数据量。使⽤时只需要在上述代码中设置 average="weighted" 即可。
多输出分类
最后要介绍的⼀种分类任务是多输出分类(multioutput-multiclass classification,有时候也简称multioutput classification)。它其实就是多标签分类的⼀般形式,并且每个label都可以是多个类别(也就是说,它包含2种以上可能的值)。
shock wave
英语新年祝福语举个例⼦,假设我们现在要构造⼀个系统,⽤于移除图⽚中的噪点。它会输⼊⼀张噪点图⽚,然后输出⼀张⼲净的图⽚,以像素强度的像素点矩阵表⽰(与MNIST图⽚表⽰的⽅法⼀样)。需要注意的是,这个分类器输出的是多个label(每个像素点⼀个类别),并且每个label可以有多个值(像素点的像素强度从0到255)。这就是⼀个multioutput classification system 的例⼦。
开始我们可以通过给MNIST图⽚增加噪点(加到像素点强度中)来创建训练集与测试集,使⽤NumPy的randint() ⽅法。⽽⽬标图⽚就是原始图⽚:
noi = np.random.randint(0, 100, (len(X_train), 784))
X_train_mod = X_train + noi
noi = np.random.randintnt(0, 100, (len(X_test), 784))
X_test_mod = X_test + noi
y_train_mod = X_train
y_test_mod = X_test
我们先看⼀张测试图:
左边是包含噪点的输⼊图,右边是⼲净的⽬标图。然后我们训练⼀个分类器⽤于清理这张图:
hdcp是什么knn_clf.fit(X_train_mod, y_train_mod)
clean_digit = knn_clf.predict([X_test_mod[0]])
原图与预测图分别如下所⽰(左边为预测图),结果看起来还是很令⼈满意的:
whatthehell
⾄此,我们已经介绍完了分类问题,希望⼤家现在已经能够很好地做到以下⼏点:
如何为分类任务选择衡量指标
选择合适的precision/recall tradeoff
不同分类器之间的对⽐
针对不同的任务构,造表现良好的分类系统