Извлеките лучший конвейер из GridSearchCV для cross_val_predict

Как я могу извлечь лучший конвейер из подгонки GridSearchCV, чтобы я мог передать его cross_val_predict?

Прямая передача подходящего объекта GridSearchCV приводит к тому, что cross_val_predict снова запускает поиск по всей сетке, я просто хочу, чтобы лучший конвейер подвергся оценке cross_val_predict.

Мой автономный код ниже:

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
from sklearn.multiclass import OneVsRestClassifier
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV
from sklearn.model_selection import cross_val_predict
from sklearn.model_selection import StratifiedKFold
from sklearn import metrics

# fetch data data
newsgroups = fetch_20newsgroups(remove=('headers', 'footers', 'quotes'), categories=['comp.graphics', 'rec.sport.baseball', 'sci.med'])
X = newsgroups.data
y = newsgroups.target

# setup and run GridSearchCV
wordvect = TfidfVectorizer(analyzer='word', lowercase=True)
classifier = OneVsRestClassifier(SVC(kernel='linear', class_weight='balanced'))
pipeline = Pipeline([('vect', wordvect), ('classifier', classifier)])
scoring = 'f1_weighted'
parameters = {
            'vect__min_df': [1, 2],
            'vect__max_df': [0.8, 0.9],
            'classifier__estimator__C': [0.1, 1, 10]
            }
gs_clf = GridSearchCV(pipeline, parameters, n_jobs=8, scoring=scoring, verbose=1)
gs_clf = gs_clf.fit(X, y)

### outputs: Fitting 3 folds for each of 12 candidates, totalling 36 fits

# manually extract the best models from the grid search to re-build the pipeline
best_clf = gs_clf.best_estimator_.named_steps['classifier']
best_vectorizer = gs_clf.best_estimator_.named_steps['vect']
best_pipeline = Pipeline([('best_vectorizer', best_vectorizer), ('classifier', best_clf)])

# passing gs_clf here would run the grind search again inside cross_val_predict
y_predicted = cross_val_predict(pipeline, X, y)
print(metrics.classification_report(y, y_predicted, digits=3))

Что я сейчас делаю, так это вручную перестраиваю пайплайн из best_estimator_. Но мои конвейеры обычно имеют больше шагов, таких как SVD или PCA, и иногда я добавляю или удаляю шаги и повторно запускаю поиск по сетке для изучения данных. Этот шаг необходимо всегда повторять ниже при повторном построении конвейера вручную, что может привести к ошибкам.

Есть ли способ напрямую извлечь лучший конвейер из подгонки GridSearchCV, чтобы я мог передать его cross_val_predict ?


person tkja    schedule 17.07.2017    source источник


Ответы (2)


y_predicted = cross_val_predict(gs_clf.best_estimator_, X, y)

работает и возвращает:

Fitting 3 folds for each of 12 candidates, totalling 36 fits
[Parallel(n_jobs=4)]: Done  36 out of  36 | elapsed:   43.6s finished
             precision    recall  f1-score   support

          0      0.920     0.911     0.916       584
          1      0.894     0.943     0.918       597
          2      0.929     0.887     0.908       594

avg / total      0.914     0.914     0.914      1775

[Изменить] Когда я снова попытался передать код просто pipeline (исходный конвейер), он вернул тот же результат (как и при передаче best_pipeline). Так что, возможно, вы могли бы просто работать с самим конвейером, но я не уверен в этом на 100%.

person Kevin    schedule 17.07.2017

Назовите свой объект gridsearch как хотите, затем используйте метод fit для получения результатов. Вам не нужно снова выполнять перекрестную проверку, потому что GridSearchCV в основном является перекрестной проверкой с различными параметрами (к вашему сведению, вы можете назвать свой собственный объект cv в GridSearchCV, проверьте GridSearchCV в документации sklearn).

any_name = sklearn.grid_search.GridSearchCV(pipeline, param_grid=parameters)
any_name.fit(X_train, y_train)

Ниже приведена ссылка на хорошее руководство, которое я нашел: https://www.civisanalytics.com/blog/workflows-in-python-using-pipeline-and-gridsearchcv-for-more-compact-and-всеобъемлющийкод/

Первый ответ на SO, надеюсь, это поможет.

person Richard    schedule 16.04.2018