機器學習中的訓練資料不平衡問題

當我們處理機器學習問題時,我們面臨的最大問題之一就是訓練資料不平衡的問題。不平衡資料的問題在於,學術界對於相同的定義、含義和可能的解決方案存在分歧。我們將在這裡嘗試用影象分類問題來解開訓練資料中不平衡類的神秘。

不平衡類的問題是什麼?

在一個分類問題中,當你想要預測一個或多個類的所有類中的樣本數量極少時,可能會遇到資料中類不平衡的問題。

例子

欺詐預測(欺詐的數量將大大低於真正的交易)

自然災害預測(不好的事件會比好的情況低很多)

在影象分類中識別惡性腫瘤(在一個訓練樣本中,腫瘤的影象比沒有腫瘤的影象要小得多)

為什麼這是個問題?

由於兩個主要原因:

對於實時不平衡的類,我們沒有得到最佳化的結果,因為模型/演算法從來沒有充分地檢視基礎類

它會產生一個驗證或測試樣本的問題,因為很難在類中進行表示,因為少數類的觀察次數極少

解決這個問題的不同方法有哪些?

有三種主要方法建議各有利弊:

欠取樣 - 隨機刪除具有足夠觀察值的類,以便兩個類的比較比率在我們的資料中顯著。雖然這種方法非常簡單,但很有可能我們刪除的資料可能包含有關重要資訊預測類。

過取樣 -對於不平衡類別,隨機增加觀察值的數量,這些觀察值只是現有樣本的副本。理想情況下,這給我們足夠數量的樣本進行播放。過取樣可能導致過度擬合訓練資料

合成取樣(SMOTE) -該技術要求綜合製造與使用最近鄰居分類的現有類似的不平衡類別的觀測值。問題是當觀察次數是極少數類時要做什麼。例如,我們可能只有一幅我們想要使用影象分類演算法識別的稀有物種的圖片

儘管每種方法都有各自的優點,但沒有什麼特定的啟發式方法可以使用。

影象分類中的不平衡類

在本節中,我們將找到一個影象分類問題,其中存在不平衡類問題,然後我們將使用一種簡單有效的技術來解決它。

問題

- 我們在kaggle上找到了“駝背鯨識別挑戰(Humpback Whale Identification Challenge)”,我們預計這會對解決不平衡類問題提出挑戰(理想情況下,被分類的鯨魚的數量將少於未分類的鯨類,因此,我們將有更少的影象數量)

來自kaggle:“

在這場比賽中,你面臨挑戰,要建立一個演算法來識別影象中的鯨魚種類。您將分析Happy Whale的超過25,000張影象的資料庫,這些資料來自研究機構和公共貢獻者。透過貢獻,您將有助於為全球海洋哺乳動物種群動態開啟豐富的理解領域。

讓我們開始看資料

由於這是一個多標籤影象分類問題,我首先想要檢查資料是如何在類中分佈的。

機器學習中的訓練資料不平衡問題

上面的圖表表明,在4251個訓練影象中,每個類只有一個影象,還有一些影象具有2-5個影象。現在,這是一個嚴重的不平衡類問題。我們不能期望DL模型每個類僅使用一個影象進行訓練(雖然有些演算法可能只是做一些例子,但我們現在忽略了這一點)。這也會產生一個問題,如何在訓練和驗證樣本之間建立一個分界線。您理想情況下希望每個類都在訓練樣本和驗證樣本中表示。

我們現在應該做什麼?

我們考慮了兩個特別的選項:

option1在訓練樣本上進行了嚴格的資料增量(我們可以這樣做,但由於我們只需要針對特定類的資料增量,這可能無法完全解決我們的目的)。因此,我選擇了看起來很簡單的選項2。

option2-類似於我上面提到的過取樣選項。我只是使用不同的影象增強技術將不平衡類的影象複製到訓練資料中15次。

在我們開始使用選項2之前,可以從訓練樣本中檢視少量影象。

機器學習中的訓練資料不平衡問題

這些影象是特定於鯨魚的fluke,因此,識別將可能是特定於影象的方向。

我也注意到在資料中有很多的影象是特定的B&W或者僅僅是R/B/G通道。

基於這些觀察,我決定寫下面的程式碼來做一些影象的小改變,這些影象來自於訓練樣本ans的不平衡的類:

import os

from PIL import Image

from PIL import ImageFilter

filelist = train[‘Image’]。loc[(train[‘cnt_freq’]<10)]。tolist()

for count in range(0,2):

for imagefile in filelist:

os。chdir(‘/home/paperspace/fastai/courses/dl1/data/humpback/train’)

im=Image。open(imagefile)

im=im。convert(“RGB”)

r,g,b=im。split()

r=r。convert(“RGB”)

g=g。convert(“RGB”)

b=b。convert(“RGB”)

im_blur=im。filter(ImageFilter。GaussianBlur)

im_unsharp=im。filter(ImageFilter。UnsharpMask)

os。chdir(‘/home/paperspace/fastai/courses/dl1/data/humpback/copy’)

r。save(str(count)+‘r_’+imagefile)

g。save(str(count)+‘g_’+imagefile)

b。save(str(count)+‘b_’+imagefile)

im_blur。save(str(count)+‘bl_’+imagefile)

im_unsharp。save(str(count)+‘un_’+imagefile)

以上程式碼塊對不平衡類中的每個影象(頻率小於10)都進行如下處理:

將每個影象的增強副本儲存為R / B&G

儲存每個影象的增強副本,這是blury

儲存每張影象不清晰的增強副本

在上面的程式碼中可以看到,我們使用pillow (一個python影象庫)來嚴格執行此練習

現在我們已經為所有不平衡的類分配了至少10個樣本。我們繼續進行了培訓。

影象增強

,我們就這麼簡單。我們只是想確保我們的模型能夠得到關於鯨魚的fluke的詳細的觀點。為此,我們將zoom納入了影象增強。

機器學習中的訓練資料不平衡問題

Learning rate finder

-我們決定將學習率定為0。01

機器學習中的訓練資料不平衡問題

我們使用Resnet50進行了很少的迭代(第一次凍結和解凍)。發現凍結模型對於這個問題陳述也非常有用,因為imagenet中有鯨魚影象。

機器學習中的訓練資料不平衡問題

如何看待測試資料的?

最後,我們在kaggle排行榜上獲得了真相。解決方案在本次比賽中提出了34的平均精確度,平均精度為0。41928。

機器學習中的訓練資料不平衡問題

結論

有時候,最簡單的方法是最合乎邏輯的(如果你沒有更多的資料,只需要複製現有的資料,並有輕微的變化假設大多數類別觀察將在模型的同一行上)是最有效的,可以得到的工作更容易和直觀地完成。