Comment classer un ensemble de données déséquilibré par Convolutional Neural Networks (CNN)?

10

J'ai un ensemble de données déséquilibré dans une tâche de classification binaire, où le montant positif contre le montant négatif est de 0,3% contre 99,7%. L'écart entre les positifs et les négatifs est énorme. Lorsque je forme un CNN avec la structure utilisée dans le problème MNIST, le résultat du test montre un taux de faux négatifs élevé. De plus, la courbe d'erreur d'apprentissage diminue rapidement au cours de quelques époques au début, mais reste la même valeur aux époques suivantes.

Pourriez-vous s'il vous plaît me conseiller un moyen de traiter ce problème? Merci!

Zhi Lu
la source

Réponses:

10

Cela se produit car lorsque vous prenez un mini-lot, il est très très peu probable (étant donné le rapport des proportions ici) qu'un mini-lot contienne des échantillons de vos positifs. Donc, cela finira par apprendre le modèle de la classe négative et après quelques époques, tout est simplement classé comme classe négative.

Il existe deux façons possibles de gérer une telle situation.

  1. Étant donné les proportions de 0,3% à 99,7%, il s'agit d'un ensemble de données très asymétrique. Vous avez à peine 3 échantillons de classes positives pour 1000 échantillons. Je dirais que vous devriez chercher à équilibrer l'ensemble de données en obtenant des classes plus positives. Allez chercher autant d'échantillons positifs que possible. Ensuite, vous pouvez utiliser un ensemble de données plus équilibré. Par exemple, vous pouvez obtenir 1 000 échantillons positifs, puis choisir un ensemble aléatoire de 1 000 échantillons négatifs et créer le classificateur. Maintenant, il devrait pouvoir apprendre les deux classes.

  2. Utilisez une mesure d'erreur pondérée lors de la mise à jour des poids après un mini-lot. Les poids sont mis à jour en proportion du nombre d'échantillons des classes positives et négatives au cours de tout mini-lot. Maintenant, dans la situation actuelle, étant donné les proportions de 3: 1000, même cette astuce peut ne pas fonctionner. Vous pouvez donc essayer d'obtenir les proportions à quelque chose comme 300: 1000 en obtenant 297 échantillons positifs supplémentaires et en les combinant avec 1000 échantillons négatifs. Ensuite, avec un rapport de 300: 1000, vous devez pondérer l'erreur lors des mini-lots en fonction du nombre d'échantillons dans chacune des classes. Cela devrait fonctionner.

Londres guy
la source
Savez-vous quelle est la proportion optimale ici? est-il 3:10, ou autre chose?
donlan
4

Pourquoi voulez-vous utiliser les CNN ici? Avez-vous envisagé d'autres modèles qui gèrent réellement des données déséquilibrées?

Par exemple, j'ai trouvé que les deux techniques suivantes ont très bien fonctionné pour moi:

  • Forêts aléatoires avec amplification SMOTE : utilisez un hybride SMOTEqui sous-échantillonne la classe majoritaire et suréchantillonne la classe minoritaire par des pourcentages ajustables. Sélectionnez ces pourcentages en fonction de la distribution de votre variable de réponse dans l'ensemble de formation. Alimentez ces données dans votre modèle RF. Toujours valider / effectuer une recherche sur la grille pour trouver les meilleurs réglages de paramètres pour vos RF.

  • XGBoost avec optimisation d'hyper-paramètre : Encore une fois, effectuez une validation croisée ou effectuez une recherche de ceintures pour trouver les meilleurs réglages de paramètres pour le modèle. En outre, xgboostvous permet d'équilibrer les pondérations de classe positives et négatives à l'aide scale_pos_weight. Voir la documentation des paramètres pour une liste complète.

Je dois également ajouter que l'ensemble de données sur lequel je travaillais avait le même pourcentage de biais et j'ai pu obtenir un score de sensibilité de 0,941 et une spécificité de 0,71 avec xgboost, ce qui signifie que le modèle prédit les vrais positifs assez précisément et que cela augure bien pour moi.

(Désolé, je ne peux pas laisser de commentaire, pas assez de réputation et je voulais vraiment savoir pourquoi vous avez choisi les CNN)

119631
la source
1

Un ensemble de données déséquilibré est un problème commun dans tous les domaines et ne concerne pas spécifiquement la vision par ordinateur et les problèmes traités par les réseaux neuronaux convolutionnels (CNN).

Pour résoudre ce problème, vous devez essayer d'équilibrer votre ensemble de données, soit en suréchantillonnant les classes minoritaires, soit en sous-échantillonnant les classes majoritaires (ou les deux). Sans doute, un bon choix serait l'algorithme SMOTE (Technique de suréchantillonnage des minorités synthétiques), comme mentionné ci-dessus. Ici , vous trouverez une comparaison des différents algorithmes de suréchantillonnage. Si vous êtes un utilisateur Python, imbalanced-learn est une belle bibliothèque qui implémente de nombreuses techniques utiles pour équilibrer les jeux de données.

D'un autre côté, si vous essayez de classer des images, une bonne façon d'augmenter la taille de votre jeu de données est de l' augmenter (c'est-à-dire en créant des exemples synthétiques raisonnables, par exemple des images similaires, mais en les faisant pivoter / déplacer légèrement par rapport aux images originales). Vous pourriez parfois trouver utile d'augmenter les classes minoritaires pour atteindre un meilleur équilibre. La classe Keras ImageDataGenerator est un bon outil à cet effet.

Tomasz Bartkowiak
la source