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é!
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, il peut ne pas être bon d'aller juste en rappel seul. Vous pouvez simplement obtenir un rappel de 100% par le classement de tout le positif de la classe.
J'ai l'habitude de suggérer à l'aide de l'ASC pour la sélection des paramètres, puis de trouver un seuil pour le point de fonctionnement (à dire avec un niveau de précision) qui vous intéressent.
Pour combien de
class_weight
fonctionne: Il pénalise les erreurs dans les échantillons declass[i]
avecclass_weight[i]
au lieu de 1. Donc plus élevé de la classe de poids signifie que vous souhaitez mettre davantage l'accent sur une classe. À partir de ce que vous dites, il semble que la classe 0 est 19 fois plus fréquents que ceux de la classe 1. Donc, vous devez augmenter laclass_weight
de classe 1 par rapport à la classe 0, dire {0:.1, 1:.9}.Si le
class_weight
ne pas faire la somme de 1, il va fondamentalement changer le paramètre de régularisation.Pour combien de
class_weight="auto"
fonctionne, vous pouvez jeter un oeil à cette discussion.Dans le dev de la version que vous pouvez utiliser
class_weight="balanced"
, ce qui est plus facile à comprendre: il veut dire en reproduisant le plus petit de la classe jusqu'à ce que vous avez autant d'échantillons que dans le plus grand, mais d'une manière implicite.