1. 程式人生 > >機器不學習:如何處理資料中的「類別不平衡」?

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

轉自:

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

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

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

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

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

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

  • ROC是一種常見的替代方法,全名receiver operating curve,計算ROC曲線下的面積是一種主流方法
  • Precision-recall curve和ROC有相似的地方,但定義不同,計算此曲線下的面積也是一種方法
  • [email protected]
    是另一種方法,特製將分類閾值設定得到恰好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,請注意調整分類閾值,[email protected]更有意義

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

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. 選擇合適的評估標準,如[email protected]

這種方法難度很低,也規避了不少容易出錯的地方。我們使用了整合學習降低過擬合風險,使用閾值調整規避和取樣問題,同時選擇合適的評估手段以防止偏見。而且這些都是現成的模型,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.

[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有相似的地方,但定義不同,計算此曲線下的面積也是一種方法
  • [email protected]是另一種方法,特製將分類閾值設定得到恰好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,請注意調整分類閾值,[email protected]更有意義

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

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. 選擇合適的評估標準,如[email protected]

這種方法難度很低,也規避了不少容易出錯的地方。我們使用了整合學習降低過擬合風險,使用閾值調整規避和取樣問題,同時選擇合適的評估手段以防止偏見。而且這些都是現成的模型,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.

[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.