# 1.12. 多類和多標簽算法
校驗者:
[@溪流-十四號](https://github.com/apachecn/scikit-learn-doc-zh)
[@大魔王飛仙](https://github.com/apachecn/scikit-learn-doc-zh)
翻譯者:
[@v](https://github.com/apachecn/scikit-learn-doc-zh)
Warning
All classifiers in scikit-learn do multiclass classification out-of-the-box. You don’t need to use the [`sklearn.multiclass`](classes.html#module-sklearn.multiclass "sklearn.multiclass") module unless you want to experiment with different multiclass strategies.
[`sklearn.multiclass`](classes.html#module-sklearn.multiclass "sklearn.multiclass") 模塊采用了 *元評估器* ,通過把``多類`` 和 `多標簽` 分類問題分解為 二元分類問題去解決。這同樣適用于多目標回歸問題。
- **Multiclass classification** **多類分類** 意味著一個分類任務需要對多于兩個類的數據進行分類。比如,對一系列的橘子,
蘋果或者梨的圖片進行分類。多類分類假設每一個樣本有且僅有一個標簽:一個水果可以被歸類為蘋果,也可以 是梨,但不能同時被歸類為兩類。
- **Multilabel classification** **多標簽分類** 給每一個樣本分配一系列標簽。這可以被認為是預測不
相互排斥的數據點的屬性,例如與文檔類型相關的主題。一個文本可以歸類為任意類別,例如可以同時為政治、金融、 教育相關或者不屬于以上任何類別。
- **Multioutput regression** **多輸出分類** 為每個樣本分配一組目標值。這可以認為是預測每一個樣本的多個屬性,
比如說一個具體地點的風的方向和大小。
- **Multioutput-multiclass classification** and **multi-task classification** [\*\*](#id2)多輸出-多類分類和
多任務分類\*\* 意味著單個的評估器要解決多個聯合的分類任務。這是只考慮二分類的 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`](classes.html#module-sklearn.multiclass "sklearn.multiclass") 提供的元評估器允許改變在處理超過兩類數據時的方式,因為這會對分類器的性能產生影響 (無論是在泛化誤差或者所需要的計算資源方面)
下面是按照 scikit-learn 策略分組的分類器的總結,如果你使用其中的一個,則不需要此類中的元評估器,除非你想要自定義的多分類方式。
- **固有的多類分類器:**
- [`sklearn.naive_bayes.BernoulliNB`](generated/sklearn.naive_bayes.BernoulliNB.html#sklearn.naive_bayes.BernoulliNB "sklearn.naive_bayes.BernoulliNB")
- [`sklearn.tree.DecisionTreeClassifier`](generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier "sklearn.tree.DecisionTreeClassifier")
- [`sklearn.tree.ExtraTreeClassifier`](generated/sklearn.tree.ExtraTreeClassifier.html#sklearn.tree.ExtraTreeClassifier "sklearn.tree.ExtraTreeClassifier")
- [`sklearn.ensemble.ExtraTreesClassifier`](generated/sklearn.ensemble.ExtraTreesClassifier.html#sklearn.ensemble.ExtraTreesClassifier "sklearn.ensemble.ExtraTreesClassifier")
- [`sklearn.naive_bayes.GaussianNB`](generated/sklearn.naive_bayes.GaussianNB.html#sklearn.naive_bayes.GaussianNB "sklearn.naive_bayes.GaussianNB")
- [`sklearn.neighbors.KNeighborsClassifier`](generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier "sklearn.neighbors.KNeighborsClassifier")
- [`sklearn.semi_supervised.LabelPropagation`](generated/sklearn.semi_supervised.LabelPropagation.html#sklearn.semi_supervised.LabelPropagation "sklearn.semi_supervised.LabelPropagation")
- [`sklearn.semi_supervised.LabelSpreading`](generated/sklearn.semi_supervised.LabelSpreading.html#sklearn.semi_supervised.LabelSpreading "sklearn.semi_supervised.LabelSpreading")
- [`sklearn.discriminant_analysis.LinearDiscriminantAnalysis`](generated/sklearn.discriminant_analysis.LinearDiscriminantAnalysis.html#sklearn.discriminant_analysis.LinearDiscriminantAnalysis "sklearn.discriminant_analysis.LinearDiscriminantAnalysis")
- [`sklearn.svm.LinearSVC`](generated/sklearn.svm.LinearSVC.html#sklearn.svm.LinearSVC "sklearn.svm.LinearSVC") (setting multi\_class=”crammer\_singer”)
- [`sklearn.linear_model.LogisticRegression`](generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression "sklearn.linear_model.LogisticRegression") (setting multi\_class=”multinomial”)
- [`sklearn.linear_model.LogisticRegressionCV`](generated/sklearn.linear_model.LogisticRegressionCV.html#sklearn.linear_model.LogisticRegressionCV "sklearn.linear_model.LogisticRegressionCV") (setting multi\_class=”multinomial”)
- [`sklearn.neural_network.MLPClassifier`](generated/sklearn.neural_network.MLPClassifier.html#sklearn.neural_network.MLPClassifier "sklearn.neural_network.MLPClassifier")
- [`sklearn.neighbors.NearestCentroid`](generated/sklearn.neighbors.NearestCentroid.html#sklearn.neighbors.NearestCentroid "sklearn.neighbors.NearestCentroid")
- [`sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis`](generated/sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis.html#sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis "sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis")
- [`sklearn.neighbors.RadiusNeighborsClassifier`](generated/sklearn.neighbors.RadiusNeighborsClassifier.html#sklearn.neighbors.RadiusNeighborsClassifier "sklearn.neighbors.RadiusNeighborsClassifier")
- [`sklearn.ensemble.RandomForestClassifier`](generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier "sklearn.ensemble.RandomForestClassifier")
- [`sklearn.linear_model.RidgeClassifier`](generated/sklearn.linear_model.RidgeClassifier.html#sklearn.linear_model.RidgeClassifier "sklearn.linear_model.RidgeClassifier")
- [`sklearn.linear_model.RidgeClassifierCV`](generated/sklearn.linear_model.RidgeClassifierCV.html#sklearn.linear_model.RidgeClassifierCV "sklearn.linear_model.RidgeClassifierCV")
- **1對1的多類分類器:**
- [`sklearn.svm.NuSVC`](generated/sklearn.svm.NuSVC.html#sklearn.svm.NuSVC "sklearn.svm.NuSVC")
- [`sklearn.svm.SVC`](generated/sklearn.svm.SVC.html#sklearn.svm.SVC "sklearn.svm.SVC").
- [`sklearn.gaussian_process.GaussianProcessClassifier`](generated/sklearn.gaussian_process.GaussianProcessClassifier.html#sklearn.gaussian_process.GaussianProcessClassifier "sklearn.gaussian_process.GaussianProcessClassifier") (setting multi\_class = “one\_vs\_one”)
- **1對多的多類分類器:**
- [`sklearn.ensemble.GradientBoostingClassifier`](generated/sklearn.ensemble.GradientBoostingClassifier.html#sklearn.ensemble.GradientBoostingClassifier "sklearn.ensemble.GradientBoostingClassifier")
- [`sklearn.gaussian_process.GaussianProcessClassifier`](generated/sklearn.gaussian_process.GaussianProcessClassifier.html#sklearn.gaussian_process.GaussianProcessClassifier "sklearn.gaussian_process.GaussianProcessClassifier") (setting multi\_class = “one\_vs\_rest”)
- [`sklearn.svm.LinearSVC`](generated/sklearn.svm.LinearSVC.html#sklearn.svm.LinearSVC "sklearn.svm.LinearSVC") (setting multi\_class=”ovr”)
- [`sklearn.linear_model.LogisticRegression`](generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression "sklearn.linear_model.LogisticRegression") (setting multi\_class=”ovr”)
- [`sklearn.linear_model.LogisticRegressionCV`](generated/sklearn.linear_model.LogisticRegressionCV.html#sklearn.linear_model.LogisticRegressionCV "sklearn.linear_model.LogisticRegressionCV") (setting multi\_class=”ovr”)
- [`sklearn.linear_model.SGDClassifier`](generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier "sklearn.linear_model.SGDClassifier")
- [`sklearn.linear_model.Perceptron`](generated/sklearn.linear_model.Perceptron.html#sklearn.linear_model.Perceptron "sklearn.linear_model.Perceptron")
- [`sklearn.linear_model.PassiveAggressiveClassifier`](generated/sklearn.linear_model.PassiveAggressiveClassifier.html#sklearn.linear_model.PassiveAggressiveClassifier "sklearn.linear_model.PassiveAggressiveClassifier")
- **支持多標簽分類的分類器:**
- [`sklearn.tree.DecisionTreeClassifier`](generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier "sklearn.tree.DecisionTreeClassifier")
- [`sklearn.tree.ExtraTreeClassifier`](generated/sklearn.tree.ExtraTreeClassifier.html#sklearn.tree.ExtraTreeClassifier "sklearn.tree.ExtraTreeClassifier")
- [`sklearn.ensemble.ExtraTreesClassifier`](generated/sklearn.ensemble.ExtraTreesClassifier.html#sklearn.ensemble.ExtraTreesClassifier "sklearn.ensemble.ExtraTreesClassifier")
- [`sklearn.neighbors.KNeighborsClassifier`](generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier "sklearn.neighbors.KNeighborsClassifier")
- [`sklearn.neural_network.MLPClassifier`](generated/sklearn.neural_network.MLPClassifier.html#sklearn.neural_network.MLPClassifier "sklearn.neural_network.MLPClassifier")
- [`sklearn.neighbors.RadiusNeighborsClassifier`](generated/sklearn.neighbors.RadiusNeighborsClassifier.html#sklearn.neighbors.RadiusNeighborsClassifier "sklearn.neighbors.RadiusNeighborsClassifier")
- [`sklearn.ensemble.RandomForestClassifier`](generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier "sklearn.ensemble.RandomForestClassifier")
- [`sklearn.linear_model.RidgeClassifierCV`](generated/sklearn.linear_model.RidgeClassifierCV.html#sklearn.linear_model.RidgeClassifierCV "sklearn.linear_model.RidgeClassifierCV")
- **支持多類-多輸出分類的分類器:**
- [`sklearn.tree.DecisionTreeClassifier`](generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier "sklearn.tree.DecisionTreeClassifier")
- [`sklearn.tree.ExtraTreeClassifier`](generated/sklearn.tree.ExtraTreeClassifier.html#sklearn.tree.ExtraTreeClassifier "sklearn.tree.ExtraTreeClassifier")
- [`sklearn.ensemble.ExtraTreesClassifier`](generated/sklearn.ensemble.ExtraTreesClassifier.html#sklearn.ensemble.ExtraTreesClassifier "sklearn.ensemble.ExtraTreesClassifier")
- [`sklearn.neighbors.KNeighborsClassifier`](generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier "sklearn.neighbors.KNeighborsClassifier")
- [`sklearn.neighbors.RadiusNeighborsClassifier`](generated/sklearn.neighbors.RadiusNeighborsClassifier.html#sklearn.neighbors.RadiusNeighborsClassifier "sklearn.neighbors.RadiusNeighborsClassifier")
- [`sklearn.ensemble.RandomForestClassifier`](generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier "sklearn.ensemble.RandomForestClassifier")
Warning
At present, no metric in [`sklearn.metrics`](classes.html#module-sklearn.metrics "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`](generated/sklearn.preprocessing.MultiLabelBinarizer.html#sklearn.preprocessing.MultiLabelBinarizer "sklearn.preprocessing.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`](generated/sklearn.multiclass.OneVsRestClassifier.html#sklearn.multiclass.OneVsRestClassifier "sklearn.multiclass.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`](generated/sklearn.multiclass.OneVsRestClassifier.html#sklearn.multiclass.OneVsRestClassifier "sklearn.multiclass.OneVsRestClassifier") 1對其余分類器 也支持 multilabel classification. 要使用該功能,給分類器提供一個指示矩陣,比如 \[i,j\] 表示第i個樣本中的第j個標簽。
[](../auto_examples/plot_multilabel.html)
示例:
- [Multilabel classification](../auto_examples/plot_multilabel.html#sphx-glr-auto-examples-plot-multilabel-py)
## 1.12.3. 1對1
[`OneVsOneClassifier`](generated/sklearn.multiclass.OneVsOneClassifier.html#sklearn.multiclass.OneVsOneClassifier "sklearn.multiclass.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\]](#id13) 提倡的方式,即使更加詳盡的方法可能會在未來被加入其中。
在訓練時,code book 每一位的二分類器將會被訓練。在預測時,分類器將映射到類空間中選中的點的附近。
在 [`OutputCodeClassifier`](generated/sklearn.multiclass.OutputCodeClassifier.html#sklearn.multiclass.OutputCodeClassifier "sklearn.multiclass.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\]](#id11)“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.
- scikit-learn 0.19 中文文檔
- 用戶指南
- 1. 監督學習
- 1.1. 廣義線性模型
- 1.2. 線性和二次判別分析
- 1.3. 內核嶺回歸
- 1.4. 支持向量機
- 1.5. 隨機梯度下降
- 1.6. 最近鄰
- 1.7. 高斯過程
- 1.8. 交叉分解
- 1.9. 樸素貝葉斯
- 1.10. 決策樹
- 1.11. 集成方法
- 1.12. 多類和多標簽算法
- 1.13. 特征選擇
- 1.14. 半監督學習
- 1.15. 等式回歸
- 1.16. 概率校準
- 1.17. 神經網絡模型(有監督)
- 2. 無監督學習
- 2.1. 高斯混合模型
- 2.2. 流形學習
- 2.3. 聚類
- 2.4. 雙聚類
- 2.5. 分解成分中的信號(矩陣分解問題)
- 2.6. 協方差估計
- 2.7. 經驗協方差
- 2.8. 收斂協方差
- 2.9. 稀疏逆協方差
- 2.10. Robust 協方差估計
- 2.11. 新奇和異常值檢測
- 2.12. 密度估計
- 2.13. 神經網絡模型(無監督)
- 3. 模型選擇和評估
- 3.1. 交叉驗證:評估估算器的表現
- 3.2. 調整估計器的超參數
- 3.3. 模型評估: 量化預測的質量
- 3.4. 模型持久化
- 3.5. 驗證曲線: 繪制分數以評估模型
- 4. 數據集轉換
- 4.1. Pipeline(管道)和 FeatureUnion(特征聯合): 合并的評估器
- 4.2. 特征提取
- 4.3. 預處理數據
- 4.4. 無監督降維
- 4.5. 隨機投影
- 4.6. 內核近似
- 4.7. 成對的矩陣, 類別和核函數
- 4.8. 預測目標 (y) 的轉換
- 5. 數據集加載工具
- 6. 大規模計算的策略: 更大量的數據
- 7. 計算性能
- 教程
- 使用 scikit-learn 介紹機器學習
- 關于科學數據處理的統計學習教程
- 機器學習: scikit-learn 中的設置以及預估對象
- 監督學習:從高維觀察預測輸出變量
- 模型選擇:選擇估計量及其參數
- 無監督學習: 尋求數據表示
- 把它們放在一起
- 尋求幫助
- 處理文本數據
- 選擇正確的評估器(estimator)
- 外部資源,視頻和談話