多標簽分類數據及可視化說明
本示例模擬多標簽(multi-label)文檔分類問題。模擬數據集是根據以下過程隨機生成的:
- 選擇標簽數:n〜Poisson(n_labels) ,即n采樣自泊鬆分布。
- n次,每次選擇一個類c:c〜多項式(theta),即c采樣自多項式分布。
- 選擇文檔長度:k〜泊鬆(長度),即k采樣子泊鬆分布。
- k次,選擇一個單詞:w〜多項式(theta_c),即單詞k滿足多項式分布。
在以上過程中,使用拒絕抽樣來確保n大於2,並且文檔長度永遠不會為零。同樣,我們拒絕已經選擇的類。分配給兩個類別的文檔被兩個彩色圓圈包圍。
通過將PCA和CCA發現的前兩個主要成分做投影來進行分類的可視化,然後使用sklearn.multiclass.OneVsRestClassifier
元分類器使用兩個帶有線性核的SVC來學習每個類的判別模型。請注意,PCA用於執行無監督的降維,而CCA用於執行有監督的降維。
注意:在圖中,“unlabeled samples”並不意味著我們不知道標簽(就像在半監督學習中一樣),而是樣本隻是沒有某一個標簽。
代碼實現[Python]
# -*- coding: utf-8 -*-
# Authors: Vlad Niculae, Mathieu Blondel
# License: BSD 3 clause
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):
# get the separating hyperplane
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(min_x - 5, max_x + 5) # make sure the line is long enough
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(2, 2, 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=(0, 0, 0))
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=(8, 6))
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.093秒。
運行代碼輸出的圖片內容如下:
源碼下載
- Python版源碼文件: plot_multilabel.py
- Jupyter Notebook版源碼文件: plot_multilabel.ipynb