中文文檔: http://sklearn.apachecn.org/cn/stable/modules/multiclass.html
英文文檔: http://sklearn.apachecn.org/en/stable/modules/multiclass.html
官方文檔: http://scikit-learn.org/stable/
GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)
貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者
關於我們: http://www.apachecn.org/organization/209.html
1.12. 多類和多標籤算法
Warning
All classifiers in scikit-learn do multiclass classification out-of-the-box. You don’t need to use thesklearn.multiclass
module
unless you want to experiment with different multiclass strategies.
sklearn.multiclass
模塊採用了 元評估器 ,通過把``多類``
和 多標籤
分類問題分解爲 二元分類問題去解決。這同樣適用於多目標迴歸問題。
- Multiclass classification 多類分類 意味着一個分類任務需要對多於兩個類的數據進行分類。比如,對一系列的橘子,
蘋果或者梨的圖片進行分類。多類分類假設每一個樣本有且僅有一個標籤:一個水果可以被歸類爲蘋果,也可以 是梨,但不能同時被歸類爲兩類。
- Multilabel classification 多標籤分類 給每一個樣本分配一系列標籤。這可以被認爲是預測不
相互排斥的數據點的屬性,例如與文檔類型相關的主題。一個文本可以歸類爲任意類別,例如可以同時爲政治、金融、 教育相關或者不屬於以上任何類別。
- Multioutput regression 多輸出分類 爲每個樣本分配一組目標值。這可以認爲是預測每一個樣本的多個屬性,
比如說一個具體地點的風的方向和大小。
- Multioutput-multiclass classification and multi-task classification **多輸出-多類分類和
- 多任務分類** 意味着單個的評估器要解決多個聯合的分類任務。這是隻考慮二分類的 multi-label classification
-
和 multi-class classification 任務的推廣。 此類問題輸出的格式是一個二維數組或者一個稀疏矩陣。
每個輸出變量的標籤集合可以是各不相同的。比如說,一個樣本可以將“梨”作爲一個輸出變量的值,這個輸出變 量在一個含有“梨”、“蘋果”等水果種類的有限集合中取可能的值;將“藍色”或者“綠色”作爲第二個輸出變量的值, 這個輸出變量在一個含有“綠色”、“紅色”、“藍色”等顏色種類的有限集合中取可能的值…
這意味着任何處理 multi-output multiclass or multi-task classification 任務的分類器,在特殊的 情況下支持 multi-label classification 任務。Multi-task classification 與具有不同模型公式 的 multi-output classification 相似。詳細情況請查閱相關的分類器的文檔。
所有的 scikit-learn 分類器都能處理 multiclass classification 任務, 但是 sklearn.multiclass
提供的元評估器允許改變在處理超過兩類數據時的方式,因爲這會對分類器的性能產生影響
(無論是在泛化誤差或者所需要的計算資源方面)
下面是按照 scikit-learn 策略分組的分類器的總結,如果你使用其中的一個,則不需要此類中的元評估器,除非你想要自定義的多分類方式。
- 固有的多類分類器:
sklearn.naive_bayes.BernoulliNB
sklearn.tree.DecisionTreeClassifier
sklearn.tree.ExtraTreeClassifier
sklearn.ensemble.ExtraTreesClassifier
sklearn.naive_bayes.GaussianNB
sklearn.neighbors.KNeighborsClassifier
sklearn.semi_supervised.LabelPropagation
sklearn.semi_supervised.LabelSpreading
sklearn.discriminant_analysis.LinearDiscriminantAnalysis
sklearn.svm.LinearSVC
(setting multi_class=”crammer_singer”)sklearn.linear_model.LogisticRegression
(setting multi_class=”multinomial”)sklearn.linear_model.LogisticRegressionCV
(setting multi_class=”multinomial”)sklearn.neural_network.MLPClassifier
sklearn.neighbors.NearestCentroid
sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis
sklearn.neighbors.RadiusNeighborsClassifier
sklearn.ensemble.RandomForestClassifier
sklearn.linear_model.RidgeClassifier
sklearn.linear_model.RidgeClassifierCV
- 1對1的多類分類器:
sklearn.svm.NuSVC
sklearn.svm.SVC
.sklearn.gaussian_process.GaussianProcessClassifier
(setting multi_class = “one_vs_one”)
- 1對多的多類分類器:
sklearn.ensemble.GradientBoostingClassifier
sklearn.gaussian_process.GaussianProcessClassifier
(setting multi_class = “one_vs_rest”)sklearn.svm.LinearSVC
(setting multi_class=”ovr”)sklearn.linear_model.LogisticRegression
(setting multi_class=”ovr”)sklearn.linear_model.LogisticRegressionCV
(setting multi_class=”ovr”)sklearn.linear_model.SGDClassifier
sklearn.linear_model.Perceptron
sklearn.linear_model.PassiveAggressiveClassifier
- 支持多標籤分類的分類器:
- 支持多類-多輸出分類的分類器:
Warning
At present, no metric in sklearn.metrics
supports
the multioutput-multiclass classification task.
1.12.1. 多標籤分類格式
在 multilabel learning 中,二元分類任務的合集表示爲二進制數組:每一個樣本是大小爲 (n_samples, n_classes) 的二維數組中的一行二進制值,比如非0元素,表示爲對應標籤的 子集。 一個數組 np.array([[1, 0, 0], [0, 1, 1], [0, 0, 0]])
表示第一個樣本屬於第
0 個標籤,第二個樣本屬於第一個和第二個標籤,第三個樣本不屬於任何標籤。
通過一系列的標籤來產生多標籤數據可能更爲直觀。 MultiLabelBinarizer
轉換器可以用來在標籤接口和格式指示器接口之間進行轉換。
>>> from sklearn.preprocessing import MultiLabelBinarizer
>>> y = [[2, 3, 4], [2], [0, 1, 3], [0, 1, 2, 3, 4], [0, 1, 2]]
>>> MultiLabelBinarizer().fit_transform(y)
array([[0, 0, 1, 1, 1],
[0, 0, 1, 0, 0],
[1, 1, 0, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0]])
1.12.2. 1對其餘
這個方法也被稱爲 1對多, 在 OneVsRestClassifier
模塊中執行。
這個方法在於每一個類都將用一個分類器進行擬合。 對於每一個分類器,該類將會和其他所有的類有所區別。除了它的計算效率之外 (只需要 n_classes 個分類器), 這種方法的優點是它具有可解釋性。 因爲每一個類都可以通過有且僅有一個分類器來代表,所以通過檢查一個類相關的分類器就可以獲得該類的信息。這是最常用的方法,也是一個合理的默認選擇。
1.12.2.1. 多類學習
下面是一個使用 OvR 的一個例子:
>>> from sklearn import datasets
>>> from sklearn.multiclass import OneVsRestClassifier
>>> from sklearn.svm import LinearSVC
>>> iris = datasets.load_iris()
>>> X, y = iris.data, iris.target
>>> OneVsRestClassifier(LinearSVC(random_state=0)).fit(X, y).predict(X)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
1.12.2.2. 多標籤學習
OneVsRestClassifier
1對其餘分類器
也支持 multilabel classification. 要使用該功能,給分類器提供一個指示矩陣,比如 [i,j] 表示第i個樣本中的第j個標籤。
1.12.3. 1對1
OneVsOneClassifier
1對1分類器
將會爲每一對類別構造出一個分類器,在預測階段,收到最多投票的類別將會被挑選出來。 當存在結時(兩個類具有同樣的票數的時候), 1對1分類器會選擇總分類置信度最高的類,其中總分類置信度是由下層的二元分類器 計算出的成對置信等級累加而成。
因爲這需要訓練出 n_classes * (n_classes - 1) / 2
個分類器,
由於複雜度爲 O(n_classes^2),這個方法通常比 one-vs-the-rest 慢。然而,這個方法也有優點,比如說是在沒有很好的縮放 n_samples
數據的核方法中。
這是由於每個單獨的學習問題只涉及一小部分數據,而 one-vs-the-rest 將會使用 n_classes
次完整的數據。
1.12.3.1. 多類別學習
Below is an example of multiclass learning using OvO:
>>> from sklearn import datasets
>>> from sklearn.multiclass import OneVsOneClassifier
>>> from sklearn.svm import LinearSVC
>>> iris = datasets.load_iris()
>>> X, y = iris.data, iris.target
>>> OneVsOneClassifier(LinearSVC(random_state=0)).fit(X, y).predict(X)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
參考文獻:
- “Pattern Recognition and Machine Learning. Springer”, Christopher M. Bishop, page 183, (First Edition)
1.12.4. 誤差校正輸出代碼
基於Output-code的方法不同於 one-vs-the-rest 和 one-vs-one。使用這些方法,每一個類將會被映射到歐幾里得空間,每一個維度上的值只能爲0或者1。另一種解釋它的方法是,每一個類被表示爲二進制 碼(一個 由0 和 1 組成的數組)。保存 location (位置)/ 每一個類的編碼的矩陣被稱爲 code book。編碼的大小是前面提到的歐幾里得空間的緯度。直觀上來說,每一個類應該使用一個唯一的編碼,同時,好的 code book 應該能夠優化分類的精度。 在實現上,我們使用隨機產生的 code book,正如在 [3] 提倡的方式,即使更加詳盡的方法可能會在未來被加入其中。
在訓練時,code book 每一位的二分類器將會被訓練。在預測時,分類器將映射到類空間中選中的點的附近。
在 OutputCodeClassifier
, code_size
屬性允許用戶設置將會用到的分類器的數量。
它是類別總數的百分比。
在 0 或 1 之中的一個數字會比 one-vs-the-rest 使用更少的分類器。理論上 log2(n_classes) / n_classes
足以明確表示每個類。然而在實際情況中,這也許會導致不太好的精確度,因爲 log2(n_classes)
小於
n_classes.
比 1 大的數字比 one-vs-the-rest 需要更多的分類器。在這種情況下,一些分類器在理論上會糾正其他分類器的錯誤,因此命名爲 “error-correcting” 。然而在實際上這通常不會發生,因爲許多分類器的錯誤通常意義上來說是相關的。error-correcting output codes 和 bagging 有一個相似的作用效果。
1.12.4.1. 多類別學習
Below is an example of multiclass learning using Output-Codes:
>>> from sklearn import datasets
>>> from sklearn.multiclass import OutputCodeClassifier
>>> from sklearn.svm import LinearSVC
>>> iris = datasets.load_iris()
>>> X, y = iris.data, iris.target
>>> clf = OutputCodeClassifier(LinearSVC(random_state=0),
... code_size=2, random_state=0)
>>> clf.fit(X, y).predict(X)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 1, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
參考文獻:
- “Solving multiclass learning problems via error-correcting output codes”, Dietterich T., Bakiri G., Journal of Artificial Intelligence Research 2, 1995.
[3] | “The error coding method and PICTs”, James G., Hastie T., Journal of Computational and Graphical statistics 7, 1998. |
- “The Elements of Statistical Learning”, Hastie T., Tibshirani R., Friedman J., page 606 (second-edition) 2008.
1.12.5. 多輸出迴歸
多輸出迴歸支持 MultiOutputRegressor
可以被添加到任何迴歸器中。這個策略包括對每個目標擬合一個迴歸器。因爲每一個目標可以被一個迴歸器精確地表示,通過檢查對應的迴歸器,可以獲取關於目標的信息。
因爲 MultiOutputRegressor
對於每一個目標可以訓練出一個迴歸器,所以它無法利用目標之間的相關度信息。
以下是 multioutput regression(多輸出迴歸)的示例:
>>> from sklearn.datasets import make_regression
>>> from sklearn.multioutput import MultiOutputRegressor
>>> from sklearn.ensemble import GradientBoostingRegressor
>>> X, y = make_regression(n_samples=10, n_targets=3, random_state=1)
>>> MultiOutputRegressor(GradientBoostingRegressor(random_state=0)).fit(X, y).predict(X)
array([[-154.75474165, -147.03498585, -50.03812219],
[ 7.12165031, 5.12914884, -81.46081961],
[-187.8948621 , -100.44373091, 13.88978285],
[-141.62745778, 95.02891072, -191.48204257],
[ 97.03260883, 165.34867495, 139.52003279],
[ 123.92529176, 21.25719016, -7.84253 ],
[-122.25193977, -85.16443186, -107.12274212],
[ -30.170388 , -94.80956739, 12.16979946],
[ 140.72667194, 176.50941682, -17.50447799],
[ 149.37967282, -81.15699552, -5.72850319]])
1.12.6. 多輸出分類
Multioutput classification 支持能夠被添加到任何帶有 MultiOutputClassifier
標誌的分類器中.
這種方法爲每一個目標訓練一個分類器。 這就允許產生多目標變量分類器。這種類的目的是擴展評估器用於評估一系列目標函數 (f1,f2,f3…,fn) ,這些函數在一個單獨的預測矩陣上進行訓練以此來預測一系列的響應 (y1,y2,y3…,yn)。
下面是多輸出分類的一個例子:
>>> from sklearn.datasets import make_classification
>>> from sklearn.multioutput import MultiOutputClassifier
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.utils import shuffle
>>> import numpy as np
>>> X, y1 = make_classification(n_samples=10, n_features=100, n_informative=30, n_classes=3, random_state=1)
>>> y2 = shuffle(y1, random_state=1)
>>> y3 = shuffle(y1, random_state=2)
>>> Y = np.vstack((y1, y2, y3)).T
>>> n_samples, n_features = X.shape # 10,100
>>> n_outputs = Y.shape[1] # 3
>>> n_classes = 3
>>> forest = RandomForestClassifier(n_estimators=100, random_state=1)
>>> multi_target_forest = MultiOutputClassifier(forest, n_jobs=-1)
>>> multi_target_forest.fit(X, Y).predict(X)
array([[2, 2, 0],
[1, 2, 1],
[2, 1, 0],
[0, 0, 2],
[0, 2, 1],
[0, 0, 2],
[1, 1, 0],
[1, 1, 1],
[0, 0, 2],
[2, 0, 0]])
1.12.7. 鏈式分類器
Classifier chains (查看 ClassifierChain
)
是一種集合多個二分類器爲一個單獨的多標籤模型的方法,這種方法能夠發掘目標之間的相關性信息。
對於有 N 個類的多標籤分類問題,爲 N 個二元分類器分配 0 到 N-1 之間的一個整數。這些整數定義了模型在 chain 中的順序。將每個分類器擬合可用的訓練數據與真實的類別標籤,標籤數字相對較小。
當進行預測時,真正的標籤將無法使用。相反,每一個模型的預測結果將會傳遞給鏈上的下一個模型作爲特徵來進行使用。
很明顯,鏈的順序是十分重要的。鏈上的第一個模型沒有關於其他標籤的信息,而鏈上的最後一個模型將會具有所有其他標籤的信息。 在一般情況下,我們並不知道鏈上模型最優的順序,因此通常會使用許多隨機的順序,將他們的預測求平均。
參考文獻:
- Jesse Read, Bernhard Pfahringer, Geoff Holmes, Eibe Frank,
- “Classifier Chains for Multi-label Classification”, 2009.
中文文檔: http://sklearn.apachecn.org/cn/stable/modules/multiclass.html
英文文檔: http://sklearn.apachecn.org/en/stable/modules/multiclass.html
官方文檔: http://scikit-learn.org/stable/
GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)
貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者
關於我們: http://www.apachecn.org/organization/209.html
有興趣的們也可以和我們一起來維護,持續更新中 。。。
機器學習交流羣: 629470233