Déséquilibre de classe dans l'apprentissage automatique supervisé

47

C'est une question en général, non spécifique à une méthode ou à un ensemble de données. Comment traiter un problème de déséquilibre de classe dans l'apprentissage automatique supervisé, où le nombre de 0 est d'environ 90% et le nombre de 1 d'environ 10% dans votre jeu de données. Comment former de manière optimale le classificateur.

L'une des méthodes que je suis consiste à échantillonner pour équilibrer l'ensemble de données, puis à former le classifieur et à répéter l'opération pour plusieurs échantillons.

Je pense que cela est aléatoire. Existe-t-il un cadre pour aborder ce type de problèmes?

NG_21
la source

Réponses:

45

Il existe de nombreux cadres et approches. C'est un problème récurrent.

Exemples:

  • Sous-échantillonnage . Sélectionnez un sous-échantillon des ensembles de zéros de sorte que sa taille corresponde à l'ensemble des uns. Il y a une perte évidente d'informations, à moins que vous n'utilisiez un cadre plus complexe (par exemple, je scinderais le premier ensemble en 9 sous-ensembles plus petits et mutuellement exclusifs, entraînerais un modèle sur chacun d'eux et en établirais le modèle).
  • Suréchantillonnage . Produisez des artificiels jusqu'à ce que la proportion soit de 50% / 50%. Mon employeur précédent l’utilisait par défaut. Il existe de nombreux frameworks pour cela (je pense que SMOTE est le plus populaire, mais je préfère des astuces plus simples comme Noisy PCA ).
  • Apprentissage en une classe . Supposons simplement que vos données contiennent quelques points réels (ceux) et qu’un grand nombre de bruits aléatoires qui n’existent pas physiquement s’infiltrent dans le jeu de données (tout ce qui ne l’est pas est du bruit). Utilisez un algorithme pour atténuer les données au lieu d’un algorithme de classification.
  • Formation au moindre coût . Utilisez une fonction de coût asymétrique pour équilibrer artificiellement le processus de formation.

Quelques critiques éclairées, par ordre croissant de complexité technique \ niveau de détail:

Oh, et au fait, 90% / 10% n'est pas déséquilibré. Les ensembles de données sur les fraudes liées aux transactions par carte sont souvent divisés à 99,97% / 0,03%. C'est déséquilibré.

Lucas Gallindo
la source
Je viens de remarquer que la NPCA PCA que j'ai citée peut être considérée comme un suréchantillonnage, une régularisation ou une gigue, selon les détails de la mise en œuvre.
Lucas Gallindo
Merci Lucas pour les ressources. Cela m'aide beaucoup. J'ai un problème particulier dans lequel tous mes échantillons sont étiquetés «1». Cependant, en réalité, ces échantillons ont une impureté minimale, c’est-à-dire que certains enregistrements sont supposés être «0» mais sont étiquetés «1». Je crois que ce genre de problème appartient à une classe de classification. Est-ce que ma compréhension est correcte? Existe-t-il un cadre commun utilisé pour les identifier, au départ, j'essayais de mettre en cluster mais cela ne fonctionnait pas.
NG_21
1
Tous ces algorithmes nécessitent des données étiquetées zéro et d’autres avec 100% de précision sur l’exactitude de l’étiquette (ou quelque chose de très proche de 100%). Vous en avez toutes une, mais vous savez qu'un petit pourcentage de ces données est mal étiqueté, une situation différente. Sans aucune connaissance sur le domaine d'application, je l'attaquerais à l'aide de la détection d'anomalies, puis étiqueterais les anomalies à zéro. Ensuite, essayez un algorithme de classification (One Class Learning, peut-être). Connaissant le domaine d'application, je demanderais l'aide d'un expert avant tout.
Lucas Gallindo
13

Cela dépend fortement de la méthode d'apprentissage. La plupart des approches générales ont un (ou plusieurs) moyen de gérer cela. Une solution courante consiste à attribuer à la classe minoritaire une pénalité de classification plus élevée, ce qui oblige le classifieur à les reconnaître (SVM, régression logistique, réseaux de neurones, ...).

Changer d'échantillonnage est aussi une possibilité, comme vous le dites. Dans ce cas, suréchantillonner la classe minoritaire est généralement une meilleure solution que de sous-échantillonner la classe majoritaire.

Certaines méthodes, comme les forêts aléatoires, ne nécessitent aucune modification.

Marc Claesen
la source
Merci. Pouvez-vous indiquer n'importe quelle ressource où il est expliqué avec quelques exemples. Existe-t-il un moyen d’y parvenir dans R / Python sans avoir à coder l’algorithme à partir de zéro?
NG_21
1
Vérifiez la première fonction de ce package R: cran.r-project.org/web/packages/unbalanced/unbalanced.pdf
Lucas Gallindo
7
Pourquoi la forêt aléatoire n'a besoin d'aucune modification? Je pense que vous pouvez toujours affecter le poids de la classe
mac
4

Souvent, le problème n'est pas la fréquence mais le nombre absolu de cas dans la classe minoritaire. Si vous ne subissez pas suffisamment de variations dans la cible par rapport à une variation dans les fonctionnalités, cela peut signifier que l'algorithme ne peut pas classer les choses très précisément.

Une chose est que la pénalité de classification erronée pourrait être utilisée à l'étape de la classification et non à l'étape de l'estimation du paramètre s'il en existe une. Certaines méthodes n'ont pas de concept de paramètre, elles produisent simplement des étiquettes de classe ou des probabilités de classe.

Lorsque vous disposez d'un estimateur probabiliste, vous pouvez alors prendre une décision de classification basée sur des bases théoriques de l'information ou avec une combinaison de valeur commerciale.

Analyste
la source
1

Ajoutez deux astuce: 1. utilisez CDF, comptez la fréquence dans vos données d’entraînement ou utilisez une très grande validation (si votre ensemble de tests ne change pas, mais que l’ensemble de validation doit avoir la même distribution que l’ensemble d’entraînement), puis triez votre prédiction et obtenez premier X% (vous comptez la fréquence précédente) pour la première classe et les autres sont / 2. échantillon pondéré, le modèle tendra à la classe pondérée, vous pouvez utiliser la variance d'échantillon v. weighti = 1/2 (1- (vmax - vi) / vmax)

utilisateur102423
la source