Machine Learning中的數據不平衡問題

在機器學習問題中,經常會遇到數據分佈不平衡的問題。例如在垃圾郵件分類問題中,只有少數的樣本屬於垃圾郵件,大多數樣本都是非垃圾郵件,這樣訓練出來的分類模型對垃圾郵件檢測率往往較低。這裏介紹一些解決思路,以供大家參考!我們約定:多數類樣本使用Large表示,少數類樣本使用Small表示,r=S/L。

Weighted loss function:加權損失函數,在sklearn中,通過調節class_weight參數來設置不同類損失函數的權重。假設總樣本個數爲n,屬於1類的樣本個數等於m,如果class_weight="balanced",那麼損失權重C_0=\frac{n}{2*(n-m)},C_1=\frac{n}{2*m} ,某一類的輸入樣本數越多,這一類的懲罰項越小,這樣就能很好的平衡輸入樣本不均衡帶來的學習偏移問題。

Undersampling:欠採樣,一種最爲簡單的方式,就是從多數類中隨機抽取部分樣本從而減少多數類的樣本數,使樣本數據達到一種相對的平衡。

Edited Nearest Neighbor:ENN,對於Large類別的部分樣本點,如果它的K近鄰樣本大多屬於其他類,那麼我們就將這樣的樣本點刪除。

Repeated Nearest Neighbor:這個方法就是不斷的重複ENN過程,直到不能再刪除爲止。

Tomek Link Removal:託梅克鏈,如果兩個不同類別的樣本點,彼此是最近鄰,則刪除多數類樣本點。本質上仍然是一個欠採樣過程。


Oversampling:過採樣,對少數類樣本進行有放回的抽樣,不斷的增加少數類樣本點,從而達到平衡,但是這種方法可能導致過擬合。

SMOTE:Synthetic Minority Oversampling Technique

For each point p in S:
1. 計算點p在S中的k個最近鄰
2. 有放回地隨機抽取R≤k個鄰居
3. 對於這R個點,每一個點與點p組成一條直線,在這條直線上隨機選取一個點作爲新的樣本,從而產生R個新的點。
4. 將這些新的點加入S中

SMOTE改進1

少數類Small裏面的每一個點p:
  1. 計算點p在整個訓練集上的m個最近鄰,並且m'代表其中屬於Large類的數量
  2. 如果 m'= m, p 是一個噪聲,不做任何操作
  3. 如果 0 ≤m'≤m/2, 則說明p很安全,不做任何操作
  4. 如果 m/2 ≤ m'≤ m, 那麼我們需要在這個點附近生成一些新的少數類點,此時將p加入到一個集合D中.最後對集合D中的每一個點使用SMOTE算法生成新的樣本

SMOTE改進2:此方法基於上面的smote1,用到其中的集合D

對於D中的每一個點p:
    1.在Small和Large中分別得到k個最近鄰樣本Sk和Lk
    2.在Sk中選出α比例的樣本點和p作隨機的線性插值產生新的少數類樣本
    3.在Lk中選出1−α比例的樣本點和p作隨機的線性插值產生新的少數類樣本


另外還有一些集成方法應用於解決樣本不平衡問題,例如每次從多數類中抽取樣本,使得每個模型的多數類樣本數量和少數類樣本數量相同,最後將這些模型集成起來。


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