多標簽分類?

本示例模擬了多標簽文檔分類問題。數據集是根據以下過程隨機生成的:

  • 選擇標簽數量:n ~ Poisson(n_labels) - 服從泊松分布

  • n次,選擇一個類別c:c ~ Multinomial(theta) - 服從多項式分布

  • 選擇文檔長度:k ~ Poisson(length) - 服從泊松分布

  • k次,選擇一個單詞:w ~ Multinomial(theta_c) - 服從多項式分布

在上述過程中,使用拒絕抽樣來確保n大于2,并且文檔長度永遠不會為零。同樣,我們拒絕已經被選擇出的類(譯者注:即進行不放回抽樣)。分配給兩個類別的文檔被兩個彩色圓圈包圍。

通過將PCA和CCA找到的前兩個主要特征投影以進行可視化,然后通過使用sklearn.multiclass.OneVsRestClassifier元分類器(使用兩個帶有線性內核的SVC來學習每個類的判別模型)來執行分類。請注意,PCA用于執行無監督的降維,而CCA用于執行無監督的降維。

注意:在該圖中,“未標記樣本”并不意味著我們不知道標記(如在半監督學習中一樣),而是樣本根本沒有標記。

print(__doc__)

import numpy as np
import matplotlib.pyplot as plt

from sklearn.datasets import make_multilabel_classification
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.cross_decomposition import CCA


def plot_hyperplane(clf, min_x, max_x, linestyle, label):
    # 得到切分的超平面
    w = clf.coef_[0]
    a = -w[0] / w[1]
    xx = np.linspace(min_x - 5, max_x + 5)  # 確保線畫得足夠長
    yy = a * xx - (clf.intercept_[0]) / w[1]
    plt.plot(xx, yy, linestyle, label=label)


def plot_subfigure(X, Y, subplot, title, transform):
    if transform == "pca":
        X = PCA(n_components=2).fit_transform(X)
    elif transform == "cca":
        X = CCA(n_components=2).fit(X, Y).transform(X)
    else:
        raise ValueError

    min_x = np.min(X[:, 0])
    max_x = np.max(X[:, 0])

    min_y = np.min(X[:, 1])
    max_y = np.max(X[:, 1])

    classif = OneVsRestClassifier(SVC(kernel='linear'))
    classif.fit(X, Y)

    plt.subplot(22, subplot)
    plt.title(title)

    zero_class = np.where(Y[:, 0])
    one_class = np.where(Y[:, 1])
    plt.scatter(X[:, 0], X[:, 1], s=40, c='gray', edgecolors=(000))
    plt.scatter(X[zero_class, 0], X[zero_class, 1], s=160, edgecolors='b',
                facecolors='none', linewidths=2, label='Class 1')
    plt.scatter(X[one_class, 0], X[one_class, 1], s=80, edgecolors='orange',
                facecolors='none', linewidths=2, label='Class 2')

    plot_hyperplane(classif.estimators_[0], min_x, max_x, 'k--',
                    'Boundary\nfor class 1')
    plot_hyperplane(classif.estimators_[1], min_x, max_x, 'k-.',
                    'Boundary\nfor class 2')
    plt.xticks(())
    plt.yticks(())

    plt.xlim(min_x - .5 * max_x, max_x + .5 * max_x)
    plt.ylim(min_y - .5 * max_y, max_y + .5 * max_y)
    if subplot == 2:
        plt.xlabel('First principal component')
        plt.ylabel('Second principal component')
        plt.legend(loc="upper left")


plt.figure(figsize=(86))

X, Y = make_multilabel_classification(n_classes=2, n_labels=1,
                                      allow_unlabeled=True,
                                      random_state=1)

plot_subfigure(X, Y, 1"With unlabeled samples + CCA""cca")
plot_subfigure(X, Y, 2"With unlabeled samples + PCA""pca")

X, Y = make_multilabel_classification(n_classes=2, n_labels=1,
                                      allow_unlabeled=False,
                                      random_state=1)

plot_subfigure(X, Y, 3"Without unlabeled samples + CCA""cca")
plot_subfigure(X, Y, 4"Without unlabeled samples + PCA""pca")

plt.subplots_adjust(.04.02.97.94.09.2)
plt.show()

輸出:

腳本的總運行時間:(0分鐘0.292秒)