Comment le class_weight paramètre dans scikit-learn travail?

J'ai beaucoup de difficulté à comprendre comment le class_weight paramètre dans scikit-learn de Régression Logistique opère.

La Situation

Je veux utiliser la régression logistique pour faire de classification binaire sur un très déséquilibrée ensemble de données. Les classes sont étiquetés 0 (négatif) et 1 (positif) et les données observées est dans un rapport d'environ 19:1 avec la majorité des échantillons ayant des résultats négatifs.

Première Tentative: Manuellement La Préparation Des Données D'Entraînement

J'ai divisé les données que j'avais en ensembles disjoints pour la formation et les tests (environ 80/20). Ensuite, j'ai échantillonnage aléatoire de la formation données par la main pour obtenir des données d'entraînement dans des proportions différentes de 19:1; à partir de 2:1 -> 16:1.

J'ai ensuite appris régression logistique sur ces différents types de formation sous-ensembles de données et le tracé de rappel (= TP/(TP+FN)) en fonction de la formation des proportions. Bien sûr, le rappel a été calculée sur la disjoints échantillons de TEST qui avait observé les proportions de 19:1. Notez bien que j'ai formés sur les différents modèles sur différentes données d'entraînement, j'ai calculé le rappel pour tous sur le même (disjoints) des données de test.

Les résultats ont été comme prévu: le rappel a été d'environ 60% à 2:1, la formation des proportions et est tombé assez vite par le temps, il y a eu 16:1. Il y avait plusieurs proportions 2:1 -> 6:1, où le rappel était convenablement au-dessus de 5%.

Deuxième Tentative: Grille De Recherche

Ensuite, j'ai voulu tester les différents paramètres de régularisation et j'ai donc utilisé GridSearchCV et fait une grille de plusieurs valeurs de la C paramètre ainsi que la class_weight paramètre. Pour traduire mon n:m proportions de négatif:positif de la formation des échantillons dans le dictionnaire de la langue de class_weight j'ai pensé que je viens de spécifier plusieurs dictionnaires comme suit:

{ 0:0.67, 1:0.33 } #expected 2:1
{ 0:0.75, 1:0.25 } #expected 3:1
{ 0:0.8, 1:0.2 }   #expected 4:1

et j'ai aussi inclus None et auto.

Cette fois, les résultats ont été totalement wacked. Tous mes se souvient est venu de minuscules (< 0,05) pour chaque valeur de class_weight sauf auto. Donc, je ne peux que supposer que ma compréhension de la façon de définir la class_weight dictionnaire est mal. Fait intéressant, la class_weight valeur 'auto' dans la grille de recherche a été autour de 59% pour toutes les valeurs de C, et j'ai deviné soldes à 1:1?

Mes Questions

1) Comment voulez-vous utiliser correctement class_weight pour atteindre les différents soldes dans les données d'entraînement à partir de ce que vous lui donner? Plus précisément, ce dictionnaire dois-je passer à class_weight à utiliser n:m proportions de négatif:positif de la formation des échantillons?

2) Si vous passer les différents class_weight dictionnaires pour GridSearchCV, au cours de cross-validation de rééquilibrer la formation pli de données selon le dictionnaire, mais utiliser le vrai exemple de proportions pour le calcul de ma fonction de notation sur le test de fois? Cette étape est essentielle car aucune métrique n'est utile que pour moi si il s'agit de données dans les pourcentages observés.

3) Quelle est l' auto valeur de class_weight faire proportions? J'ai lu la documentation et j'assume "soldes les données inversement proportionnelle à leur fréquence" signifie simplement qu'il rend 1:1. Est-ce correct? Si non, quelqu'un peut-il préciser?

Merci beaucoup, toute clarification serait grandement apprécié!

InformationsquelleAutor kilgoretrout | 2015-06-22