1

J'essaie d'utiliser l'argument log_loss dans le paramètre scoring de GridSearchCV pour régler ce classificateur multi-classes (6 classes). Je ne comprends pas comment lui donner un paramètre label. Même si je lui ai donné sklearn.metrics.log_loss, cela changerait pour chaque itération dans la validation croisée, donc je ne comprends pas comment lui donner le paramètre labels?Comment utiliser `log_loss` dans` GridSearchCV` avec des étiquettes multi-classes dans Scikit-Learn (sklearn)?

J'utilise Python v3.6 et Scikit-Learn v0.18.1

Comment puis-je utiliser avec GridSearchCVlog_loss avec ajustement du modèle multi-classe?

Ma représentation de la classe:

1 31 
2 18 
3 28 
4 19 
5 17 
6 22 
Name: encoding, dtype: int64 

Mon code:

param_test = {"criterion": ["friedman_mse", "mse", "mae"]} 
gsearch_gbc = GridSearchCV(estimator = GradientBoostingClassifier(n_estimators=10), 
         param_grid = param_test, scoring="log_loss", n_jobs=1, iid=False, cv=cv_indices) 
gsearch_gbc.fit(df_attr, Se_targets) 

est ici la fin de queue de l'erreur et le plein est ici https://pastebin.com/1CshpEBN:

ValueError: y_true contains only one label (1). Please provide the true labels explicitly through the labels argument. 

Mise à jour : Il suffit d'utiliser cela pour faire le meilleur buteur basé sur basé sur @Grr

log_loss_build = lambda y: metrics.make_scorer(metrics.log_loss, greater_is_better=False, needs_proba=True, labels=sorted(np.unique(y))) 
+0

Imprimez vos 'Se_targets' ici. Et aussi jeter un oeil à http://scikit-learn.org/stable/modules/model_evaluation.html#multilabel-ranking-metrics –

Répondre

2

mon hypothèse est que en quelque sorte votre séparation de données n'a qu'une seule étiquette de classe y_true. Bien que cela semble improbable en fonction de la distribution que vous avez affichée, je suppose que c'est possible. Bien que je n'ai pas rencontré cela avant qu'il semble que dans [sklearn.metrics.log_loss] (http://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html) l'argument label est attendu si les étiquettes sont toutes les mêmes. Le libellé de cette section de la documentation donne également l'impression que la méthode impute une classification binaire si labels n'est pas transmise.

Maintenant que vous assumer correctement vous devez passer log_loss comme scorer=sklearn.metrics.log_loss(labels=your_labels)

+0

mes étiquettes seraient-elles les mêmes que le "y_true"? –

+0

Je crois que vous passeriez votre liste de classes, c'est-à-dire '[1,2,3,4,5,6]'. Il ressemble à 'labels =' kwarg utilise le 'LabelBinarizer' pour créer les classes d'étiquettes, puis binariser les valeurs y_true. Vérifiez-le dans la source [ici] (https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/classification.py#L1557-L1677) – Grr

+0

'TypeError: log_loss() manquant 2 arguments positionnels requis: 'y_true' et 'y_pred' La méthode prend 2 arguments par défaut qui vont changer lors de la validation croisée. –

1

Vous pouvez simplement spécifier « neg_log_loss_scorer » (ou « log_loss_scorer ») dans les anciennes versions qui utiliseront la perte de log négatif.

+0

bon à savoir! Merci –