在深度學習中處理不均衡資料集

2021-09-05 10:32:39 字數 2653 閱讀 3592

hard negative mining

online hard sample mining

在上面的情況中,我們當然需要我們的少數「買」的類別要特別的準確,而「不買」的類別則無關緊要。但是在實際情況中,由於買的情況比不買的情況要少得多,我們的模型**會偏向「不買」的類別,而「買」的類別的準確率則可能會很差。這就需要資料均衡了,我們可以讓「買」類別的權重變大,來讓「買」類別的**更加準確。

但是如果我們對少數類別不關心怎麼辦呢?例如,我要做乙個影象的分類,而你的類別的分布看起來是這樣的:

第一眼看上去似乎資料均衡是有好處的。但是也許我們對那些少數的類別並不關心。也許我們的目的就是得到最高的準確率。在這種情況下,做資料均衡並沒什麼意義,因為大多數的準確率來自於包含了大量樣本的類別中。第二,交叉熵的損失即使是在不均衡的資料的時候,也是趨向於得到最高的準確率。總的來說,我們的少數類別並沒有對準確率有多少貢獻,所以說,資料均衡並不需要。

綜上所述,當我們遇到需要均衡資料的時候,有兩個方法可以幫助我們辦到:

權值均衡是在訓練樣本的時候,在計算loss的時候,通過權值來均衡資料的分布。正常情況下,每個類別在損失函式中的權值是1.0。但是有時候,當某些類別特別重要的時候,我們需要給該類別的訓練樣本更大權值。參考我們的買房的例子,由於「買」的類別的準確率非常的重要,訓練樣本中的這個類別應該對損失函式有更大的影響。

import keras

class_weight =

model.fit(x_train, y_train, epochs=10, batch_size=32, class_weight=class_weight)

我們建立了乙個字典,其中,「買」類別為75%,表示了佔據了75%的loss,因為比「不買」的類別更加的重要,「不買」的類別設定成了25%。當然,這兩個數字可以修改,直到找到最佳的設定為止。我們可以使用這種方法來均衡不同的類別,當類別之間的樣本數量差別很大的時候。我們可以使用權值均衡的方式來使我們的所有的類別對loss的貢獻是相同的,而不用取費力的收集少數類別的樣本了。

另乙個可以用來做訓練樣本的權值均衡的是focal loss。如下所示,主要思想是這樣:在資料集中,很自然的有些樣本是很容易分類的,而有些是比較難分類的。在訓練過程中,這些容易分類的樣本的準確率可以達到99%,而那些難分類的樣本的準確率則很差。問題就在於,那些容易分類的樣本仍然在貢獻著loss,那我們為什麼要給所有的樣本同樣的權值?

這正是focal loss要解決的問題。focal loss減小了正確分類的樣本的權值,而不是給所有的樣本同樣的權值。這和給與訓練樣本更多的難分類樣本時一樣的效果。在實際中,當我們有資料不均衡的情況時,我們的多數的類別很快的會訓練的很好,分類準確率很高,因為我們有更多的資料。但是,為了確保我們在少數類別上也能有很好的準確率,我們使用focal loss,給與少數類別的樣本更高的權值。focal loss使用keras是很容易實現的:

import keras

from keras import backend as k

import tensorflow as tf

# define our custom loss function

def focal_loss(y_true, y_pred):

gamma = 2.0, alpha = 0.25

pt_1 = tf.where(tf.equal(y_true, 1), y_pred, tf.ones_like(y_pred))

pt_0 = tf.where(tf.equal(y_true, 0), y_pred, tf.zeros_like(y_pred))

return -k.sum(alpha * k.pow(1. - pt_1, gamma) * k.log(pt_1))-k.sum((1-alpha) *k.pow( pt_0, gamma) * k.log(1. - pt_0))

# compile our model

adam = adam(lr=0.0001)

model.compile(loss=[focal_loss], metrics=["accuracy"], optimizer=adam)

選擇合適的類別的權重有時候比較複雜。做乙個簡單的頻率倒數可能有時候效果也不好。focal loss有點用,但是仍然會對所有的正確分類的樣本都做權值的下降。另外乙個資料均衡的方法就是直接的取樣。下面的圖給出了乙個大概的說明.

在影象的兩邊,藍色的類別比橘黃色的類別的樣本多得多。這種情況下,我們在預處理時,有兩種選擇。

欠取樣意思是從多數的類別中只取樣其中的一部分的樣本,選擇和少數類別同樣多的樣本。這種取樣保持了該類別原來的資料分布。這很容易,我們只需要少用點樣本就可以讓資料變得均衡。

過取樣的意思是我們複製少數類別中的樣本,使得數量和多數樣本一樣多。複製操作需要保持少數樣本的原有的資料分布。我們不需要獲取更多的資料就可以讓資料集變得均衡。取樣的方法是乙個很好的類別均衡的方法,如果你發現類別權值很難做而且效果不好的時候,可以試試!

如何處理分類中的訓練資料集不均衡問題

在分類中,訓練資料不均衡是指不同類別下的樣本數目相差巨大。舉兩個例子 在乙個二分類問題中,訓練集中class 1的樣本數比上class 2的樣本數的比值為60 1。使用邏輯回歸進行分類,最後結果是其忽略了class 2,將所有的訓練樣本都分類為class 1。在三分類問題中,三個類別分別為a,b,c...

機器學習分類資料不均衡的簡單處理

隨機選擇類別較多的資料與類別較少的資料一致。x特徵,y類別 x data.ix data.columns class y data.ix data.columns class 小類別資料個數 number records fraud len data data.class 1 小類別資料索引 fra...

在機器學習中如何應對不均衡分類問題?

在處理機器學習等資料科學問題時,經常會碰到不均衡種類分布的情況,即在樣本資料中乙個或多個種類的觀察值明顯少於其他種類的觀察值的現象。在我們更關心少數類的問題時這個現象會非常突出,例如竊電問題 銀行詐騙 易 罕見病鑑定等。在這種情況下,運用常規的機器學習演算法的 模型可能會無法準確 這是因為機器學習演...