天天看點

七招教你處理非平衡資料——避免得到一個“假”模型

這篇部落客要介紹處理不平衡資料的技巧,那麼什麼是不平衡資料呢?比如說一位醫生做了一個病例對照研究,資料集由病例10人和對照990人組成,建立好一個邏輯回歸模型後,并對建立的模型進行内部驗證,居然發現其正确率高達99%,然後把他興奮壞了,覺得可以将該成果發表到頂級期刊上,從此走上人生巅峰。然而,我們可以發現,該模型不管怎麼預測,都能得到正常的結果,所謂的99%的正确率,原來是建立在1000個人中10個病例都發現不了的基礎上。從這個例子可以看出,當遇到不平衡資料時,以總體分類準确率為學習目标的傳統分類算法會過多地關注多數類,進而使得少數類樣本的分類性能下降。

介紹

不平衡資料廣泛存在于各個領域,但在二分類問題中尤其常見,表現為其中的一個類别所占的比例遠遠高于另外的一個類。比如:銀行欺詐檢測、市場營銷、網絡入侵檢測等領域。

這些領域中的資料集有哪些共同點呢?可以發現在這些領域中使用的資料通常不到1%,但一旦發生就是一件“有趣”的事件(例如使用信用卡的欺詐者的違規交易,使用者點選廣告或原本已損壞的伺服器在掃描其網絡)。然而,大多數機器學習算法對于不平衡資料集都不能很好地工作。以下七種技術可以幫助我們訓練分類器來檢測異常類。

七招教你處理非平衡資料——避免得到一個“假”模型

1. 使用正确的評估名額

對使用不平衡資料生成的模型應用不當的評估名額是相當危險的。想象一下,模型訓練資料如上圖所示,若使用精度來衡量模型的好壞,将所有測試樣本分類為“0”的模型将具有很好的準确性(99.8%),但顯然這種模型不會為我們提供任何有價值的資訊。

在這種情況下,可以應用其他評估名額替代精度名額,例如:

準确度/特異度:有多少個標明的執行個體相關。

召回率/靈敏度:選擇了多少個相關執行個體。

f1評分:準确度和召回率的調和平均數。

matthews相關系數(mcc):觀察和預測的二進制分類之間的相關系數。

roc曲線下的面積(auc):真陽性率與假陽性率之間的關系。

2. 重新采樣訓練集

除了使用不同的評估标準外,還可以使用不同的資料集。有兩種方法使不平衡的資料集來建立一個平衡的資料集——欠采樣和過采樣。

2.1. 欠采樣

欠采樣是通過減少豐富類的大小來平衡資料集,當資料量足夠時就該使用此方法。通過儲存所有稀有類樣本,并在豐富類别中随機選擇與稀有類别樣本相等數量的樣本,可以檢索平衡的新資料集以進一步模組化。

2.2. 過采樣

注意到欠采樣和過采樣這兩種方法相比而言,都沒有絕對的優勢。這兩種方法的應用取決于它适用的用例和資料集本身。另外将過采樣和欠采樣結合起來使用也是成功的。

3. 以正确的方式使用k-fold交叉驗證

值得注意的是,使用過采樣方法來解決不平衡問題時應适當地應用交叉驗證。這是因為過采樣會觀察到罕見的樣本,并根據分布函數應用自舉生成新的随機資料,如果在過采樣之後應用交叉驗證,那麼我們所做的就是将我們的模型過拟合于一個特定的人工引導結果。這就是為什麼在過度采樣資料之前應該始終進行交叉驗證,就像實作特征選擇一樣。隻有重複采樣資料可以将随機性引入到資料集中,以確定不會出現過拟合問題。

k-fold交叉驗證就是把原始資料随機分成k個部分,在這k個部分中選擇一個作為測試資料,剩餘的k-1個作為訓練資料。交叉驗證的過程實際上是将實驗重複做k次,每次實驗都從k個部分中選擇一個不同的部分作為測試資料,剩餘的資料作為訓練資料進行實驗,最後把得到的k個實驗結果平均。

4. 組合不同的重采樣資料集

成功泛化模型的最簡單方法是使用更多的資料,問題是像邏輯回歸或随機森林這樣開箱即用的分類器,傾向于通過舍去稀有類來泛化模型。一個簡單的最佳實踐是建立n個模型,每個模型使用稀有類别的所有樣本和豐富類别的n個不同樣本。假設想要合并10個模型,那麼将保留例如1000例稀有類别,并随機抽取10000例豐富類别。然後,隻需将10000個案例分成10塊,并訓練10個不同的模型。

七招教你處理非平衡資料——避免得到一個“假”模型

如果擁有大量資料,這種方法是簡單并且是可橫向擴充的,這是因為可以在不同的叢集節點上訓練和運作模型。集合模型也趨于泛化,這使得該方法易于處理。

之前的方法可以很好地将稀有類别和豐富類别之間的比例進行微調,最好的比例在很大程度上取決于所使用的資料和模型。但是,不是在整體中以相同的比例訓練所有模型,是以值得嘗試合并不同的比例。如果10個模型被訓練,有一個模型比例為1:1(稀有:豐富)和另一個1:3甚至是2:1的模型都是有意義的。一個類别獲得的權重依賴于使用的模型。

七招教你處理非平衡資料——避免得到一個“假”模型

6. 叢集豐富類

7. 設計自己的模型

所有之前的方法都集中在資料上,并将模型保持為固定的元件。但事實上,如果設計的模型适用于不平衡資料,則不需要重新采樣資料,著名的xgboost已經是一個很好的起點,是以設計一個适用于不平衡資料集的模型也是很有意義的。

通過設計一個代價函數來懲罰稀有類别的錯誤分類而不是分類豐富類别,可以設計出許多自然泛化為稀有類别的模型。例如,調整svm以懲罰稀有類别的錯誤分類。

七招教你處理非平衡資料——避免得到一個“假”模型

結束語

本文不是一個排外的技術清單,而是處理不平衡資料的一些建議。沒有适合所有問題的最佳方法或模型,強烈建議嘗試不同的技術和模型來評估哪些方法最有效并嘗試創造性地結合不同的方法。同樣值得注意的是,在不平衡類别發生的許多領域中,随着“市場規則”的不斷變化,需要檢查過去的資料是否過時。

推薦閱讀

<a href="http://www.kdnuggets.com/2016/08/learning-from-imbalanced-classes.html">從不平衡類中學習</a>

<a href="http://www.kdnuggets.com/2016/04/unbalanced-classes-svm-random-forests-python.html">使用python處理不平衡類、svm、随機森林和決策樹</a>

<a href="http://www.kdnuggets.com/2017/01/tidying-data-python.html">使用python整理資料</a>

作者資訊

文章原标題《7 techniques to handle imbalanced data》,作者:ye wu, rick radewagen,譯者:海棠,審閱:6816816151

附件為原文的pdf

繼續閱讀