獨家 | 機器學習中的四種分類任務(附代碼)

作者:Jason Brownlee

翻譯:陳丹

校對:楊毅遠

全文約4400字,建議閱讀18分鐘

本文爲大家介紹了機器學習中常見的四種分類任務。分別是二分類、多類別分類、多標籤分類、不平衡分類,並提供了實戰代碼。

 標籤:機器學習

機器學習是一個研究領域,其涉及到從示例中學習的算法。

 

分類是一項需要使用機器學習算法去學習如何根據問題域爲示例分配類標籤的任務。一個簡單易懂的例子是將電子郵件分爲“垃圾郵件”或“非垃圾郵件”。

 

在機器學習中,你可能會遇到許多不同類型的分類任務,並且每種模型都會使用專門的建模方法。

 

在本教程中,您將瞭解機器學習中不同類型的分類預測建模。

 

讀完這篇教程後,你將學會:

  • 將類別標籤分配給輸入示例的分類預測模型

  • 二分類是指預測兩個類別之一,而多分類則涉及預測兩個以上類別之一。

  • 多標籤分類涉及爲每個示例預測一個或多個類別,不平衡分類是指各個類別之間的示例分佈不相等的分類任務。

讓我們開始吧!

 

教程概述

本教程分爲五個部分,他們分別是:

1. 分類預測模型

2. 二分類

3. 多類別分類

4. 多標籤分類

5. 不平衡分類

 

分類預測建模

在機器學習中,分類是指針對輸入數據中的給定示例預測其類別標籤的預測性建模問題。

例如:

  • 給定一個示例,將其歸爲垃圾郵件或者非垃圾郵件。

  • 給定一個手寫字符,將其分類爲一個已知字符。

  • 根據最近的用戶行爲,將其歸爲流失用戶或者非流失用戶。

從建模的角度來看,分類需要一個訓練數據集,其中包含許多可供學習的輸入和輸出示例。

 

模型將會使用訓練數據集並計算如何將輸入數據映射到最符合的特定類別標籤。因此,訓練數據集必須具有一定代表性,並且每一個類別都應有許多的樣本。

 

類別標籤通常是字符串,例如“垃圾郵件”,“非垃圾郵件”。必須先將類別標籤映射爲數值,然後才能用於建模算法。該過程通常稱爲標籤的編碼,標籤編碼將唯一的整數分配給每個類標籤,例如“垃圾郵件” = 0,“非垃圾郵件” = 1。

 

對於分類預測建模問題進行建模,有許多不同類型的分類算法可供使用。

 

關於如何對某一問題選擇一個最合適的算法,目前沒有很好的理論。反而我們通常建議相關人員通過受控試驗來探究什麼樣的算法和算法配置在給定的分類問題上能實現最佳性能。

 

分類模型的好壞通常用分類預測算法的結果進行評估。分類準確率是一種流行的度量標準,用於根據預測的類別標籤評估模型的性能。分類準確率並不是完美的,但對於許多分類任務來說是一個很好的起點。

 

某些分類任務可能會要求預測每個樣本屬於各個類別的概率而不是給出一個類別標籤,對於應用程序或用戶隨後的預測而言,這增加了額外的不確定性。用於評估預測概率的常用方法是ROC曲線。

 

你可能會遇到四種主要的分類任務類型;他們分別是:

  • 二分類

  • 多類別分類

  • 多標籤分類

  • 不平衡分類

讓我們依次深入研究。

 

二分類

二分類是指具有兩個類別標籤的分類任務。

 

示例包括:

  • 電子郵件垃圾郵件檢測(是否爲垃圾郵件)。

  • 用戶的流失預測(流失與否)。

  • 用戶的轉化預測(購買或不購買)。

通常,二分類任務包含一個屬於正常狀態的類別和另一個屬於異常狀態的類別。

 

例如,“非垃圾郵件”是正常狀態,“垃圾郵件”是異常狀態。另一個例子是“未檢測到癌症”是醫學測試任務的正常狀態,而“檢測到癌症”是異常狀態。

 

正常狀態的類別分配爲類別標籤0,狀態異常的類別分配爲類別標籤1。

 

通常使用預測每個樣本的伯努利概率分佈的模型來對二分類任務進行建模。

 

伯努利分佈是一種離散概率分佈,它包含了事件的二元結果,即要麼爲1,要麼爲0。對於分類問題,這種模型將預測樣本屬於“1”這種類別的概率,或者說是異常類別的概率。

 

可用於二分類的常用算法包括:

  • 邏輯迴歸

  • k最近鄰算法

  • 決策樹

  • 支持向量機

  • 樸素貝葉斯

 

有些算法是專爲二分類而設計的,它們本身並不支持兩個以上的類別,例如邏輯迴歸和支持向量機。

 

接下來,讓我們通過數據集找到一些對二分類問題的直觀感受。

 

我們可以使用make_blobs()函數生成一個合成的二分類數據集。

 

下面的例子生成一個包含1000個樣本的數據集,這些樣本屬於兩個類別之一,每個類具有兩個輸入特徵。

 

# 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個示例分爲輸入(X)和輸出(y)元素的數據集。

 

然後這段代碼將彙總類標籤的分佈,顯示樣本屬於類0或類1,並且每個類中有500個示例。

 

接下來,這段代碼會爲我們展示數據集中的前十個樣本屬於類0還是類1

運行結果如下:

 

 

最後,使用數據集中的輸入變量創建散點圖,並根據每個點所屬的類別對點進行着色。

我們可以看到所有數據明顯被分爲兩部分。

 

多類別分類

多類別分類是指具有兩個以上類別標籤的分類任務。

 

例如:

  • 人臉識別。

  • 植物種類識別。

  • 光學字符識別。

 

與二分類不同,多分類沒有正常和異常結果的概念。相反,樣本被分類爲屬於一系列已知類別中的一個。

 

在某些問題上,類標籤的數量可能非常大。例如,模型可以預測照片屬於臉部識別系統中成千上萬的臉中的一個。

 

涉及預測單詞序列的問題,例如文本翻譯模型,也可以視爲一種特殊類型的多類別分類。要預測的單詞序列中的每個單詞都涉及一個多類別分類,其中詞彙的大小定義了可以預測的類別數量,其大小可能是成千上萬個單詞。

 

通常使用多元概率分佈模型來對多類別分類任務進行建模。

 

多元分佈是一種離散概率分佈,它包含的事件具有確定的分類結果,例如{1,2,3,…,K}中的K。對於這種分類任務,這意味着模型可以預測樣本屬於每個類別標籤的概率。

 

許多二分類算法也可以用於多分類。

 

可用於多類分類的流行算法包括:

  • k最近鄰算法。

  • 決策樹。

  • 樸素貝葉斯。

  • 隨機森林。

  • 梯度提升。

用於解決二分類問題的算法可以適用於多分類問題。

 

這涉及使用一種策略,該策略爲每個類別與所有其他類別(稱爲“一對多”)擬合多個二分類模型,或者爲每一對類別(稱爲“一對一”)擬合一個模型。

  • 一對多:針對每個類別與所有其他類別擬合一個二分類模型。

  • 一對一:爲每對類別設計一個二分類模型。

可以使用這些策略進行多分類的二分類算法包括:

  • 邏輯迴歸。

  • 支持向量機。

接下來,讓我們通過數據集找到一些對於多分類問題的直觀感受。

 

我們可以使用make_blobs()函數生成一個合成的多分類數據集。

 

下面的示例生成一個數據集,其中包含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個樣本分爲輸入(X)和輸出(y)元素的數據集。

 

然後彙總的類標籤的分佈,顯示樣本屬於類0,類1或類2,並且每個類中大約有333個樣本。

 

接下來,彙總數據集中的前10個樣本,顯示輸入值是數字,目標值是對應類別的整數。

分類結果:

 

 

最後,爲數據集中的輸入變量創建散點圖,並根據其類別對點進行着色。

 

我們可以看到,正如我們所期望的,數據集被區分爲三個不同的區域。

 

多標籤分類

多標籤分類是指具有兩個或以上分類標籤的分類任務,其中每個樣本可以預測爲一個或多個類別。

 

考慮照片分類的示例,其中給定照片可能在場景中具有多個對象,並且模型可以預測照片中存在多個已知對象,例如“自行車”,“蘋果”,“人”等。

 

這與二分類和多分類不同,在二分類和多分類中,每個樣本的預測只含有單個分類標籤。

 

通常使用預測多個輸出的模型來對多標籤分類任務進行建模,而每個輸出都將作爲伯努利概率分佈進行預測。本質上,這是一個對每個樣本進行多個二分類預測的模型。

 

用於二分類或多分類的分類算法不能直接用於多標籤分類。可以使用標準分類算法的專用版本,即所謂的算法的多標籤版本,包括:

  • 多標籤決策樹

  • 多標籤隨機森林

  • 多標籤梯度增強

另一種方法是使用單獨的分類算法來預測每個類別的標籤。

 

接下來,讓我們通過數據集找到一些對於多標籤問題的直觀感受。

 

我們可以使用make_multilabel_classification()函數生成一個合成的多標籤分類數據集。

 

下面的例子生成一個包含1000個樣本的數據集,每個樣本都有兩個輸入特徵。一共有三個類別,每個類別可能帶有兩個標籤(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])

 

首先運行這段示例代碼,它會對創建的數據集進行彙總並顯示1,000個樣本分爲輸入(X)和輸出(y)元素的數據集。

 

接下來,彙總數據集中的前10個樣本,顯示輸入值是數字,目標值是類別對應的整數。

運行結果:

 

不平衡分類

不平衡分類是指其中每個類別中的示例數不均勻分佈的分類任務。

 

通常,不平衡分類任務是二分類任務,其中訓練數據集中的大多數樣本屬於正常類,而少數樣本屬於異常類。

 

例如:

  • 詐騙識別。

  • 離羣值檢測。

  • 醫學診斷測試。

這些問題在建模中被視爲二分類任務,儘管可能需要專門的技術。

 

可以使用專門的方法例如對多數類進行欠採樣或對少數類進行過採樣來更改訓練數據集中樣本的組成。

 

例如:

  • 隨機欠採樣。

  • SMOTE過採樣。

在將模型擬合到訓練數據集上時,可以使用專門的建模算法來採集少數類別的數據,例如成本敏感型機器學習算法。

 

例如:

  • 成本敏感的Logistic迴歸。

  • 成本敏感的決策樹。

  • 成本敏感的支持向量機。

最後,由於分類報告的準確性可能會產生誤導,因此可能需要其他性能指標。

 

例如:

  • 準確率。

  • 召回率。

  • F值。

接下來,讓我們通過數據集找到一些對於不平衡問題的直觀感受。

 

我們可以使用make_classification()函數生成一個合成的不平衡二分類數據集。

 

下面的示例生成一個數據集,其中包含1000個樣本,這些樣本屬於兩類之一,每個類具有兩個輸入特徵。

 

# 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個示例分爲輸入(X)和輸出(y)元素的數據集。

 

然後彙總類標籤的分佈,其顯示出嚴重的類別不平衡,其中約980個樣本屬於類0,約20個樣本屬於類1。

 

接下來,彙總數據集中的前10個樣本,顯示輸入值是數字,目標值是類別對應的整數。在這種情況下,我們可以看到大多數樣本都屬於類0。

分類結果:

 

 

最後,爲數據集中的輸入變量創建散點圖,並根據其類別對點進行着色。

 

我們可以看到一個主要的聚類,其中包含屬於類0的樣本,還有一些零散的樣本,屬於類1。一般認爲,具有這種不平衡類標籤屬性的數據集在建模時更具挑戰性。 

 

進一步閱讀

如果您想進行更深入瞭解,本節提供了更多的有關該主題的資源。

 

統計分類——維基百科:

https://en.wikipedia.org/wiki/Statistical_classification

二分類——維基百科:

https://en.wikipedia.org/wiki/Binary_classification

多分類——維基百科:

https://en.wikipedia.org/wiki/Multiclass_classification

多標籤分類——維基百科:

https://en.wikipedia.org/wiki/Multi-label_classification

多類別和多標籤算法——scikit-learn API:

https://scikit-learn.org/stable/modules/multiclass.html

 

總結

在本教程中,你瞭解到了機器學習中不同類型的分類預測建模。

 

具體來說,你學習到:

  • 將類別標籤分配給輸入示例的分類預測模型

  • 二分類是指預測兩個類別之一,而多分類則涉及預測兩個以上類別之一。

  • 多標籤分類涉及爲每個示例預測一個或多個類別,不平衡分類是指各個類別之間的示例分佈不相等的分類任務。

原文標題:

4 Types of Classification Tasks in Machine Learning

原文鏈接:

https://machinelearningmastery.com/types-of-classification-in-machine-learning/


如您想與我們保持交流探討、持續獲得數據科學領域相關動態,包括大數據技術類、行業前沿應用、講座論壇活動信息、各種活動福利等內容,敬請掃碼加入數據派THU粉絲交流羣,紅數點恭候各位。

編輯:於騰凱

校對:洪舒越

譯者簡介

陳丹,復旦大學大三在讀,主修預防醫學,輔修數據科學。對數據分析充滿興趣,但初入這一領域,還有很多很多需要努力進步的空間。希望今後能在翻譯組進行相關工作的過程中拓展文獻閱讀量,學習到更多的前沿知識,同時認識更多有共同志趣的小夥伴!

翻譯組招募信息

工作內容:需要一顆細緻的心,將選取好的外文文章翻譯成流暢的中文。如果你是數據科學/統計學/計算機類的留學生,或在海外從事相關工作,或對自己外語水平有信心的朋友歡迎加入翻譯小組。

你能得到:定期的翻譯培訓提高志願者的翻譯水平,提高對於數據科學前沿的認知,海外的朋友可以和國內技術應用發展保持聯繫,THU數據派產學研的背景爲志願者帶來好的發展機遇。

其他福利:來自於名企的數據科學工作者,北大清華以及海外等名校學生他們都將成爲你在翻譯小組的夥伴。

點擊文末“閱讀原文”加入數據派團隊~

轉載須知

如需轉載,請在開篇顯著位置註明作者和出處(轉自:數據派ID:DatapiTHU),並在文章結尾放置數據派醒目二維碼。有原創標識文章,請發送【文章名稱-待授權公衆號名稱及ID】至聯繫郵箱,申請白名單授權並按要求編輯。

發佈後請將鏈接反饋至聯繫郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。

點擊“閱讀原文”擁抱組織

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章