[乾貨]如何從不均衡類中進行機器學習

Candy_GL發表於2018-09-26

參考自:https://www.svds.com/learning-imbalanced-classes/

引言

如果您剛從機器學習課程中學習,那麼您所使用的大多數資料集都相當容易。除其他事項外,在構建分類器時,樣本類是平衡的,這意味著每個類的例項數量大致相同。教師通常使用清理過的資料集,以專注於講授特定的演算法或技術而不受其他問題的干擾。通常你會在兩個維度中顯示如下的例子,用不同顏色(或形狀)的點代表類:

clip_image002

分類演算法的目標是試圖學習一個能區分兩者的分隔符(分類器)。有很多種方法,基於各種數學、統計或幾何假設:

clip_image004

但當我們開始觀察一個真實的,未清洗過的資料,首先意識到的就是許多噪聲和資料的不均衡性。真實資料的點圖通常看起來像下面這樣:

clip_image006

主要的問題是這些類是不平衡的:紅色的點數量遠遠小於藍色點數量。

對不平衡類的研究通常認為不平衡是指少數類佔比少於10%到20%。事實上,資料集可能比這更不平衡。—這裡是一些例子:

1、 每年大約有2%的信用卡賬戶被欺詐[1]。(大多數欺詐檢測域嚴重不平衡)

2、 對疾病進行醫學篩查通常是在沒有這種情況的大量人群中進行的,用它來檢測少數人(例如,美國的艾滋病毒流行率為0.4%)。

3、磁碟驅動器故障大約每年1%次。

4、線上廣告的轉化率被估計在clip_image008clip_image010

5、工廠生產缺陷率通常在0.1%左右。

這些領域中有許多是不均衡的問題,它們就是我稱之為“大海撈針”的問題,機器學習分類器用來對大量負(無興趣)的樣本進行分類,以找到少數正的(有意義的,值得警惕的)案例。

當遇到這樣的問題時,使用標準的演算法會很難解決這些問題。傳統的演算法往往偏向多數類,因為他們的損失函式嘗試優化大量如錯誤率之類的引數,而沒有考慮資料的分佈情況[2]。在最壞的情況下,少數的樣本被視為大多數類的離群值並被忽略。學習演算法只生成一個簡單的分類器,將每個樣本分為多數類。

這似乎是一種病態行為,但實際上它不是。事實上,如果你的目標是最大限度地提高簡單的精度(或者等價地,最小化錯誤率),這是一個完全可以接受的解決方案。但是如果我們假設稀有類的例子更重要,那麼我們必須更加小心並更復雜地處理這個問題。

如果你處理這些問題,並想就如何解決這些問題提出實際建議,請繼續讀下去。

【注意】:這篇文章的重點是提供關於如何解決這些問題的真知灼見和具體建議。然而,這不是一個通過程式碼逐行進行編碼的教程。我有用JupyterNotebooks(連結接在文末)通過實驗來嘗試這些想法,但這篇文章將解釋一些基本的理念和原則。

處理不平衡資料

對不平衡資料的學習是近二十年來機器學習領域的研究熱點。這是許多論文、講習班、特別會議和學位論文的主題(最近的調查有大約220篇參考文獻)。儘管研究者們已經嘗試了大量的技術,但結果各異,答案卻很少。第一次面對這個問題的資料科學家經常問,當我的資料不平衡時,我該怎麼辦?這與通常所問的“哪個學習演算法最好”的答案的緣由一樣,沒有明確的答案。沒有明確的答案是因為:這取決於資料。

也就是說,這裡有一個行之有效的方法的大致輪廓。下面這些方法大體上按付出的effort的順序列出:

•什麼也不做。有時候你很幸運,什麼也不需要做。您可以在所謂的自然(或分層)分佈上進行訓練,有時都不需要修改就可以執行。

•平衡訓練集的一些方式:

◦過取樣少數類。

◦降取樣多數類。

◦合成新的少數類。

•拋棄少數類的一些樣本,切換到異常檢測框架。

•在演算法層上或在此之後:

◦調整類權重(誤判成本)。

◦調整判定的閾值。

◦修改現有的演算法使得對稀有類更敏感。

•構造一種全新的演算法來使得在不平衡資料上表現良好。

題外話:評價的注意事項

首先,快速瀏覽。在討論如何利用不平衡資料對分類器進行訓練之前,我們必須討論如何正確地評估一個分類器。這再怎麼強調都不為過。只有度量正確的事物,你才能取得進步。

1、不要使用準確性(或錯誤率)來評估分類器!它有兩個重要的問題。準確性天然的用0.50做閾值在類之間進行判決,當類不平衡時這通常是錯誤的。第二,分類準確度是基於對分類錯誤數的簡單計數,當然您應該知道的不止於此。你應該知道哪些類是混淆的,在哪裡(最高分數,底部結束,整個?)如果您不理解這些要點,閱讀分類器評估的基礎知識的第2部分可能會有幫助。您應該使用ROC曲線、精準率-召回率曲線、提升曲線或gain(增益)曲線來視覺化分類器的效能。

clip_image012

clip_image013

2、不要試圖從分類器(通過score[3]或預測函式)獲取硬分類(標籤)。相反,通過proba或predict_proba獲取概率估計是可取的。

3、當你得到概率估計時,不要盲目地使用0.50做為決策閾值來劃分類。檢視效能曲線,並決定使用什麼閾值(請參閱下一節瞭解更多資訊)。在早期的論文中有許多錯誤,因為研究人員天真地使用0.5作為劃分閾值。

4、無論你為訓練做了哪些工作,總是要基於自然(分層)分佈來測試你的分類器的工作情況。參考:sklearn.cross_validation.stratifiedkfold。

5、你可能沒有得到概率估計,但如果你需要的話,使用校準(見sklearn.calibration.CalibratedClassifierCV)。

上面第一個子彈形的二維圖形總比單個數字的內容更豐富,但是如果你需要一個單一資料的度量,其中的一個在精度方面更好:

1、ROC曲線下面積(AUC)是一個很好的一般統計量。它等於隨機正例在隨機反例之上的概率。

2、F1得分是精度和召回率的調和平均數。它通常用在文字處理中,聚合度量被探尋的時候。

3、Cohen’s Kappa值是一個評估統計數字,計算預期會有多少同意數。

過取樣和取樣

最簡單的方法需要修改處理步驟,只需調整樣本集直到它們平衡為止。隨機過取樣複製了少數例項以增加其數量。隨機欠取樣降低了取樣的多數類數量。一些資料科學家(初衷)認為過取樣較優越,因為它產生了更多的資料,而欠取樣將資料扔掉。但是要考慮,複製資料並不是沒有代價,因為它會導致重複的資料,這使得變數看起來比它們的方差要低。其積極的結果是,它重複了錯誤的數目:如果分類器在原始的少數資料集上產生假陰性錯誤,並且該資料集被複制五次,分類器將在新集上產生六個錯誤。相反,欠取樣可以使獨立的變數看起來要比他們自身有更高的方差。

因此,機器學習論文表明使用過取樣,欠取樣,利用自然分佈得到的是一種混合的結果。

clip_image014

大多數機器學習包可以進行簡單的抽樣調整。像R包裡面在這方面採用了一些特定的不平衡資料集抽樣技術,並且scikit-learn.cross_validation擁有基本的取樣演算法。

華勒斯等人的貝葉斯論證

可能最好的理論論證和實踐建議都在這篇論文《Class Imbalance, Redux, by Wallace, Small, Brodley and Trikalinos[4]》中提出。他們對多數類欠取樣的觀點進行了爭論。他們的論點是數學方面的並且是透徹的,但在這裡,我只提出一個他們用來提出自己觀點的例子。

他們認為兩個類在一些解釋變數的分佈的尾部必須區分開來。假設你有兩個類,有一個獨立的變數,x。每個類都由一個標準差為1的高斯函式生成。類1的平均數是1,類2的平均數是2。我們將武斷地稱類2為多數階級。他們看起來像這樣:

clip_image016

給定一個x值,您將使用什麼閾值來確定它來自哪個類?顯而易見的是,兩者之間最好的分隔線在它們的中點,x=1.5,顯示為豎線:如果一個新的x低於1.5,它很可能是第1類,否則,它很可能就是第2類。當從例子中學習時,我們希望1.5處的判別截斷值是我們所能得到的,如果類是平均分佈的,這大概是我們應該得到的。x軸上的點顯示每個分佈產生的樣本。

但是我們已經說過類1是少數類,所以我們假設有10個樣本,50個來自2類的樣本。我們很可能會學習到像這樣的移動分離線:

clip_image018

我們可以通過欠取樣大數類與少數類相匹配的方式使結果做得更好。問題是我們所學的分離線具有很高的可變性(因為樣品比較小),如圖所示(十個樣品顯示,產生十條垂直線):

clip_image020

因此,最後一步是使用bagging來組合這些分類器。整個過程如下所示:

clip_image022

這種技術尚未在Scikit-learn中實現,雖然名為blagging.py(balanced bagging)可實現BaggingClassifier,然而它將自身的原始樣本轉向了聚合。

基於鄰居的方法

過度和欠取樣隨機選取的樣本來調整比例。其他方法仔細檢查樣本空間,並根據它們的鄰域決定該做什麼。

例如,Tomek links是連結自己的近鄰相對類的例項對。換句話說,它們是相互對立的兩個非常接近的樣本對。

clip_image024

Tomek演算法尋找這樣的配對,並消除大多數這樣的樣本對。其目的是釐清少數類與多數類的邊界,使少數類區域更加鮮明。上面的圖顯示了一個用Tomek連結消除的簡單例子。R包unbalanced實現了Tomek連結消除演算法,並實現了大量具體的不平衡資料集抽樣技術。Scikit-learn沒有構建這樣的內建模組,但也有一些獨立的軟體包(例如,TomekLink)。

合成新樣本:SMOTE和後裔

另一個研究方向不僅僅涉及樣本的重取樣,更包含的是新樣本的合成。該方法最著名的例子是Chawla的SMOTE(合成少數類的過取樣技術)系統。這個想法是通過在現有的樣本中插入新的少數類樣本。這個過程大致如下。假設我們有一組多數和少數的樣本,和以前一樣:

clip_image025

SMOTE通常情況下是成功的,並導致許多變體,擴充套件和適應不同的概念學習演算法。SMOTE和變數在R的unbalanced包,Python的UnbalancedDataset包中均可獲取到。

意識到SMOTE潛在的侷限性也很重要。因為它通過在稀少的樣本之間進行插值操作來實現,所以它只能在可用的樣本中生成樣本例項,而不是在外部。在形式上,SMOTE只能在基於現有的少數樣本的凸包上進行填充,而不能在外部區域建立新的樣本。

調整類權重

許多機器學習工具包都有方法來調整類的“重要性”。例如Scikit-learn,有許多分類器,有一個可選的class_weight引數可以設定高於某個值。這裡有一個例子,直接從Scikit-learn文件中獲取,顯示增加十倍的少數類的權重的影響。實體黑線顯示分離的邊界,當使用預設設定(兩個類權重相等),而虛線為少數類的class_weight引數被改為十倍後的邊界。

clip_image027

正如您所看到的,少數類的重要性得到提高(其錯誤被認為比其他類的錯誤更為代價高),同時對分離的超平面進行了調整以減少損失。

應該注意的是,調整類的重要性通常只對類錯誤的代價(假陰性,如果少數類是正數)有影響。相應的可以調整分離面來減少這些代價。當然,如果分類器在訓練集錯誤裡沒有錯誤,那麼就不會出現調整,因而改變類權重可能會沒有效果。

其他方法

這篇文章從相對簡單、易上手的方法裡面集中討論瞭如何從不平衡資料中學習分類器。其中大部分內容涉及在應用標準學習演算法之前或之後調整資料。值得簡單提一下其他一些方法。

新演算法

學習不平衡類仍然是機器學習領域中一個正在進行的研究領域,每年都有新的演算法被引入。在結束之前,我會提到一些最近的先進演算法的進展。

2014年Goh和Rudin發表了一篇論文《Box Drawings for Learning with Imbalanced Data[5]》,介紹了從傾斜的樣本資料中學習的兩種演算法。這些演算法試圖在少數類樣本叢集的基礎上構造“盒子”(實際上是軸並行的超矩形):

clip_image029

他們的目標是建立一個簡明、易懂的少數類樣本的表達方式。他們的方程式懲罰了盒子的數量,該懲罰是以一種正則化的形式進行服務。

它們引入兩種演算法,其中一種(精確框)使用混合整數程式設計來提供精確但相當昂貴的解決方案;另一種(快速框)使用更快的聚類方法生成初始框,隨後將其細化。實驗結果表明,這兩種演算法在大量測試資料集上都能很好地發揮作用。

早些時候我提到,解決不平衡問題的一種方法是拋棄少數類的樣本,把它當作單一類(或異常檢測)處理。最近一項異常檢測技術的效果出奇地好。Liu,Ting和Zhou介紹了一種叫做隔離森林[6]的方法,它試圖通過學習隨機森林然後測量需要將每個特定的資料點分離出來的分隔面的平均數找出異常資料。生成的數字可以用來計算每個資料點的異常分數,也可以被解釋為該樣本可能屬於的少數類。事實上,作者用高度不平衡的資料測試了他們的系統,並報告了很好的結果。這篇論文由Ting和Albrecht[7]follow-up,後續的文章中,Liu和wells[8]介紹了一個類似近鄰合奏的想法,它能夠克服隔離森林的一些缺點。

購買或建立更多資料

最後一點是,這篇博文關注的是不平衡類的情況,在預設假設下,你得到了不平衡的資料,而你只需要處理不平衡。在某些情況下,如在Kaggle的競爭,給你一個固定的資料集,你不能要求更多。

但是你可能會遇到一個相關的,更難的問題:在這個稀有類裡你沒有足夠的樣本。以上的技術都不可行。你怎麼辦?

在一些現實世界域中,您可以購買或構造稀有類的樣本。這是機器學習中一個正在進行的研究領域。如果資料稀少,只需要有人來可靠的標記這些資料,一個常用的方法是通過眾包服務Mechanical Turk。人類標籤的可靠性可能是一個問題,但在機器學習中已經完成了將人類標籤與可靠性優化相結合的工作。最後,Claudia Perlich在她的談話All The Data and Still Not Enough中給出資料稀少或資料根本不存在的問題,可以巧妙的使用替代變數轉換問題的例子,基本上是使用代理變數與latent variables使看似不可能的問題變得可能。與此相關的策略是使用遷移學習來學習一個問題,並用很少的樣本將結果轉換到另一個問題,如下所述

資源與進一步閱讀

1. Several Jupyter notebooks are available illustrating aspects of imbalanced learning.

o A notebook illustrating sampled Gaussians, above, is at Gaussians.ipynb.

o A simple implementation of Wallace’s method is available at blagging.py. It is a simple fork of the existing bagging implementation of sklearn, specifically ./sklearn/ensemble/bagging.py.

o A notebook using this method is available at ImbalancedClasses.ipynb. It loads up several domains and compares blagging with other methods under different distributions.

2. Source code for Box Drawings in MATLAB is available from: http://web.mit.edu/rudin/www/code/BoxDrawingsCode.zip

3. Source code for Isolation Forests in R is available at: https://sourceforge.net/projects/iforest/

Thanks to Chloe Mawerfor her Jupyter Notebook design work.

【備註】

1. Natalie Hockham makes this point in her talk Machine learning with imbalanced data sets, which focuses on imbalance in the context of credit card fraud detection.

2. By definition there are fewer instances of the rare class, but the problem comes about because the cost of missing them (a false negative) is much higher. 

3. The details in courier are specific to Python’s Scikit-learn.

4. “Class Imbalance, Redux”. Wallace, Small, Brodley and Trikalinos. IEEE Conf on Data Mining. 2011.

5.  Box Drawings for Learning with Imbalanced Data.” Siong Thye Goh and Cynthia Rudin. KDD-2014, August 24–27, 2014, New York, NY, USA.

6. “Isolation-Based Anomaly Detection”. Liu, Ting and Zhou. ACM Transactions on Knowledge Discovery from Data, Vol. 6, No. 1. 2012.

7. “Efficient Anomaly Detection by Isolation Using Nearest Neighbour Ensemble.” Bandaragoda, Ting, Albrecht, Liu and Wells. ICDM-2014

--------------------- 本文來自 阿爾法旺旺 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/yingwei13mei/article/details/73921391?utm_source=copy 

相關文章