1

Je rencontre des problèmes de classification. J'ai un nombre de vecteurs de près de 400k dans les données d'apprentissage avec deux étiquettes, et je voudrais former MLP qui classe les données en deux classes. Cependant, l'ensemble de données est tellement déséquilibré. 95% d'entre eux ont l'étiquette 1, et d'autres ont l'étiquette 0. La précision augmente à mesure que l'entraînement progresse, et s'arrête après avoir atteint 95%. Je suppose que c'est parce que le réseau prédisent l'étiquette comme 1 pour tous les vecteurs. Jusqu'à présent, j'ai essayé d'abandonner les couches avec des probabilités de 0,5. Mais le résultat est le même. Y a-t-il des moyens d'améliorer la précision?Classification avec jeu de données déséquilibré utilisant des perceptrons multicouches

Répondre

1

Je pense que la meilleure façon de traiter les données déséquilibrées est d'utiliser des poids pour votre classe. Par exemple, vous pouvez pondérer vos classes de sorte que la somme des poids de chaque classe soit égale.

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})) 

sortie:

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

Vous pouvez essayer un autre classificateur sur sous-ensemble d'exemples. SVM, peut fonctionner correctement avec des petites données, donc vous pouvez prendre disons 10k exemples seulement, avec une proportion de 5/1 dans les classes.

Vous pourriez également sur-échantillonner une petite classe en quelque sorte et sous-échantillonner l'autre.

Vous pouvez également simplement pondérer vos classes.

Pensez aussi à la métrique appropriée. C'est bien que vous ayez remarqué que la sortie que vous avez prédit seulement une étiquette. Il est, cependant, pas facilement vu en utilisant la précision.

Quelques belles idées sur ensemble de données non équilibrée ici:

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

vous de ne pas changer votre jeu de test.

0

C'est une situation courante: le réseau apprend une constante et ne peut pas sortir de ce minimum local.

Lorsque les données sont très déséquilibrées, comme dans votre cas, une solution possible est une fonction de perte weighted cross entropy. Par exemple, dans tensorflow, appliquez une fonction tf.nn.weighted_cross_entropy_with_logits intégrée. Il y a aussi une bonne discussion de cette idée dans this post.

Mais je devrais dire qu'obtenir plus de données pour équilibrer les deux classes (si c'est possible) sera toujours utile.