樣本不平衡的常用處理方法

數據不平衡

很多算法都有一個基本假設,那就是數據分佈是均勻的。當我們把這些算法直接應用於實際數據時,大多數情況下都無法取得理想的結果。因爲實際數據往往分佈得很不均勻,都會存在“長尾現象”,也就是所謂的“二八原理”。

不平衡程度相同的問題,解決的難易程度也可能不同,因爲問題難易程度還取決於我們所擁有數據有多大。可以把問題根據難度從小到大排個序:大數據+分佈均衡 < 大數據+分佈不均衡 < 小數據+數據均衡 < 小數據+數據不均衡。
說明:對於需要解決的問題,拿到數據後,首先統計可用訓練數據有多大,然後再觀察數據分佈情況。經驗表明,訓練數據中每個類別有5000個以上樣本,其實也要相對於特徵而言,來判斷樣本數目是不是足夠,數據量是足夠的,正負樣本差一個數量級以內是可以接受的,不太需要考慮數據不平衡問題(完全是經驗,沒有理論依據,僅供參考)。

類別不平橫會影響模型的效果

許多模型的輸出類別是基於閾值的,例如邏輯迴歸中小於0.5的爲反例,大於則爲正例。在數據不平衡時,默認的閾值會導致模型輸出傾向與類別數據多的類別。

如何解決

調整分類閾值,使得更傾向與類別少的數據。
選擇合適的評估標準,比如ROC或者F1,而不是準確度(accuracy)。
採樣法(sampling)來處理不平橫的問題。
分爲欠採樣(undersampling)和過採樣(oversampling)兩種,過採樣小樣本(SMOTE),欠採樣大樣本。

  • 過採樣:通過增加樣本中小類樣本的數據量來實現樣本均衡。其中較爲簡單的方式是直接複製小類樣本,形成數量上的均衡。但實際上,並沒有爲模型引入更多數據,過分強調正比例數據,會放大正比例噪音對模型的影響。即隨機過採樣採取簡單複製樣本的策略來增加少數類樣本,這樣容易產生模型過擬合的問題,即使得模型學習到的信息過於特別(Specific)而不夠泛化(General)。
  • 欠採樣:通過減少多數類樣本的樣本數量來實現樣本均衡。其中比較簡單直接的方法就是隨機去掉一些數據來減少多數類樣本的規模,但這種方法可能會丟失一些重要的信息。還有一種方法就是,假設少數類樣本數量爲N,那就將多數類樣本分爲N個簇,取每個簇的中心點作爲多數類的新樣本,再加上少數類的所有樣本進行訓練。這樣就可以保證了多數類樣本在特徵空間的分佈特性。
    數據合成
    SMOTE(Synthetic Minority Oversampling Technique)即合成少數類,它是基於隨機過採樣算法的一種改進方案,SMOTE算法的基本思想是對少數類樣本進行分析並根據少數類樣本人工合成新樣本添加到數據集中。
    針對少數類樣本的xix_{i},求出其kk近鄰,隨機選取kk緊鄰中一個樣本記爲xnx_{n}。生成一個0到1之間的隨機數r,然後根據Xnew=xi+r(xnxi)X_{new} = x_{i} + r * (x_{n} - x_{i})生成新數據。也可通過經過改進的抽樣的方法,在少數類中加入隨機噪聲等生成數據。
    對原數據的權值進行改變
    通過改變多數類樣本和少數類樣本數據在訓練時的權重來解決樣本不均衡的問題,是指在訓練分類器時,爲少數類樣本賦予更大的權值,爲多數類樣本賦予較小的權值。例如scikit-learn中的SVM算法,也稱作penalized-SVM,可以手動設置權重。若選擇balanced,則算法會設定樣本權重與其對應的樣本數量成反比。
    通過特徵選擇
    在樣本數據較爲不均衡,某一類別數據較少的情況下,通常會出現特徵分佈很不均衡的情況。例如文本分類中,有大量的特徵可以選擇。因此我們可以選擇具有顯著區分能力的特徵進行訓練,也能在一定程度上提高模型的泛化效果。
    通過組合集成方法解決
    通過訓練多個模型的方式解決數據不均衡的問題,是指將多數類數據隨機分成少數類數據的量N份,每一份與全部的少數類數據一起訓練成爲一個分類器,這樣反覆訓練會生成很多的分類器。最後再用組合的方式(bagging或者boosting)對分類器進行組合,得到更好的預測效果。簡單來說若是分類問題可採用投票法,預測問題可以採用平均值。這個解決方式需要很強的計算能力以及時間,但效果較好,相當於結合了組合分類器的優勢。

注:
採樣方法一般比直接調閾值效果好。
使用採樣方法一般可以提升模型的泛化能力,但有一定的過擬合的風險,應和正則搭配使用。
過採樣大部分時候比欠採樣效果好,但很難一概而論哪種方法好,還是要根據數據的特性具體討論。

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