Python: gestion des classes de déséquilibre dans python Machine Learning

9

J'ai un ensemble de données pour lequel j'essaie de prédire les variables cibles.

Col1    Col2    Col3    Col4    Col5    
  1      2       23      11     1
  2      22      12      14     1
  22     11      43      38     3
  14     22      25      19     3
  12     42      11      14     1
  22     11      43      38     2
  1      2       23      11     4
  2      22      12      14     2
  22     11      43      38     3

J'ai fourni un échantillon de données, mais le mien a des milliers d'enregistrements répartis de la même manière. Ici, Col1, Col2, Col3, Col4 sont mes fonctionnalités et Col5 est la variable cible. Par conséquent, la prédiction devrait être 1, 2, 3 ou 4 car ce sont mes valeurs pour la variable cible. J'ai essayé d'utiliser des algorithmes tels que la forêt aléatoire, l'arbre de décision, etc. pour les prédictions.

Ici, si vous voyez, les valeurs 1,2 et 3 se produisent plus de fois par rapport à 4. Par conséquent, tout en prédisant, mon modèle est plus biaisé vers 1 2 et 3 alors que je reçois seulement moins de prédictions pour 4 (je n'ai eu que 1 prédite pour policy4 sur des milliers d'enregistrements lorsque j'ai vu la matrice de confusion).

Afin de généraliser mon modèle, j'ai supprimé au hasard un pourcentage égal de données appartenant aux valeurs 1,2 et 3. J'ai groupé par chaque valeur dans Col5, puis supprimé un certain pourcentage, de sorte que j'ai réduit le nombre d'enregistrements. Maintenant, je pouvais voir une certaine augmentation du pourcentage de précision et également une augmentation raisonnable des prévisions pour la valeur 4 dans la matrice de confusion.

Est-ce la bonne approche à traiter (retirer les données au hasard des groupes sur lesquels le modèle est biaisé)?

J'ai essayé des algorithmes python intégrés comme Adaboost, des techniques GradientBoost utilisant sklearn. J'ai lu que ces algorithmes sont pour gérer la classe de déséquilibre. Mais je n'ai pas réussi à améliorer ma précision, plutôt en supprimant au hasard les données, où j'ai pu voir quelques améliorations.

Cette réduction est-elle une technique de sous-échantillonnage et est-ce la bonne approche pour le sous-échantillonnage?

Existe-t-il des packages prédéfinis dans sklearn ou une logique que je peux implémenter en python pour y parvenir, si ma suppression aléatoire est incorrecte?

J'ai également appris la technique SMOTE, qui traite du suréchantillonnage. Dois-je essayer ceci pour la valeur 4? Et pouvons-nous le faire en utilisant des packages intégrés en python? Ce serait formidable si quelqu'un m'aide dans cette situation.

SRS
la source

Réponses:

5

Cet article suggère d'utiliser le classement (je l'ai écrit). Au lieu d'utiliser, par exemple, SVM directement, vous utiliseriez RankSVM. Étant donné que les classeurs comparent l'observation à l'observation, la formation est nécessairement équilibrée. Il y a cependant deux "mais": la formation est beaucoup plus lente, et, en fin de compte, ce que ces modèles font est de classer vos observations de la probabilité qu'elles appartiennent à une classe à la probabilité qu'elles appartiennent à une autre, vous devez donc appliquer un seuil par la suite.

Si vous comptez utiliser le prétraitement pour corriger votre déséquilibre, je vous suggère de consulter MetaCost . Cet algorithme consiste à créer un ensemble de modèles, puis à modifier les classes antérieures pour les équilibrer en fonction des cas difficiles à prévoir. C'est très élégant. Ce qui est cool avec des méthodes comme SMOTE, c'est qu'en fabriquant de nouvelles observations, vous pourriez rendre les petits ensembles de données plus robustes.

Quoi qu'il en soit, même si j'ai écrit des choses sur le déséquilibre des classes, je suis toujours sceptique quant à la gravité du problème dans le monde réel. Je pense qu'il est très rare que vous ayez des priors de déséquilibre dans votre ensemble d'entraînement, mais des priors équilibrés dans vos données du monde réel. Le faites vous? Ce qui se passe généralement, c'est que les erreurs de type I sont différentes des erreurs de type II et je parierais que la plupart des gens feraient mieux d'utiliser une matrice de coûts, que la plupart des méthodes de formation acceptent ou vous pouvez l'appliquer en prétraitant à l'aide de MetaCost ou SMOTE. Je pense que plusieurs fois, "corriger le déséquilibre" revient à "je ne veux pas me soucier du compromis relatif entre les erreurs de type I et II".

Addenda:

J'ai essayé des algorithmes python intégrés comme Adaboost, des techniques GradientBoost utilisant sklearn. J'ai lu que ces algorithmes sont pour gérer la classe de déséquilibre.

AdaBoost donne de meilleurs résultats pour le déséquilibre de classe lorsque vous initialisez la répartition du poids en tenant compte du déséquilibre. Je peux creuser la thèse où j'ai lu ceci si vous voulez.

Quoi qu'il en soit, bien sûr, ces méthodes ne donneront pas de bonnes précisions. Avez-vous un déséquilibre de classe dans votre formation et votre ensemble de données de validation? Vous devez utiliser des métriques telles que le score F1 ou transmettre une matrice de coûts à la fonction de précision. «Corriger» le déséquilibre de classe, c'est quand vos prieurs sont différents dans votre formation et vos cas de validation.

Ricardo Cruz
la source
4

Certains algorithmes de sklearn ont un paramètre appelé class_weight que vous pouvez définir sur "équilibré" . De cette façon, sklearn ajustera ses poids de classe en fonction du nombre d'échantillons que vous avez de chaque classe.

Pour le classificateur de forêt aléatoire, essayez ce qui suit et voyez s'il améliore votre score:

rf = RandomForestClassifier(class_weight="balanced") # also add your other parameters!
stmax
la source
(class_weight = "équilibré") n'apporte pas suffisamment d'améliorations lorsque j'ai essayé de l'utiliser
SRS
2
@Srinath qu'entendez-vous par amélioration? Quelle métrique utilisez-vous? Si votre formation et votre validation sont déséquilibrées, vous ne pouvez pas utiliser les scores de précision. Qu'est class_weight- ce que c'est de construire une matrice de coûts pour vous où pour chaque classek, Ck=2NkN. Vous devez soit passer sample_weight=[C_k for k in y]à accuracy_scoreou utiliser quelque chose comme f1_score.
Ricardo Cruz
2

Oui, c'est une bonne technique pour résoudre le problème du déséquilibre de classe. Cependant, les méthodes de sous-échantillonnage conduisent à la perte d'informations dans l'ensemble de données (par exemple, vous venez de supprimer un modèle intéressant parmi les variables restantes, ce qui aurait pu contribuer à une meilleure formation du modèle). C'est pourquoi les méthodes de suréchantillonnage sont préférées, en particulier dans le cas d'un ensemble de données plus petit.

En réponse à votre question concernant les packages Python, la boîte à outils d' apprentissage déséquilibré est spécialement dédiée à la même tâche. Il propose plusieurs méthodes de sous-échantillonnage et de suréchantillonnage. Je recommanderais d'essayer la technique SMOTE .

Saurav--
la source
1

Cela dépend de la technique d'ensemble que vous souhaitez utiliser. Le problème de base avec lequel vous travaillez avec un problème de déséquilibre de données multi-classes. Le sous-échantillonnage peut être utilisé efficacement dans l'ensachage ainsi que dans les techniques de boosting. L'algorithme SMOTE est très efficace pour générer de nouveaux échantillons. Le problème de déséquilibre des données a été largement étudié dans la littérature. Je vous recommande de lire sur l'un de ces algorithmes: SMOTE-Boost SMOTE-Bagging Rus-Boost EusBoost Ce sont des techniques de boosting / bagging conçues spécifiquement pour les problèmes de données de déséquilibre. Au lieu de SMOTE, vous pouvez essayer ADA-SMOTE ou Border-Line SMOTE. J'ai utilisé et modifié le Border-Line SMOTE pour le multi-classe et il est très efficace. Si votre base de données est très volumineuse et que le problème est facile, essayez: classificateur alto - jones. J'ai aussi utilisé avec un problème de déséquilibre des données et c'est vraiment efficace

Bashar Haddad
la source
Merci pour les conseils, je regarde les sujets que vous avez mentionnés. Mais la technique que j'ai utilisée pour sous-échantillonner (réduire les données au hasard) est une bonne façon de faire?
SRS
Vous pouvez l'utiliser si votre base de données est très volumineuse. Mais si votre base de données est petite, vous perdrez une partie des informations. Lisez le Rus-Boosting, dans cette méthode, ils utilisent un sous-échantillonnage aléatoire dans le cadre de l'algorithme de boosting pour éviter de perdre des informations. Ils sous-échantillonnent le sous-ensemble qui sera utilisé pour former le prochain apprenant de base mais pas la base de données entière
Bashar Haddad
Mon ensemble de données contient près de 80 000 enregistrements que je l'utilise comme ensemble d'entraînement. J'implémente cela en python. Je cherchais des paquets dans sklearn ou quelque chose d'autre en python. Je n'ai pas pu les trouver. Est-ce quelque chose pour lequel je devrais mettre en place une logique pour les mettre en œuvre?
SRS
Je ne pense pas qu'il existe une implémentation pour ces méthodes. Le problème du déséquilibre des données est toujours à l'étude. Si vous avez une bonne implémentation pour Adaboost.M1 ou M2. Vous pouvez facilement le modifier pour devenir Rus Boost
Bashar Haddad
Je pense que la base de données que vous avez est assez volumineuse et si vous le souhaitez, vous pouvez utiliser le classificateur d'alto-jones. Pour celui-ci, vous pouvez trouver l'implémentation disponible
Bashar Haddad
0

Il y a déjà de bonnes réponses ici. Je pensais juste que j'ajouterais une technique de plus puisque vous cherchez à utiliser des ensembles d'arbres. Dans de nombreux cas, vous cherchez à optimiser la courbe de levage ou l'AUC pour le ROC. Pour cela, je recommanderais le critère de distance Hellinger pour diviser les branches de vos arbres. Au moment de la rédaction de ce document, il ne se trouve pas dans le package d' apprentissage déséquilibré , mais il semble qu'il existe un plan .

Keith
la source
0

Lorsque vous traitez un problème de déséquilibre de classe, vous devez principalement vous concentrer sur la métrique d'erreur et vous devez choisir le score F1 comme métrique d'erreur.

Après avoir choisi la métrique correcte, nous pouvons utiliser différentes techniques pour résoudre ce problème.

Si vous êtes intéressé, vous pouvez consulter le blog suivant, il est très bien expliqué sur les techniques utilisées pour résoudre ce problème de déséquilibre de classe:

https://knowledgengg.wordpress.com/2019/03/04/this-is-suresh/

saisubrahmanyam janapati
la source