多标签分类及多输出分类
1、多标签分类
有些情况,会想让你的分类器给一个样例输出多个类别。比如思考一个人脸识别器,并识别出这个是谁。这就需要对于同一张图片,首先识别出有几个人,并给识别出的人贴上标签。这就是多个二值标签的分类系统被叫做多标签分类系统。
现在,我们打算使用MNIST数据做一个是否为大数字(大于6)、是否为奇数的多标签分类。
from sklearn.neighbors import KNeighborsClassifier knn_clf = 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.fit(X_train,y_multilabel)
knn_clf.predict([some_digit])
数字5不是大数(False)但是一个奇数(True)
有许多方法去评估一个多标签分类器,和选择正确的量度标准,这取决于你的项目。举个例子,一个方法是对每个个体标签去量度 F1 值(或者前面讨论过的其他任意的二分类器的量度标准),然后计算平均值。下面的代码计算全部标签的平均 F1 值:
y_train_knn_pred = cross_val_predict(knn_clf,X_train,y_train,cv=3) f1_score(y_train,y_train_knn_pred,average='macro')
上面假设所有标签有着同等的重要性,但可能不是这样。如果想让某个标签具有更大的权重,一个简单的做法就是给每一个标签的权重等于他的支持度(比如,那个标签的样例的数目)。为了做到这点,可简单的在上面代码中设置average= “weighted”
2、多输出分类
分类任务“多输出-多类分类”(或者称为多输出分类)。它是多标签分类的简单泛化,在这里每一个标签可以是多类别的(比如说,可以有多个可能值)
我们将建立一个系统,它可以去除图片中的噪音。它将有一张混有噪音的图片作为输入,期待他能够输出一个干净的数字图片,用一个像素强度的数组表示,注意这个分类器的输出是多标签的(一个像素一个标签)和每个标签可以偶多个值(像素强度取值范围从0到255)。所以他是一个多输出分类系统
从MNIST的图片创建训练集和测试集开始,然后给图片的像素强度添加噪声。目标图像是原始图像
noise =np.random.randint(0,100,(len(X_train),784)) X_train_mod = X_train + noise noise = np.random.randint(0,100,(len(X_test),784)) X_test_mod = X_test + noise y_train_mod = X_train y_test_mod = X_test
some_index = 5500 plt.subplot(121);plot_digit(X_test_mod[some_index]) plt.subplot(122);plot_digit(y_test_mod[some_index]) plt.show()
knn_clf.fit(X_train_mod, y_train_mod) clean_digit = knn_clf.predict([X_test_mod[some_index]]) plot_digit(clean_digit)