python機器學習-乳腺癌細胞挖掘(博主親自錄制視頻)
https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share
sklearn:multiclass與multilabel,one-vs-rest與one-vs-one
針對多類問題的分類中,具體講有兩種,即multiclass classification和multilabel classification。multiclass是指分類任務中包含不止一個類別時,每條數據僅僅對應其中一個類別,不會對應多個類別。multilabel是指分類任務中不止一個分類時,每條數據可能對應不止一個類別標簽,例如一條新聞,可以被划分到多個板塊。
無論是multiclass,還是multilabel,做分類時都有兩種策略,一個是one-vs-the-rest(one-vs-all),一個是one-vs-one。這個在之前的SVM介紹中(http://blog.sina.com.cn/s/blog_7103b28a0102w07f.html)也提到過。
在one-vs-all策略中,假設有n個類別,那么就會建立n個二項分類器,每個分類器針對其中一個類別和剩余類別進行分類。進行預測時,利用這n個二項分類器進行分類,得到數據屬於當前類的概率,選擇其中概率最大的一個類別作為最終的預測結果。
在one-vs-one策略中,同樣假設有n個類別,則會針對兩兩類別建立二項分類器,得到k=n*(n-1)/2個分類器。對新數據進行分類時,依次使用這k個分類器進行分類,每次分類相當於一次投票,分類結果是哪個就相當於對哪個類投了一票。在使用全部k個分類器進行分類后,相當於進行了k次投票,選擇得票最多的那個類作為最終分類結果。
在scikit-learn框架中,分別有sklearn.multiclass.OneVsRestClassifier和sklearn.multiclass.OneVsOneClassifier完成兩種策略,使用過程中要指明使用的二項分類器是什么。另外在進行mutillabel分類時,訓練數據的類別標簽Y應該是一個矩陣,第[i,j]個元素指明了第j個類別標簽是否出現在第i個樣本數據中。例如,np.array([[1, 0, 0], [0, 1, 1], [0, 0, 0]]),這樣的一條數據,指明針對第一條樣本數據,類別標簽是第0個類,第二條數據,類別標簽是第1,第2個類,第三條數據,沒有類別標簽。有時訓練數據中,類別標簽Y可能不是這樣的可是,而是類似[[2, 3, 4], [2], [0, 1, 3], [0, 1, 2, 3, 4], [0, 1, 2]]這樣的格式,每條數據指明了每條樣本數據對應的類標號。這就需要將Y轉換成矩陣的形式,sklearn.preprocessing.MultiLabelBinarizer提供了這個功能。
ons-vs-all的multiclass例子如下:
one-vs-one的multiclass例子如下:
https://www.cnblogs.com/taceywong/p/5932682.html
本例模擬一個多標簽文檔分類問題.數據集基於下面的處理隨機生成:
- 選取標簽的數目:泊松(n~Poisson,n_labels)
- n次,選取類別C:多項式(c~Multinomial,theta)
- 選取文檔長度:泊松(k~Poisson,length)
- k次,選取一個單詞:多項式(w~Multinomial,theta_c)
在上面的處理中,拒絕抽樣用來確保n大於2,文檔長度不為0.同樣,我們拒絕已經被選取的類別.被同事分配給兩個分類的文檔會被兩個圓環包圍.
通過投影到由PCA和CCA選取進行可視化的前兩個主成分進行分類.接着通過元分類器使用兩個線性核的SVC來為每個分類學習一個判別模型.注意,PCA用於無監督降維,CCA用於有監督.
注:在下面的繪制中,"無標簽樣例"不是說我們不知道標簽(就像半監督學習中的那樣),而是這些樣例根本沒有標簽~~~
# coding:utf-8 import numpy as np from pylab import * from sklearn.datasets import make_multilabel_classification from sklearn.multiclass import OneVsRestClassifier from sklearn.svm import SVC from sklearn.preprocessing import LabelBinarizer from sklearn.decomposition import PCA from sklearn.cross_decomposition import CCA myfont = matplotlib.font_manager.FontProperties(fname="Microsoft-Yahei-UI-Light.ttc") mpl.rcParams['axes.unicode_minus'] = False 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(2, 2, subplot) plt.title(title,fontproperties=myfont) zero_class = np.where(Y[:, 0]) one_class = np.where(Y[:, 1]) plt.scatter(X[:, 0], X[:, 1], s=40, c='gray') plt.scatter(X[zero_class, 0], X[zero_class, 1], s=160, edgecolors='b', facecolors='none', linewidths=2, label=u'類別-1') plt.scatter(X[one_class, 0], X[one_class, 1], s=80, edgecolors='orange', facecolors='none', linewidths=2, label=u'類別-2') plot_hyperplane(classif.estimators_[0], min_x, max_x, 'k--', u'類別-1的\n邊界') plot_hyperplane(classif.estimators_[1], min_x, max_x, 'k-.', u'類別-2的\n邊界') 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(u'第一主成分',fontproperties=myfont) plt.ylabel(u'第二主成分',fontproperties=myfont) plt.legend(loc="upper left",prop=myfont) 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, u"有無標簽樣例 + CCA", "cca") plot_subfigure(X, Y, 2, u"有無標簽樣例 + PCA", "pca") X, Y = make_multilabel_classification(n_classes=2, n_labels=1, allow_unlabeled=False, random_state=1) plot_subfigure(X, Y, 3, u"沒有無標簽樣例 + CCA", "cca") plot_subfigure(X, Y, 4, u"沒有無標簽樣例 + PCA", "pca") plt.subplots_adjust(.04, .