機器不學習:如何處理數據中的「類別不平衡」?


機器不學習 jqbxx.com -機器學習好網站

機器學習中常常會遇到數據的類別不平衡(class imbalance),也叫數據偏斜(class skew)。以常見的二分類問題為例,我們希望預測病人是否得了某種罕見疾病。但在歷史數據中,陽性的比例可能很低(如百分之0.1)。在這種情況下,學習出好的分類器是很難的,而且在這種情況下得到結論往往也是很具迷惑性的。

以上面提到的場景來說,如果我們的分類器總是預測一個人未患病,即預測為反例,那么我們依然有高達99.9%的預測准確率。然而這種結果是沒有意義的,這提出了今天的第一個問題,如何有效在類別不平衡的情況下評估分類器?

當然,本文最終希望解決的問題是:在數據偏斜的情況下,如何得到一個不錯的分類器?如果可能,是否可以找到一個較為簡單的解決方法,而規避復雜的模型、數據處理,降低我們的工作量。

1. 類別不平衡下的評估問題

對於平衡的數據,我們一般都用准確率(accuracy),也就是(1-誤分率)作為一般的評估標准。這種標准的默認假設前提是:“數據是平衡的,正例與反例的重要性一樣,二分類器的閾值是0.5。”在這種情況下,用准確率來對分類器進行評估是合理的。

而當類別不平衡時,准確率就非常具有迷惑性,而且意義不大。給出幾種主流的評估方法:

  • ROC是一種常見的替代方法,全名receiver operating curve,計算ROC曲線下的面積是一種主流方法
  • Precision-recall curve和ROC有相似的地方,但定義不同,計算此曲線下的面積也是一種方法
  • Precision@n是另一種方法,特制將分類閾值設定得到恰好n個正例時分類器的precision
  • Average precision也叫做平均精度,主要描述了precision的一般表現,在異常檢測中有時候會用
  • 直接使用Precision也是一種想法,但此時的假設是分類器的閾值是0.5,因此意義不大

至於哪種方法更好,一般來看我們在極端類別不平衡中更在意“少數的類別”,因此ROC不像precision-recall curve那樣更具有吸引力。在這種情況下,Precision-recall curve不失為一種好的評估標准,相關的分析可以參考[2]。還有一種做法是,僅分析ROC曲線左邊的一小部分,從這個角度看和precision-recall curve有很高的相似性。

同理,因為我們更在意罕見的正例,因此precision尤為重要,因此average precision (macro)也是常見的評估標准。此處特意要提醒兩點:

  • 沒有特殊情況,不要用准確率(accuracy),一般都沒什么幫助
  • 如果使用precision,請注意調整分類閾值,precision@n更有意義

本文的目的不是介紹一般的分類評估標准,簡單的科普可以參看:如何解釋召回率與准確率?

2. 解決類別不平衡中的“奇淫巧技”有什么?

對於類別不平衡的研究已經有很多年了,在資料[1]中就介紹了很多比較復雜的技巧。結合我的了解舉幾個簡單的例子:

  • 對數據進行采用的過程中通過相似性同時生成並插樣“少數類別數據”,叫做SMOTE算法
  • 對數據先進行聚類,再將大的簇進行隨機欠采樣或者小的簇進行數據生成
  • 把監督學習變為無監督學習,舍棄掉標簽把問題轉化為一個無監督問題,如異常檢測
  • 先對多數類別進行隨機的欠采樣,並結合boosting算法進行集成學習

科普文[3]中介紹了一部分上面提到的算法,可以進行參考。但本文重點不是介紹這些算法,而恰恰相反,我還是推薦一些更為簡單但一般有效的做法。

3. 簡單通用的算法有哪些?

除了第二節中提到的一些看起來略微復雜的算法,最簡單的算法無外乎三種,在大部分教材中都有涉獵[4]:

  • 對較多的那個類別進行欠采樣(under-sampling),舍棄一部分數據,使其與較少類別的數據相當
  • 對較少的類別進行過采樣(over-sampling),重復使用一部分數據,使其與較多類別的數據相當
  • 閾值調整(threshold moving),將原本默認為0.5的閾值調整到 較少類別/(較少類別+較多類別)即可

當然很明顯我們可以看出,第一種和第二種方法都會明顯的改變數據分布,我們的訓練數據假設不再是真實數據的無偏表述。在第一種方法中,我們浪費了很多數據。而第二類方法中有無中生有或者重復使用了數據,會導致過擬合的發生。

因此欠采樣的邏輯中往往會結合集成學習來有效的使用數據,假設正例數據n,而反例數據m個。我們可以通過欠采樣,隨機無重復的生成(k=n/m)個反例子集,並將每個子集都與相同正例數據合並生成k個新的訓練樣本。我們在k個訓練樣本上分別訓練一個分類器,最終將k個分類器的結果結合起來,比如求平均值。這就是一個簡單的思路,也就是Easy Ensemble [5]。

但不難看出,其實這樣的過程是需要花時間處理數據和編程的,對於很多知識和能力有限的人來說難度比較大。特此推薦兩個簡單易行且效果中上的做法:

  • 簡單的調整閾值,不對數據進行任何處理。此處特指將分類閾值從0.5調整到正例比例
  • 使用現有的集成學習分類器,如隨機森林或者xgboost,並調整分類閾值

提出這樣建議的原因有很多。首先,簡單的閾值調整從經驗上看往往比過采樣和欠采樣有效 [6]。其次,如果你對統計學知識掌握有限,而且編程能力一般,在集成過程中更容易出錯,還不如使用現有的集成學習並調整分類閾值。

4. 一個簡單但有效的方案

經過了上文的分析,我認為一個比較靠譜的解決方案是:

  1. 不對數據進行過采樣和欠采樣,但使用現有的集成學習模型,如隨機森林
  2. 輸出隨機森林的預測概率,調整閾值得到最終結果
  3. 選擇合適的評估標准,如precision@n

這種方法難度很低,也規避了不少容易出錯的地方。我們使用了集成學習降低過擬合風險,使用閾值調整規避和采樣問題,同時選擇合適的評估手段以防止偏見。而且這些都是現成的模型,5-10行的python代碼就可以實現。有興趣的朋友可以在這個基礎上進行更多探索,而把這個結果作為一個基准(baseline)。

當然,更多復雜的操作是可以的,比如[7]就在欠采樣集成后使用了邏輯回歸作為集成分類器來學習不同子訓練集的權重,並通過L1正則自動舍棄掉一部分基學習器。當然,我很懷疑這種結果是否比得上簡單的處理模式。最重要的是,大部分機器學習實踐者還不具備調整模型結構能力,因此花過多的時間在復雜模型上容易入不敷出。

本文的目的不是為了給出一個唯一的解釋。僅僅是考慮到讀者的時間、經驗以及編程能力后,所給出的一個門檻較低但結果不錯的思路,請大家辯證的看。

* 本文倉促寫成,難免有跳躍、疏漏。

[1] He, H. and Garcia, E.A., 2009. Learning from imbalanced data. IEEE Transactions on knowledge and data engineering21(9), pp.1263-1284.

[2] Davis, J. and Goadrich, M., 2006, June. The relationship between Precision-Recall and ROC curves. In Proceedings of the 23rd international conference on Machine learning (pp. 233-240). ACM.

[3] How to handle Imbalanced Classification Problems in machine learning?

[4] 周志華。機器學習,清華大學出版社,3.7,2016。

[5] Liu, T.Y., 2009, August. Easyensemble and feature selection for imbalance data sets. In Bioinformatics, Systems Biology and Intelligent Computing, 2009. IJCBS'09. International Joint Conference on (pp. 517-520). IEEE.

[6] Han, J., Pei, J. and Kamber, M., 2011. Data mining: concepts and techniques. Elsevier.

[7] Micenková, B., McWilliams, B. and Assent, I., 2015. Learning representations for outlier detection on a budget. arXiv preprint arXiv:1507.08104.

更多精彩內容,機器不學習官方網站 jqbxx.com

機器學習中常常會遇到數據的類別不平衡(class imbalance),也叫數據偏斜(class skew)。以常見的二分類問題為例,我們希望預測病人是否得了某種罕見疾病。但在歷史數據中,陽性的比例可能很低(如百分之0.1)。在這種情況下,學習出好的分類器是很難的,而且在這種情況下得到結論往往也是很具迷惑性的。

以上面提到的場景來說,如果我們的分類器總是預測一個人未患病,即預測為反例,那么我們依然有高達99.9%的預測准確率。然而這種結果是沒有意義的,這提出了今天的第一個問題,如何有效在類別不平衡的情況下評估分類器?

當然,本文最終希望解決的問題是:在數據偏斜的情況下,如何得到一個不錯的分類器?如果可能,是否可以找到一個較為簡單的解決方法,而規避復雜的模型、數據處理,降低我們的工作量。

1. 類別不平衡下的評估問題

對於平衡的數據,我們一般都用准確率(accuracy),也就是(1-誤分率)作為一般的評估標准。這種標准的默認假設前提是:“數據是平衡的,正例與反例的重要性一樣,二分類器的閾值是0.5。”在這種情況下,用准確率來對分類器進行評估是合理的。

而當類別不平衡時,准確率就非常具有迷惑性,而且意義不大。給出幾種主流的評估方法:

  • ROC是一種常見的替代方法,全名receiver operating curve,計算ROC曲線下的面積是一種主流方法
  • Precision-recall curve和ROC有相似的地方,但定義不同,計算此曲線下的面積也是一種方法
  • Precision@n是另一種方法,特制將分類閾值設定得到恰好n個正例時分類器的precision
  • Average precision也叫做平均精度,主要描述了precision的一般表現,在異常檢測中有時候會用
  • 直接使用Precision也是一種想法,但此時的假設是分類器的閾值是0.5,因此意義不大

至於哪種方法更好,一般來看我們在極端類別不平衡中更在意“少數的類別”,因此ROC不像precision-recall curve那樣更具有吸引力。在這種情況下,Precision-recall curve不失為一種好的評估標准,相關的分析可以參考[2]。還有一種做法是,僅分析ROC曲線左邊的一小部分,從這個角度看和precision-recall curve有很高的相似性。

同理,因為我們更在意罕見的正例,因此precision尤為重要,因此average precision (macro)也是常見的評估標准。此處特意要提醒兩點:

  • 沒有特殊情況,不要用准確率(accuracy),一般都沒什么幫助
  • 如果使用precision,請注意調整分類閾值,precision@n更有意義

本文的目的不是介紹一般的分類評估標准,簡單的科普可以參看:如何解釋召回率與准確率?

2. 解決類別不平衡中的“奇淫巧技”有什么?

對於類別不平衡的研究已經有很多年了,在資料[1]中就介紹了很多比較復雜的技巧。結合我的了解舉幾個簡單的例子:

  • 對數據進行采用的過程中通過相似性同時生成並插樣“少數類別數據”,叫做SMOTE算法
  • 對數據先進行聚類,再將大的簇進行隨機欠采樣或者小的簇進行數據生成
  • 把監督學習變為無監督學習,舍棄掉標簽把問題轉化為一個無監督問題,如異常檢測
  • 先對多數類別進行隨機的欠采樣,並結合boosting算法進行集成學習

科普文[3]中介紹了一部分上面提到的算法,可以進行參考。但本文重點不是介紹這些算法,而恰恰相反,我還是推薦一些更為簡單但一般有效的做法。

3. 簡單通用的算法有哪些?

除了第二節中提到的一些看起來略微復雜的算法,最簡單的算法無外乎三種,在大部分教材中都有涉獵[4]:

  • 對較多的那個類別進行欠采樣(under-sampling),舍棄一部分數據,使其與較少類別的數據相當
  • 對較少的類別進行過采樣(over-sampling),重復使用一部分數據,使其與較多類別的數據相當
  • 閾值調整(threshold moving),將原本默認為0.5的閾值調整到 較少類別/(較少類別+較多類別)即可

當然很明顯我們可以看出,第一種和第二種方法都會明顯的改變數據分布,我們的訓練數據假設不再是真實數據的無偏表述。在第一種方法中,我們浪費了很多數據。而第二類方法中有無中生有或者重復使用了數據,會導致過擬合的發生。

因此欠采樣的邏輯中往往會結合集成學習來有效的使用數據,假設正例數據n,而反例數據m個。我們可以通過欠采樣,隨機無重復的生成(k=n/m)個反例子集,並將每個子集都與相同正例數據合並生成k個新的訓練樣本。我們在k個訓練樣本上分別訓練一個分類器,最終將k個分類器的結果結合起來,比如求平均值。這就是一個簡單的思路,也就是Easy Ensemble [5]。

但不難看出,其實這樣的過程是需要花時間處理數據和編程的,對於很多知識和能力有限的人來說難度比較大。特此推薦兩個簡單易行且效果中上的做法:

  • 簡單的調整閾值,不對數據進行任何處理。此處特指將分類閾值從0.5調整到正例比例
  • 使用現有的集成學習分類器,如隨機森林或者xgboost,並調整分類閾值

提出這樣建議的原因有很多。首先,簡單的閾值調整從經驗上看往往比過采樣和欠采樣有效 [6]。其次,如果你對統計學知識掌握有限,而且編程能力一般,在集成過程中更容易出錯,還不如使用現有的集成學習並調整分類閾值。

4. 一個簡單但有效的方案

經過了上文的分析,我認為一個比較靠譜的解決方案是:

  1. 不對數據進行過采樣和欠采樣,但使用現有的集成學習模型,如隨機森林
  2. 輸出隨機森林的預測概率,調整閾值得到最終結果
  3. 選擇合適的評估標准,如precision@n

這種方法難度很低,也規避了不少容易出錯的地方。我們使用了集成學習降低過擬合風險,使用閾值調整規避和采樣問題,同時選擇合適的評估手段以防止偏見。而且這些都是現成的模型,5-10行的python代碼就可以實現。有興趣的朋友可以在這個基礎上進行更多探索,而把這個結果作為一個基准(baseline)。

當然,更多復雜的操作是可以的,比如[7]就在欠采樣集成后使用了邏輯回歸作為集成分類器來學習不同子訓練集的權重,並通過L1正則自動舍棄掉一部分基學習器。當然,我很懷疑這種結果是否比得上簡單的處理模式。最重要的是,大部分機器學習實踐者還不具備調整模型結構能力,因此花過多的時間在復雜模型上容易入不敷出。

本文的目的不是為了給出一個唯一的解釋。僅僅是考慮到讀者的時間、經驗以及編程能力后,所給出的一個門檻較低但結果不錯的思路,請大家辯證的看。

* 本文倉促寫成,難免有跳躍、疏漏。


[1] He, H. and Garcia, E.A., 2009. Learning from imbalanced data. IEEE Transactions on knowledge and data engineering21(9), pp.1263-1284.

[2] Davis, J. and Goadrich, M., 2006, June. The relationship between Precision-Recall and ROC curves. In Proceedings of the 23rd international conference on Machine learning (pp. 233-240). ACM.

[3] How to handle Imbalanced Classification Problems in machine learning?

[4] 周志華。機器學習,清華大學出版社,3.7,2016。

[5] Liu, T.Y., 2009, August. Easyensemble and feature selection for imbalance data sets. In Bioinformatics, Systems Biology and Intelligent Computing, 2009. IJCBS'09. International Joint Conference on (pp. 517-520). IEEE.

[6] Han, J., Pei, J. and Kamber, M., 2011. Data mining: concepts and techniques. Elsevier.

[7] Micenková, B., McWilliams, B. and Assent, I., 2015. Learning representations for outlier detection on a budget. arXiv preprint arXiv:1507.08104.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM