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)

多标签分类 bert CNN_git

knn_clf.predict([some_digit])

多标签分类 bert CNN_权重_02

 

 

 数字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')

多标签分类 bert CNN_git_03

 

 

 上面假设所有标签有着同等的重要性,但可能不是这样。如果想让某个标签具有更大的权重,一个简单的做法就是给每一个标签的权重等于他的支持度(比如,那个标签的样例的数目)。为了做到这点,可简单的在上面代码中设置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()

多标签分类 bert CNN_权重_04

knn_clf.fit(X_train_mod, y_train_mod)
clean_digit = knn_clf.predict([X_test_mod[some_index]])
plot_digit(clean_digit)

多标签分类 bert CNN_权重_05