sklearn多分类问题
?
sklearn實(shí)戰(zhàn)-乳腺癌細(xì)胞數(shù)據(jù)挖掘(博主親自錄制視頻)
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
針對(duì)多類問題的分類中,具體講有兩種,即multiclass?classification和multilabel classification。multiclass是指分類任務(wù)中包含不止一個(gè)類別時(shí),每條數(shù)據(jù)僅僅對(duì)應(yīng)其中一個(gè)類別,不會(huì)對(duì)應(yīng)多個(gè)類別。multilabel是指分類任務(wù)中不止一個(gè)分類時(shí),每條數(shù)據(jù)可能對(duì)應(yīng)不止一個(gè)類別標(biāo)簽,例如一條新聞,可以被劃分到多個(gè)板塊。
無論是multiclass,還是multilabel,做分類時(shí)都有兩種策略,一個(gè)是one-vs-?the-rest(one-vs-all),一個(gè)是one-vs-one。這個(gè)在之前的SVM介紹中(http://blog.sina.com.cn/s/blog_7103b28a0102w07f.html)也提到過。
在one-vs-all策略中,假設(shè)有n個(gè)類別,那么就會(huì)建立n個(gè)二項(xiàng)分類器,每個(gè)分類器針對(duì)其中一個(gè)類別和剩余類別進(jìn)行分類。進(jìn)行預(yù)測(cè)時(shí),利用這n個(gè)二項(xiàng)分類器進(jìn)行分類,得到數(shù)據(jù)屬于當(dāng)前類的概率,選擇其中概率最大的一個(gè)類別作為最終的預(yù)測(cè)結(jié)果。
在one-vs-one策略中,同樣假設(shè)有n個(gè)類別,則會(huì)針對(duì)兩兩類別建立二項(xiàng)分類器,得到k=n*(n-1)/2個(gè)分類器。對(duì)新數(shù)據(jù)進(jìn)行分類時(shí),依次使用這k個(gè)分類器進(jìn)行分類,每次分類相當(dāng)于一次投票,分類結(jié)果是哪個(gè)就相當(dāng)于對(duì)哪個(gè)類投了一票。在使用全部k個(gè)分類器進(jìn)行分類后,相當(dāng)于進(jìn)行了k次投票,選擇得票最多的那個(gè)類作為最終分類結(jié)果?。
?在scikit-learn框架中,分別有sklearn.multiclass.OneVsRestClassifier和sklearn.multiclass.OneVsOneClassifier完成兩種策略,使用過程中要指明使用的二項(xiàng)分類器是什么。另外在進(jìn)行mutillabel分類時(shí),訓(xùn)練數(shù)據(jù)的類別標(biāo)簽Y應(yīng)該是一個(gè)矩陣,第[i,j]個(gè)元素指明了第j個(gè)類別標(biāo)簽是否出現(xiàn)在第i個(gè)樣本數(shù)據(jù)中。例如,np.array([[1,?0,?0],?[0,?1,?1],?[0,?0,?0]]),這樣的一條數(shù)據(jù),指明針對(duì)第一條樣本數(shù)據(jù),類別標(biāo)簽是第0個(gè)類,第二條數(shù)據(jù),類別標(biāo)簽是第1,第2個(gè)類,第三條數(shù)據(jù),沒有類別標(biāo)簽。有時(shí)訓(xùn)練數(shù)據(jù)中,類別標(biāo)簽Y可能不是這樣的可是,而是類似[[2, 3, 4], [2], [0, 1, 3], [0, 1, 2, 3, 4], [0, 1, 2]]這樣的格式,每條數(shù)據(jù)指明了每條樣本數(shù)據(jù)對(duì)應(yīng)的類標(biāo)號(hào)。這就需要將Y轉(zhuǎn)換成矩陣的形式,sklearn.preprocessing.MultiLabelBinarizer提供了這個(gè)功能。
?ons-vs-all的multiclass例子如下:
?one-vs-one的multiclass例子如下:
?
https://www.cnblogs.com/taceywong/p/5932682.html
?
本例模擬一個(gè)多標(biāo)簽文檔分類問題.數(shù)據(jù)集基于下面的處理隨機(jī)生成:
- 選取標(biāo)簽的數(shù)目:泊松(n~Poisson,n_labels)
- n次,選取類別C:多項(xiàng)式(c~Multinomial,theta)
- 選取文檔長(zhǎng)度:泊松(k~Poisson,length)
- k次,選取一個(gè)單詞:多項(xiàng)式(w~Multinomial,theta_c)
在上面的處理中,拒絕抽樣用來確保n大于2,文檔長(zhǎng)度不為0.同樣,我們拒絕已經(jīng)被選取的類別.被同事分配給兩個(gè)分類的文檔會(huì)被兩個(gè)圓環(huán)包圍.
通過投影到由PCA和CCA選取進(jìn)行可視化的前兩個(gè)主成分進(jìn)行分類.接著通過元分類器使用兩個(gè)線性核的SVC來為每個(gè)分類學(xué)習(xí)一個(gè)判別模型.注意,PCA用于無監(jiān)督降維,CCA用于有監(jiān)督.
注:在下面的繪制中,"無標(biāo)簽樣例"不是說我們不知道標(biāo)簽(就像半監(jiān)督學(xué)習(xí)中的那樣),而是這些樣例根本沒有標(biāo)簽~~~
# coding:utf-8import 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) # 確保線足夠長(zhǎng) 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"有無標(biāo)簽樣例 + CCA", "cca") plot_subfigure(X, Y, 2, u"有無標(biāo)簽樣例 + 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"沒有無標(biāo)簽樣例 + CCA", "cca") plot_subfigure(X, Y, 4, u"沒有無標(biāo)簽樣例 + PCA", "pca") plt.subplots_adjust(轉(zhuǎn)載于:https://www.cnblogs.com/webRobot/p/8417364.html
總結(jié)
以上是生活随笔為你收集整理的sklearn多分类问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bzoj3993 [SDOI2015]星
- 下一篇: 图解TCP/IP(第5版)PDF