2016-11-15 1 views
0

J'utilise GridSearchCV comme ceci:sklearn GridSearchCV: comment obtenir un rapport de classification?

corpus = load_files('corpus') 

with open('stopwords.txt', 'r') as f: 
    stop_words = [y for x in f.read().split('\n') for y in (x, x.title())] 

x = corpus.data 

y = corpus.target 

pipeline = Pipeline([ 
    ('vec', CountVectorizer(stop_words=stop_words)), 
    ('classifier', MultinomialNB())]) 

parameters = {'vec__ngram_range': [(1, 1), (1, 2)], 
       'classifier__alpha': [1e-2, 1e-3], 
       'classifier__fit_prior': [True, False]} 

gs_clf = GridSearchCV(pipeline, parameters, n_jobs=-1, cv=5, scoring="f1", verbose=10) 

gs_clf = gs_clf.fit(x, y) 

joblib.dump(gs_clf.best_estimator_, 'MultinomialNB.pkl', compress=1) 

Puis, dans un autre fichier, pour classer les nouveaux documents (non du corpus), je fais ceci:

classifier = joblib.load(filepath) # path to .pkl file 
    result = classifier.predict(tokenlist) 

Ma question est: Où Je reçois les valeurs nécessaires pour le classification_report?

Dans de nombreux autres exemples, je vois des gens diviser le corpus en ensemble de traing et en test. Cependant, puisque j'utilise GridSearchCV avec kfold-cross-validation, je n'ai pas besoin de faire ça. Alors, comment puis-je obtenir ces valeurs de GridSearchCV?

+0

Juste une question, ne pas 'gs_clf.fit (x, y) 'return' Aucune'? – BallpointBen

+0

@BallpointBen Pourquoi le ferais-je? x et y contiennent des données – user3813234

Répondre

1

Le meilleur modèle est dans clf.best_estimator_. Vous devez adapter les données d'entraînement à ceci; puis prédisez vos données de test et utilisez ytest et ypreds pour le rapport de classification.

+0

Merci pour votre réponse! Donc, pour être clair: pour le GridSearchCV j'utilise toutes les données (corpus, data et corpus.target dans mon cas) mais pour le meilleur classificateur, je partitionne les données en x_test, X_train, Y_test, Y_train en utilisant train_test_split? – user3813234

+0

Oui. Si vous souhaitez que les scores soient fiables, ils doivent être comparés à un ensemble de données différent de l'ensemble utilisé pour l'ajustement. – simon

+0

Si vous avez suffisamment de données, vous pouvez diviser les données avant de procéder à la recherche de grids. – simon

0

Si vous avez objet GridSearchCV:

from sklearn.metrics import classification_report 
clf = GridSearchCV(....) 
clf.fit(x_train, y_train) 
classification_report(clf.best_estimator_.predict(x_test), y_test) 

Si vous avez enregistré le meilleur estimateur et chargé il alors:

classifier = joblib.load(filepath) 
classification_report(classifier.predict(x_test), y_test)