作者:Jason Brownlee
翻譯:候博學
機器學習是一個從訓練集中學習出算法的研究領域。
分類是一項需要使用機器學習算法的任務,該算法學習如何為數據集分配類別標籤。
舉一個簡單易懂的例子:將電子郵件分類為「 垃圾郵件 」或「 非垃圾郵件」(二分類的典型特徵「非此即彼」,關於二分類,後文會涉及)。
你可能會在機器學習中遇到許多不同類型的分類任務,但是其實每種模型都會使用與之相對應的建模方法。
因此在本文中,你將了解到機器學習中不同類型的分類預測建模方法。
二分類是指預測兩個類別之一(非此即彼),而多分類則涉及預測兩個以上類別之一;概述本文分為五個部分,它們分別是:
分類預測建模在機器學習中,分類[1]是指預測建模問題,對給定示例的輸入數據預測其類別標籤。
分類問題的案例包括:
從建模的角度來看,分類需要訓練數據集,其中包含許多可供學習的輸入和輸出數據。
模型將使用訓練數據集,並計算如何將輸入數據樣本更加準確地映射到特定的類別標籤。
因此,訓練數據集必須擁有足夠的代表性,並且每個分類標籤都擁有很多樣本數據。
類別標籤通常是字符串值,例如「 spam 」(垃圾郵件),「 not spam 」(非垃圾郵件),並且在提供給建模算法之前必須將其映射為數值。這通常稱為標籤編碼[2],其中為每個類別標籤分配一個唯一的整數,例如「 spam 」 = 0,「 no spam 」 = 1。
有很多不同類型的分類算法可以對分類預測問題進行建模。
關於如何將合適的算法應用到具體分類問題上,沒有固定的模式準則。但可以通過試驗來確定,通常是試驗者使用受控實驗,在給定的分類任務中,哪種算法和算法配置擁有最佳性能,從而將其挑選出來。
基於預測結果對分類預測建模算法進行評估。分類準確度是一種常用的度量標準,其通過預測的類別標籤來評估模型的性能。即使分類結果不是完美的,但對於許多分類任務來說這是個很好的開始。
某些任務可能需要預測每個樣本類別成員的概率,而不是標籤。這為預測提供了額外的不確定性,評估預測概率的一種通用判斷方法是ROC曲線(積分面積)
你可能會遇到四種主要的分類任務類型,它們分別是:
讓我們來依次仔細研究每個類型。
二分類模型二分類[3]是指具有兩個類別標籤的分類任務。
示例包括:
通常,二分類任務涉及一個屬於正常狀態的類別和一個屬於異常狀態的類別。
例如,「 非垃圾郵件 」是正常狀態,而「 垃圾郵件 」是異常狀態。另一個示例是「 未檢測到癌症 」是涉及醫學檢查任務的正常狀態,而「 檢測到癌症 」是異常狀態。
正常狀態的類分配為類別標籤0,狀態異常的類分配為類別標籤1。
通常先預測每個樣本的伯努利概率分布模型,來對二分類任務進行建模。
伯努利分布是離散的概率分布,它涵蓋了事件的結果為0或1的兩種情況。假如結果預測為1,對於分類來說,這意味著模型預測了數據屬於1類,也可以說是異常狀態。
可以用於二分類的流行算法包括:
邏輯回歸(Logistic Regression)k最近鄰(k-Nearest Neighbors)支持向量機(Support Vector Machine)有些算法是專門為二分類問題而設計的,它們本身不支持兩個以上的類型分類。例如邏輯回歸和支持向量機。
接下來,讓我們仔細看一下數據集,通過實踐和思考來訓練出對二分類問題的直覺。
我們可以使用make_blobs()函數[4]生成一個合成的二分類數據集。
下面的示例代碼生成一個數據集,其中包含1,000個樣本,這些樣本屬於兩個類之一,每個類具有兩個輸入特徵。
# example of binary classification task
from numpy import where
from collections import Counter
from sklearn.datasets import make_blobs
from matplotlib import pyplot
# define dataset
X, y = make_blobs(n_samples=1000, centers=2, random_state=1)
# summarize dataset shape
print(X.shape, y.shape)
# summarize observations by class label
counter = Counter(y)
print(counter)
# summarize first few examples
for i in range(10):
print(X[i], y[i])
# plot the dataset and color the by class label
for label, _ in counter.items():
row_ix = where(y == label)[0]
pyplot.scatter(X[row_ix, 0], X[row_ix, 1], label=str(label))
pyplot.legend()
pyplot.show()首先運行示例,對創建的數據集進行匯總,將1000個樣本分為input(X)和output(y)元素。
然後匯總類標籤的分布,顯示該實例是屬於類別0還是類別1,並且每個類別中各有500個樣本。
接下來,總結數據集中的前10個樣本,顯示輸入值是數字,目標值是代表類成員類型的整數0或1。
(1000, 2) (1000,)
Counter({0: 500, 1: 500})
[-3.05837272 4.48825769] 0
[-8.60973869 -3.72714879] 1
[1.37129721 5.23107449] 0
[-9.33917563 -2.9544469 ] 1
[-11.57178593 -3.85275513] 1
[-11.42257341 -4.85679127] 1
[-10.44518578 -3.76476563] 1
[-10.44603561 -3.26065964] 1
[-0.61947075 3.48804983] 0
[-10.91115591 -4.5772537 ] 1最後,為數據集中的input變量創建散點圖,並根據其類值對點進行著色。
我們可以很直觀的區分兩個不同的集群。
二元分類數據集的散點圖
多類別分類模型
多類別分類[5]是指具有兩個以上類別標籤的分類任務。
示例包括:
與二分類不同,多類別分類沒有正常和異常結果的概念。相反,樣本被分類為屬於一系列已知類別中的一個。
在某些問題上,類標籤的數量可能非常大。例如,模型可以預測照片屬於面部識別系統中的數千個或數萬個面部之一。
涉及預測單詞序列的問題,例如文本翻譯模型,也可以視為一種特殊類型的多類別分類。要預測的單詞序列中的每個單詞都涉及一個多類分類,其中詞彙量定義了可以預測的可能類別的數量,其數量可能是成千上萬個單詞。
通常使用每個樣本的Multinoulli概率分布的模型來對多類分類任務進行建模。
所述Multinoulli概率分布是覆蓋情況下的事件將有一個明確的結果,例如離散概率分布ķ在{1,2,3,...,ķ }。對於分類,這意味著模型可以預測樣本屬於每個類別標籤的概率。
許多用於二分類的算法也可以用於解決多分類問題。
可用於多類分類的流行算法包括:
k最近鄰(k-Nearest Neighbors)梯度Boosting(Gradient Boosting)這涉及使用一種策略,該策略為每個類別與所有其他類別(稱為「一對多」)擬合多個二分類模型,或者為每對類別(稱為「一對一」)擬合一個模型。
一對多:為每個類別與其它所有類別擬合出一個二分類模型。可以使用這些策略進行多分類的二分類算法包括:
邏輯回歸(Logistic Regression)支持向量機(Support Vector Machine)接下來,讓我們仔細看一下數據集,通過實踐和思考來訓練出對多類分類問題的直覺。
我們可以使用make_blobs()函數[6]生成一個綜合的多類分類數據集。
下面的代碼表示生成一個數據集,其中包含1,000個示例,這些示例屬於三個類之一,每個類別具有兩個輸入特徵。
# example of multi-class classification task
from numpy import where
from collections import Counter
from sklearn.datasets import make_blobs
from matplotlib import pyplot
# define dataset
X, y = make_blobs(n_samples=1000, centers=3, random_state=1)
# summarize dataset shape
print(X.shape, y.shape)
# summarize observations by class label
counter = Counter(y)
print(counter)
# summarize first few examples
for i in range(10):
print(X[i], y[i])
# plot the dataset and color the by class label
for label, _ in counter.items():
row_ix = where(y == label)[0]
pyplot.scatter(X[row_ix, 0], X[row_ix, 1], label=str(label))
pyplot.legend()
pyplot.show()首先運行代碼,對創建的數據集進行匯總,將1000個樣本分為input(X)和output(y)。
然後匯總類別標籤的分布,顯示樣本屬於類別0,類別1或類別2,並且每個類中大約有333個示例。
接下來,展示數據集中的前10個樣本,顯示輸入值是數字,目標值是代表類別成員類型的整數。
(1000, 2) (1000,)
Counter({0: 334, 1: 333, 2: 333})
[-3.05837272 4.48825769] 0
[-8.60973869 -3.72714879] 1
[1.37129721 5.23107449] 0
[-9.33917563 -2.9544469 ] 1
[-8.63895561 -8.05263469] 2
[-8.48974309 -9.05667083] 2
[-7.51235546 -7.96464519] 2
[-7.51320529 -7.46053919] 2
[-0.61947075 3.48804983] 0
[-10.91115591 -4.5772537 ] 1最後,為數據集中的input變量創建散點圖,並根據其分類值對點進行著色。
我們可以很容易區分三個不同的集群。
多類分類數據集的散點圖
多標籤分類模型多標籤分類[7]是指具有兩個或多個分類標籤的分類任務,其中每個樣本可以預測一個或多個分類標籤。
考慮照片分類[8]的示例,其中給定的照片可能在場景中具有多個對象,並且模型可以預測照片中存在多個已知對象,例如「 自行車 」,「 蘋果 」,「 人 」等。
這與二分類和多分類不同,在二分類和多分類中,為每個樣本預測了單個分類標籤。
通常使用預測多個輸出的模型來對多標籤分類任務進行建模,而每個輸出都將作為伯努利概率分布(0,1分布)進行預測。本質上,這是對每個樣本進行多個二分類預測的模型。
用於二分類或多類分類的分類算法不能直接用於多標籤分類。可以使用標準分類算法的專用版本,即所謂的多標籤版本算法,包括:
多標籤決策樹(Multi-label Decision Trees)多標籤隨機森林(Multi-label Random Forests)多標籤梯度Boosting(Multi-label Gradient Boosting)另一種方法是使用單獨的分類算法來預測每個類別的標籤。
接下來,讓我們仔細看一下數據集,通過實踐和思考來訓練出對多標籤分類問題的直覺。
我們可以使用make_multilabel_classification()函數[9]生成一個由算法合成的多標籤分類數據集。
下面的代碼表示生成一個包含1,000個示例的數據集,每個示例都有兩個輸入特徵。一共有三個類別,每個類別可能帶有兩個標籤(0或1)之一。
# example of a multi-label classification task
from sklearn.datasets import make_multilabel_classification
# define dataset
X, y = make_multilabel_classification(n_samples=1000, n_features=2, n_classes=3, n_labels=2, random_state=1)
# summarize dataset shape
print(X.shape, y.shape)
# summarize first few examples
for i in range(10):
print(X[i], y[i])首先運行代碼,對創建的數據集進行匯總,將1000個示例分為input(X)和output(y)。
接下來,展示數據集中的前10個樣本,顯示輸入值是數字,目標值是代表類標籤成員類別的整數。
(1000, 2) (1000, 3)
[18. 35.] [1 1 1]
[22. 33.] [1 1 1]
[26. 36.] [1 1 1]
[24. 28.] [1 1 0]
[23. 27.] [1 1 0]
[15. 31.] [0 1 0]
[20. 37.] [0 1 0]
[18. 31.] [1 1 1]
[29. 27.] [1 0 0]
[29. 28.] [1 1 0]
不平衡分類模型不平衡分類[10]是指在分類任務中,每個類別中的樣本數不均勻分布。
通常,不平衡分類任務是二分類任務,其中訓練數據集中的大多數樣本屬於正常類,而少數樣本屬於異常類。
示例包括:
這些問題被建模為二分類任務,儘管可能會需要專門的技術。
通過對多數類別進行欠採樣或過採樣,使用專門的建模算法來修正訓練數據集中樣本的組成。
示例包括:
當將模型擬合到訓練數據集上時,可以使用專門的建模算法來關注少數群體,例如成本敏感的機器學習算法。
示例包括:
成本敏感邏輯回歸(Cost-sensitive Logistic Regression)成本敏感決策樹(Cost-sensitive Decision Trees)成本敏感支持向量機(Cost-sensitive Support Vector Machines)最後,由於報告分類準確性可能會產生誤差,因此可能需要其他性能指標來進行評估。
示例包括:
接下來,讓我們仔細看一下數據集,通過實踐和思考來訓練出對不平衡分類問題的直覺。
我們可以使用make_classification()函數[13]生成一個由代碼合成的不平衡二分類數據集。
下面的代碼表示生成一個數據集,其中包含1,000個示例,這些示例屬於兩個類之一,每個類具有兩個輸入特徵。
# example of an imbalanced binary classification task
from numpy import where
from collections import Counter
from sklearn.datasets import make_classification
from matplotlib import pyplot
# define dataset
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_classes=2, n_clusters_per_class=1, weights=[0.99,0.01], random_state=1)
# summarize dataset shape
print(X.shape, y.shape)
# summarize observations by class label
counter = Counter(y)
print(counter)
# summarize first few examples
for i in range(10):
print(X[i], y[i])
# plot the dataset and color the by class label
for label, _ in counter.items():
row_ix = where(y == label)[0]
pyplot.scatter(X[row_ix, 0], X[row_ix, 1], label=str(label))
pyplot.legend()
pyplot.show()首先運行代碼,對創建的數據集進行匯總,將1000個示例分為input(X)和output(y)。
然後匯總類標籤的分布,顯示出來嚴重的類別不平衡,其中約980個示例屬於類別0,約20個示例屬於類別1。
接下來,展示數據集中的前10個樣本,顯示輸入值是數字,目標值是代表類成員類別的整數。在這種情況下,我們可以看到,大多數示例都屬於類別0。
(1000, 2) (1000,)
Counter({0: 983, 1: 17})
[0.86924745 1.18613612] 0
[1.55110839 1.81032905] 0
[1.29361936 1.01094607] 0
[1.11988947 1.63251786] 0
[1.04235568 1.12152929] 0
[1.18114858 0.92397607] 0
[1.1365562 1.17652556] 0
[0.46291729 0.72924998] 0
[0.18315826 1.07141766] 0
[0.32411648 0.53515376] 0最後,為數據集中的輸入變量創建散點圖,並根據其類值對點進行著色。
我們可以看到一個主類,屬於類別0,一些零散的則屬於類別1。可以看到,具有不平衡類標籤屬性的數據集在建模方面更具挑戰性。
不平衡二元分類數據集的散點圖
摘要總結本文展示了機器學習中不同類型的分類預測建模方法。
具體來說,以下幾點:
分類預測建模涉及到將類別標籤分配給輸入樣本(測試集);二分類是指預測兩個類別之一,而多分類則涉及預測兩個以上的類別之一;不平衡分類指的是樣本在各個類別之間分布不相等時的分類任務;參考資料[1]分類: https://en.wikipedia.org/wiki/Statistical_classification
[2]標籤編碼: https://machinelearningmastery.com/how-to-prepare-categorical-data-for-deep-learning-in-python/
[3]二分類: https://en.wikipedia.org/wiki/Binary_classification
[4]make_blobs()函數: https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_blobs.html
[5]多類別分類: https://en.wikipedia.org/wiki/Multiclass_classification
[6]make_blobs()函數: https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_blobs.html
[7]多標籤分類: https://en.wikipedia.org/wiki/Multi-label_classification
[8]照片分類: https://machinelearningmastery.com/object-recognition-with-deep-learning/
[9]make_multilabel_classification()函數: https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html
[10]不平衡分類: https://machinelearningmastery.com/what-is-imbalanced-classification/
[11]隨機欠採樣: https://machinelearningmastery.com/random-oversampling-and-undersampling-for-imbalanced-classification/
[12]SMOTE過採樣: https://machinelearningmastery.com/smote-oversampling-for-imbalanced-classification/
[13]make_classification()函數: https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html