Classification déséquilibrée à l'aide de la classification aléatoire des professions dans sklearn

j'ai un ensemble de données où les classes sont déséquilibrées. Les classes sont soit '1' ou '0', où le rapport de classe '1':'0' est de 5:1. Comment calculer l'erreur de prédiction pour chaque classe et les poids de rééquilibrage en conséquence dans sklearn avec Random Forest, un peu comme dans le lien suivant: http://www.stat.berkeley.edu / ~ breiman/Randomforets / cc_home.HTM # balance

30
demandé sur alko 2013-11-20 01:41:33

3 réponses

vous pouvez passer l'argument des poids d'échantillon à la forêt aléatoire méthode de l'ajustement

sample_weight : array-like, shape = [n_samples] or None

poids des échantillons. Dans le cas contraire, les échantillons sont également pondérés. Split qui créerait des noeuds d'enfant avec le poids net zéro ou négatif sont ignoré lors de la recherche d'une division dans chaque noeud. Dans le cas de classification, les divisions sont également ignorées si elles entraîneraient une classe simple porteuse d'un poids négatif chez l'un ou l'autre des enfants nœud.

dans la version plus ancienne il y avait un preprocessing.balance_weights méthode pour générer des poids de balance pour des échantillons donnés, de sorte que les classes soient distribuées uniformément. Il est toujours là, en interne mais toujours utilisable prétraitement._weights module, mais est déprécié et sera supprimé dans les versions futures. Ne sais pas les raisons exactes de cette.

mise à Jour

Quelques précisions, car vous semble confus. sample_weight l'utilisation est simple, une fois que vous vous rappelez que son but est d'équilibrer les classes cibles dans l'ensemble de données de formation. C'est, si vous avez X comme observations et y comme classes (labels), puis len(X) == len(y) == len(sample_wight), et chaque élément de sample witght tableau 1-D représente le poids pour un(observation, label) la paire. Pour votre cas, si 1 la classe est représentée 5 fois comme 0 classe est, et vous l'équilibre des classes de distributions, vous pouvez utiliser simple

sample_weight = np.array([5 if i == 0 else 1 for i in y])

attribution d'un poids 5 pour toutes 0 cas et poids de 1 pour tout 1 instances. Voir le lien ci-dessus pour un peu plus malin balance_weights fonction d'évaluation des poids.

42
répondu alko 2014-05-22 20:22:31

c'est vraiment dommage que la méthode "fit" de sklearn ne permette pas de spécifier une mesure de performance à optimiser. Personne ne semble comprendre ou remettre en question ou être intéressé par ce qui se passe réellement quand on appelle la méthode fit sur l'échantillon de données lors de la résolution d'une tâche de classification.

nous (les utilisateurs du paquet scikit learn) sommes silencieusement laissés avec la suggestion d'utiliser indirectement la recherche de grille crossvalidated avec la méthode de notation spécifique appropriée pour les ensembles de données non équilibrés dans l'espoir de tomber sur un ensemble de paramètres/métaparamètres qui produit un score approprié D'AUC ou de F1.

mais pensez-y: on dirait que la méthode "fit" appelée sous le capot optimise toujours la précision. Donc en fin de compte, si nous visons à maximiser le score F1, GridSearchCV nous donne "le modèle avec la meilleure F1 de tous les modesl avec la meilleure précision". N'est-ce pas ridicule? Ne serait-il pas préférable d'optimiser directement les paramètres du modèle pour obtenir un score F1 maximal? Souviens-toi de la bonne vieille Matlab ANNs. package, où vous pouvez définir la métrique des performances désirées à RMSE, MAE, et tout ce que vous voulez étant donné que le gradient calculant l'algo est défini. Pourquoi le choix de la métrique de performance est-il silencieusement omis de sklearn?

au moins, pourquoi n'y a-t-il pas d'option simple pour attribuer automatiquement des poids aux instances de classe pour remédier aux problèmes d'ensembles de données déséquilibrés? Pourquoi doit-on calculer les feux manuellement? En outre, dans de nombreux livres/articles de machine learning j'ai vu des auteurs louant le manuel de sklearn comme génial si pas les meilleures sources d'information sur le sujet. Non, vraiment? Pourquoi le problème des ensembles de données déséquilibrés (qui est évidemment d'une importance extrême pour les scientifiques) n'est-il même pas couvert nulle part dans le docs alors? J'adresse ces questions aux contributeurs de sklearn, s'ils lisent ceci. Ou toute personne connaissant les raisons de le faire est la bienvenue pour commenter et clarifier les choses.

UPDATE

Puisque scikit-learn 0.17, il y a l'option class_weight='balanced' que vous pouvez passer au moins pour certains classificateurs:

"équilibrés" mode utilise les valeurs de y pour ajuster automatiquement poids inversement proportionnel aux fréquences de classe dans les données d'entrée comme n_samples / (n_classes * np.bincount (y)).

7
répondu Anatoly Alekseev 2017-05-28 06:03:46

si la classe majoritaire est 1, et la classe minoritaire est 0, et ils sont dans le rapport 5:1, le sample_weight array devrait être:

sample_weight = np.array([5 if i == 1 else 1 for i in y])

notez que vous n'inversez pas les rapports.Ceci s'applique également aux class_weights. Le plus grand nombre est associé à la classe majoritaire.

1
répondu Meena Mani 2016-11-08 15:25:58