1. 程式人生 > >機器學習 —— 類不平衡問題與SMOTE過取樣演算法

機器學習 —— 類不平衡問題與SMOTE過取樣演算法

轉自:https://www.cnblogs.com/Determined22/p/5772538.html

 

在前段時間做本科畢業設計的時候,遇到了各個類別的樣本量分佈不均的問題——某些類別的樣本數量極多,而有些類別的樣本數量極少,也就是所謂的類不平衡(class-imbalance)問題。

      本篇簡述了以下內容:

      什麼是類不平衡問題

      為什麼類不平衡是不好的

      幾種解決方案

      SMOTE過取樣演算法

      進一步閱讀

什麼是類不平衡問題

      類不平衡(class-imbalance)是指在訓練分類器中所使用的訓練集的類別分佈不均。比如說一個二分類問題,1000個訓練樣本,比較理想的情況是正類、負類樣本的數量相差不多;而如果正類樣本有995個、負類樣本僅5個,就意味著存在類不平衡。

      在後文中,把樣本數量過少的類別稱為“少數類”。

      但實際上,資料集上的類不平衡到底有沒有達到需要特殊處理的程度,還要看不處理時訓練出來的模型在驗證集上的效果。有些時候是沒必要處理的。

為什麼類不平衡是不好的

從模型的訓練過程來看

      從訓練模型的角度來說,如果某類的樣本數量很少,那麼這個類別所提供的“資訊”就太少。

      使用經驗風險(模型在訓練集上的平均損失)最小化作為模型的學習準則。設損失函式為0-1 loss(這是一種典型的均等代價的損失函式),那麼優化目標就等價於錯誤率最小化(也就是accuracy最大化)。考慮極端情況:1000個訓練樣本中,正類樣本999個,負類樣本1個。訓練過程中在某次迭代結束後,模型把所有的樣本都分為正類,雖然分錯了這個負類,但是所帶來的損失實在微不足道,accuracy已經是99.9%,於是滿足停機條件或者達到最大迭代次數之後自然沒必要再優化下去,ok,到此為止,訓練結束!於是這個模型……

      模型沒有學習到如何去判別出少數類。

從模型的預測過程來看

      考慮二項Logistic迴歸模型。輸入一個樣本 xx ,模型輸出的是其屬於正類的概率 y^y^ 。當 y^>0.5y^>0.5 時,模型判定該樣本屬於正類,否則就是屬於反類。

      為什麼是0.5呢?可以認為模型是出於最大後驗概率決策的角度考慮的,選擇了0.5意味著當模型估計的樣本屬於正類的後驗概率要大於樣本屬於負類的後驗概率時就將樣本判為正類。但實際上,這個後驗概率的估計值是否準確呢?

      從機率(odds)的角度考慮:機率表達的是樣本屬於正類的可能性與屬於負類的可能性的比值。模型對於樣本的預測機率為 y^1−y^y^1−y^ 。

      模型在做出決策時,當然希望能夠遵循真實樣本總體的正負類樣本分佈:設 θθ 等於正類樣本數除以全部樣本數,那麼樣本的真實機率為 θ1−θθ1−θ 。當觀測機率大於真實機率時,也就是 y^>θy^>θ 時,那麼就判定這個樣本屬於正類。

      雖然我們無法獲悉真實樣本總體,但之於訓練集,存在這樣一個假設:訓練集是真實樣本總體的無偏取樣。正是因為這個假設,所以認為訓練集的觀測機率 θ^1−θ^θ^1−θ^ 就代表了真實機率 θ1−θθ1−θ 。

      所以,在這個假設下,當一個樣本的預測機率大於觀測機率時,就應該將樣本判斷為正類。

幾種解決方案

      目前主要有三種辦法:

      1. 調整 θθ 值

      根據訓練集的正負樣本比例,調整 θθ 值。   

      這樣做的依據是上面所述的對訓練集的假設。但在給定任務中,這個假設是否成立,還有待討論。

      2. 過取樣

      對訓練集裡面樣本數量較少的類別(少數類)進行過取樣,合成新的樣本來緩解類不平衡。

      下面將介紹一種經典的過取樣演算法:SMOTE。

      3. 欠取樣

      對訓練集裡面樣本數量較多的類別(多數類)進行欠取樣,拋棄一些樣本來緩解類不平衡。

SMOTE過取樣演算法

  JAIR'2002的文章《SMOTE: Synthetic Minority Over-sampling Technique》提出了一種過取樣演算法SMOTE。概括來說,本演算法基於“插值”來為少數類合成新的樣本。下面介紹如何合成新的樣本。

        設訓練集的一個少數類的樣本數為 TT ,那麼SMOTE演算法將為這個少數類合成 NTNT 個新樣本。這裡要求 NN 必須是正整數,如果給定的 N<1N<1 那麼演算法將“認為”少數類的樣本數 T=NTT=NT ,並將強制 N=1N=1 。

      考慮該少數類的一個樣本 ii ,其特徵向量為 xi,i∈{1,...,T}xi,i∈{1,...,T} :

      1. 首先從該少數類的全部 TT 個樣本中找到樣本 xixi 的 kk 個近鄰(例如用歐氏距離),記為 xi(near),near∈{1,...,k}xi(near),near∈{1,...,k} ;

      2. 然後從這 kk 個近鄰中隨機選擇一個樣本 xi(nn)xi(nn) ,再生成一個 00 到 11 之間的隨機數ζ1ζ1 ,從而合成一個新樣本 xi1xi1 :

 

xi1=xi+ζ1⋅(xi(nn)−xi)xi1=xi+ζ1⋅(xi(nn)−xi)

      3. 將步驟2重複進行 NN 次,從而可以合成 NN 個新樣本:xinew,new∈1,...,Nxinew,new∈1,...,N。

      那麼,對全部的 TT 個少數類樣本進行上述操作,便可為該少數類合成 NTNT 個新樣本。

      如果樣本的特徵維數是 22 維,那麼每個樣本都可以用二維平面上的一個點來表示。SMOTE演算法所合成出的一個新樣本 xi1xi1 相當於是表示樣本 xixi 的點和表示樣本 xi(nn)xi(nn) 的點之間所連線段上的一個點。所以說該演算法是基於“插值”來合成新樣本。

進一步閱讀

      有兩篇翻譯自國外部落格的文章:

      解決真實世界問題:如何在不平衡類上使用機器學習?

      從重取樣到資料合成:如何處理機器學習中的不平衡分類問題?

可以先讀中文的瞭解一下說了哪些事情,如果感興趣的話就去看英文原文來深入學習。  

 

參考:

《機器學習》,周志華

SMOTE: Synthetic Minority Over-sampling Technique,JAIR'2002

對於原創博文:如需轉載請註明出處http://www.cnblogs.com/Determined22/