2016-01-07 2 views
4

Donc j'utilise la fonction de poids d'échantillonnage et je ne veux pas mesurer la performance en utilisant la fonction de score de sklearn par défaut.recherche de quadrillage avec pondéré AUC

On dirait Here que je peux passer GridSearchCV la chaîne 'roc_auc' et il devrait calculer auc pour moi mais l'auc qu'il calcule sera un auc pondéré ou juste un vanille auc?

+0

Il semble que 'GridSearchCV' ne prenne pas en charge' sample_weight'. Vous pouvez régler le modèle sans poids, utiliser 'cross_val_predict', puis le marquer vous-même. Je suppose que ce n'est pas ce que vous cherchez. –

+0

'GridSearchCV' accepte les poids d'échantillon via l'option' fit_params' (puisque les poids de l'échantillon doivent être passés à la méthode 'fit'). J'utilise aussi 'RandomizedSearchCV' qui nécessiterait une bonne quantité de complexité à reproduire en utilisant' cross_val_predict' donc j'espère que le 'scorer' gère automatiquement les poids mais je n'arrive pas à trouver quoi que ce soit dans la documentation. – Chris

+0

Cela fonctionne-t-il vraiment? Les poids devraient également être divisés en plis. Ils ne peuvent pas être passés naïvement à la fonction d'ajustement. –

Répondre

3

Merci pour le sniper nerd.

J'ai créé un jeu de données de classification binaire pour tester ce problème.

x y weight 
0 0 1 
1 1 1 
<repeated 25 times> 
0 1 0 
1 0 0 
<repeated 25 times> 

En utilisant python:

X = np.array([[0], [1]] * 25 + [[0], [1]] * 25) 
y = np.array([ 0 , 1 ] * 25 + [ 1 , 0 ] * 25) 
w = np.array([ 1 , 1 ] * 25 + [ 0 , 0 ] * 25) 

Dans cet ensemble de données, nous pouvons voir que si les poids échantillons sont présents, le modèle produira un très bon ajustement et ont une très faible perte de journal. Si les poids ne sont pas présents, la perte sera extrêmement élevée.

Ensuite, nous pouvons construire utiliser GridSearchCV pour voir si les poids sont utilisés.

clf = LogisticRegression(solver='newton-cg', C=100) 
gs = GridSearchCV(clf, {}, 
        fit_params={"sample_weight": w}, 
        scoring="log_loss", cv=KFold(y.shape[0],10, shuffle=True)) 
gs.fit(X,y) 
gs.grid_scores_ 

[mean: -2.68562, std: 0.68038, params: {}] 

Nous pouvons voir que la perte est assez élevée, ce qui indiquerait que les poids ne sont pas utilisés.

J'ai écrit un correctif pour scikit-apprendre à résoudre ce problème. Veuillez le considérer expérimental. Après l'application du correctif, nous pouvons activer score_sample_weight, répéter le test précédent et voir la perte de journal que nous attendons des poids pris en compte.

gs.score_sample_weight=True 
gs.fit(X,y) 
gs.grid_scores_ 

[mean: -0.00486, std: 0.00016, params: {}] 
+1

Pas encore en cours de planification –

+1

Oui, vous pourriez probablement remplacer deux –

+0

Cool, merci beaucoup, j'apprécie vraiment cela. – Chris