3

Est-il possible d'obtenir un rapport de classification de cross_val_score via une solution de contournement? J'utilise la validation croisée imbriquée et je peux obtenir divers scores ici pour un modèle, cependant, j'aimerais voir le rapport de classification de la boucle externe. Des recommandations?Rapport de classification avec validation croisée imbriquée dans SKlearn

# Choose cross-validation techniques for the inner and outer loops, 
# independently of the dataset. 
# E.g "LabelKFold", "LeaveOneOut", "LeaveOneLabelOut", etc. 
inner_cv = KFold(n_splits=4, shuffle=True, random_state=i) 
outer_cv = KFold(n_splits=4, shuffle=True, random_state=i) 

# Non_nested parameter search and scoring 
clf = GridSearchCV(estimator=svr, param_grid=p_grid, cv=inner_cv) 

# Nested CV with parameter optimization 
nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv) 

Je voudrais voir un rapport de classement ici le long du côté des valeurs de score. http://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html

Répondre

4

Nous pouvons définir notre propre fonction de notation comme ci-dessous:

from sklearn.metrics import classification_report, accuracy_score, make_scorer 

def classification_report_with_accuracy_score(y_true, y_pred): 

    print classification_report(y_true, y_pred) # print classification report 
    return accuracy_score(y_true, y_pred) # return accuracy score 

Maintenant, il suffit d'appeler cross_val_score avec notre nouvelle fonction de notation, en utilisant make_scorer:

# Nested CV with parameter optimization 
nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv, \ 
       scoring=make_scorer(classification_report_with_accuracy_score)) 
print nested_score 

Il imprimera le rapport de classification comme texte en même temps renvoyer le nested_score comme un nombre.

http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html exemple lorsqu'il est exécuté avec cette nouvelle fonction de notation, les dernières lignes de la sortie sera la suivante:

# precision recall f1-score support  
#0  1.00  1.00  1.00  14 
#1  1.00  1.00  1.00  14 
#2  1.00  1.00  1.00   9 

#avg/total  1.00  1.00  1.00  37 

#[ 0.94736842 1.   0.97297297 1. ] 

#Average difference of 0.007742 with std. dev. of 0.007688. 
+1

Merci. C'est en me donnant un rapport de classification pour le pli individuel mais je vais en faire une moyenne. – utengr

+1

Je vais ajouter le code pour le rapport de classification moyenne au cas où d'autres voudraient l'utiliser. – utengr

2

Son juste une addition à la réponse de Sandipan que je ne pouvais pas le modifier. Si l'on veut calculer le rapport de classification moyenne pour une course complète de la validation croisée au lieu des plis individuels, nous pouvons utiliser le code suivant:

# Variables for average classification report 
originalclass = [] 
predictedclass = [] 

#Make our customer score 
def classification_report_with_accuracy_score(y_true, y_pred): 
#print(classification_report(y_true, y_pred)) # print classification report 
originalclass.extend(y_true) 
predictedclass.extend(y_pred) 
return accuracy_score(y_true, y_pred) # return accuracy score 

inner_cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=i) 
outer_cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=i) 

# Non_nested parameter search and scoring 
clf = GridSearchCV(estimator=svr, param_grid=p_grid, cv=inner_cv) 

# Nested CV with parameter optimization 
nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv, scoring=make_scorer(classification_report_with_accuracy_score)) 

# Average values in classification report for all folds in a K-fold Cross-validation 
print(classification_report(originalclass, predictedclass)) 

Maintenant, le résultat pour l'exemple dans la réponse de Sandipan ressemblerait à ceci :

  precision recall f1-score support 

      0  1.00  1.00  1.00  50 
      1  0.96  0.94  0.95  50 
      2  0.94  0.96  0.95  50 

avg/total  0.97  0.97  0.97  150