關於不平衡數據集以及代價敏感學習的探討

不平衡數據集大量存在於現實生活中,在無法重新採樣或者重新採樣代價過大時,如何處理不平衡數據集也是一門學問,所以也是發文探討一下。

一般來說,除了重新採樣外,會有如下一些處理不平衡數據集的方法:

1.人工生成數據樣本

2.採用對數據不平衡不敏感的分類演算法

3.對模型進行懲罰

方法1中,有一種構造人工數據樣本的方法:SMOTE(Synthetic Minority Over-sampling Technique),是一種過採樣方法。SMOTE演算法相對簡單,且基本成熟,在python的很多包中都可以找到實現,論文地址:jair.org/media/953/live

當然,SMOTE演算法也有一定的局限性。具體有兩項,一是在近鄰選擇時,存在一定的盲目性。在演算法執行過程中,需要確定K值,即選擇幾個近鄰樣本,這個需要根據具體的實驗數據和實驗人自己解決。二是該演算法無法克服非平衡數據集的數據分布問題,容易產生分布邊緣化的問題。由於負類樣本的分布決定了其可選擇的近鄰,如果一個負類樣本處在負類樣本的邊緣,則由此負類樣本和近鄰樣本產生的樣本也會處在邊緣,從而無法確定正負類的分類邊界。

方法2中,樹模型往往在類別不均衡數據上表現不錯。它使用基於類變數的劃分規則去創建分類樹,因此可以強制地將不同類別的樣本分開。這也是為什麼很多初學者喜歡用樹模型,擬合能力不夠時就使上各種基於樹的boosting方法(這也導致了一些機器學習比賽比到後面就是在比誰的xgboost調參調得好)。當然好用是一個最大的原因,另一個原因恐怕也是一些別的模型對不平衡數據集較為敏感。

方法3中,先舉兩個例子:在醫療中,「將病人誤診為健康人的代價」與「將健康人誤診為病人的代價」不同;在金融信用卡盜用檢測中,「將盜用誤認為正常使用的代價」與將「正常使用誤認為盜用的代價」也不同。那麼一個最簡單的思想就是:在演算法學習過程中損失函數設置的不同,即加權損失函數。

先來看看二分類的交叉熵公式:

-frac{1}{n}Sigma(ycdot ln(pre)+(1-y)cdot ln(1-pre))

如果賦權,那麼是這樣:

-frac{1}{n}Sigma(alpha cdot ycdot ln(pre)+eta cdot (1-y)cdot ln(1-pre))

如果將y和pre看成one-hot變數,那麼上面的式子可以看成矩陣pre,y,以及懲罰矩陣[α,β]的一些運算(話說有誰知道對矩陣每行求和的數學符號怎麼寫么=_=,有的話求教,我把矩陣的公式補上)

那麼現在把正例和反例判錯的代價不同了,如何選擇[α,β]那就至關重要了,現在大部分人的觀點是懲罰矩陣對於不同的分類問題大不相同。我現在大膽猜想每一種損失函數有一個基準的懲罰矩陣,值和正反例佔比,以及正負樣本判斷正確的概率有關。不知道是否有數學好的同學能夠推出來交叉熵二分類時的基準矩陣,我目前採用的是:

left[ (1+frac{m^{+}}{m^{-}})^{0.25},(1+frac{m^{-}}{m^{+}})^{0.25} 
ight]

採用此矩陣是因為在此情況下,把所有樣本判為正例和把所有樣本判為反例的損失函數大小基本一致。

我在一些不公開的數據集上進行過一些測試(深度神經網路),用過採樣的方法平衡訓練集,進行訓練,然後再原有的測試集測試,發現相對會更容易的有過擬合的現象(即使加上了一定比例的drop_out)。但是如果是對損失函數加權的神經網路,相對不容易過擬合,且效果更好。

寥寥數筆,拋磚引玉,以待來者。


推薦閱讀:

Perceptual loss for Real time Style Transfer and Super-Resolution 論文閱讀
《大演算:機器學習的終極演演算法將如何改變我們的未來,創造新紀元的文明》
譜聚類的consistency
BOW 演算法,被CNN 打爆之前的王者

TAG:機器學習 | 數據挖掘 |