2016-11-15 7 views
0

Я использую GridSearchCV так:sklearn GridSearchCV: как получить классификационный отчет?

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) 

Затем, в другом файле, чтобы классифицировать новые документы (а не от корпуса), я делаю это:

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

Мой вопрос: Где Я получаю значения, необходимые для classification_report?

Во многих других примерах я вижу, как люди разбивают корпус на набор трассировки и набор тестов. Однако, поскольку я использую GridSearchCV с перекрестной проверкой kfold, мне не нужно это делать. Так как я могу получить эти значения от GridSearchCV?

+0

Просто вопрос, не 'gs_clf.fit (х, у) 'return' None'? – BallpointBen

+0

@BallpointBen Почему? x и y содержат данные – user3813234

ответ

1

Лучшая модель находится в clf.best_estimator_. Вам нужно подгонять данные обучения; затем предскажите свои тестовые данные и используйте ytest и ypreds для отчета о классификации.

+0

Спасибо за ваш ответ! Поэтому просто для того, чтобы быть ясным: для GridSearchCV я использую все данные (corpus, data и corpus.target в моем случае), но для лучшего классификатора я разбиваю данные на x_test, X_train, Y_test, Y_train с помощью train_test_split? – user3813234

+0

Да. Если вы хотите, чтобы баллы были надежными, они должны измерять разные данные в наборе, используемом для установки. – simon

+0

Если у вас достаточно данных, вы можете разделить данные перед выполнением gridsearch. – simon

0

Если у вас есть 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) 

Если вы сохранили лучший оценщик и загрузил его тогда:

classifier = joblib.load(filepath) 
classification_report(classifier.predict(x_test), y_test) 
Смежные вопросы