1

我在分類問題上遇到了麻煩。使用多層感知器對不平衡數據集進行分類

我有兩個標籤在訓練數據中的向量數量接近400k,我想訓練將數據分爲兩類的MLP。 但是,數據集非常不平衡。 95%的人有標籤1,其他人有0標籤。準確性隨着培訓的進展而增長,並在達到95%後停止。我想這是因爲網絡預測所有矢量的標籤爲1。

到目前爲止,我嘗試用0.5概率退出圖層。但是,結果是一樣的。有什麼方法可以提高準確度嗎?

回答

1

我認爲處理不平衡數據的最好方法是對班級使用權重。例如,您可以爲您的課程加權,以便每個課程的權重總和相等。

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 
1

你可以嘗試的例子子集另一分類。支持向量機可能適用於小數據,因此您可以假設只有10k個示例,每個類的比例爲5/1。

您也可以以某種方式過度抽取小類,並對另一個進行欠採樣。

你也可以簡單地減輕你的課程。

也想想適當的度量。你注意到你輸出的結果只有一個標籤是很好的。但是,使用精確度並不容易。

約不平衡數據集在這裏一些不錯的想法:

https://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/

切記不要改變你的測試集。

0

這是一個常見的情況:網絡學習一個常數,不能離開這個局部最小值。

當數據非常不平衡時,就像您的情況一樣,一種可能的解決方案是weighted cross entropy損失函數。例如,在張量流中,應用內置的tf.nn.weighted_cross_entropy_with_logits函數。這個想法在this post中也有很好的討論。

但我應該說,獲取更多的數據來平衡兩個類(如果可能的話)總是會有所幫助。