我在分類問題上遇到了麻煩。使用多層感知器對不平衡數據集進行分類
我有兩個標籤在訓練數據中的向量數量接近400k,我想訓練將數據分爲兩類的MLP。 但是,數據集非常不平衡。 95%的人有標籤1,其他人有0標籤。準確性隨着培訓的進展而增長,並在達到95%後停止。我想這是因爲網絡預測所有矢量的標籤爲1。
到目前爲止,我嘗試用0.5概率退出圖層。但是,結果是一樣的。有什麼方法可以提高準確度嗎?
我在分類問題上遇到了麻煩。使用多層感知器對不平衡數據集進行分類
我有兩個標籤在訓練數據中的向量數量接近400k,我想訓練將數據分爲兩類的MLP。 但是,數據集非常不平衡。 95%的人有標籤1,其他人有0標籤。準確性隨着培訓的進展而增長,並在達到95%後停止。我想這是因爲網絡預測所有矢量的標籤爲1。
到目前爲止,我嘗試用0.5概率退出圖層。但是,結果是一樣的。有什麼方法可以提高準確度嗎?
我認爲處理不平衡數據的最好方法是對班級使用權重。例如,您可以爲您的課程加權,以便每個課程的權重總和相等。
import pandas as pd
df = pd.DataFrame({'x': range(7),
'y': [0] * 2 + [1] * 5})
df['weight'] = df['y'].map(len(df)/2/df['y'].value_counts())
print(df)
print(df.groupby('y')['weight'].agg({'samples': len, 'weight': sum}))
輸出:
x y weight
0 0 0 1.75
1 1 0 1.75
2 2 1 0.70
3 3 1 0.70
4 4 1 0.70
5 5 1 0.70
6 6 1 0.70
samples weight
y
0 2.0 3.5
1 5.0 3.5
你可以嘗試的例子子集另一分類。支持向量機可能適用於小數據,因此您可以假設只有10k個示例,每個類的比例爲5/1。
您也可以以某種方式過度抽取小類,並對另一個進行欠採樣。
你也可以簡單地減輕你的課程。
也想想適當的度量。你注意到你輸出的結果只有一個標籤是很好的。但是,使用精確度並不容易。
約不平衡數據集在這裏一些不錯的想法:
切記不要改變你的測試集。
這是一個常見的情況:網絡學習一個常數,不能離開這個局部最小值。
當數據非常不平衡時,就像您的情況一樣,一種可能的解決方案是weighted cross entropy損失函數。例如,在張量流中,應用內置的tf.nn.weighted_cross_entropy_with_logits
函數。這個想法在this post中也有很好的討論。
但我應該說,獲取更多的數據來平衡兩個類(如果可能的話)總是會有所幫助。