2017-07-17 4 views
0

Wie kann ich die beste Pipeline aus einem Fit GridSearchCV extrahieren, so dass ich es an cross_val_predict weitergeben kann?Extrahieren Sie die beste Pipeline von GridSearchCV für cross_val_predict

Direkt Passing Pass GridSearchCV Objekt verursacht cross_val_predict, um die gesamte Grid-Suche wieder zu laufen, ich möchte nur die beste Pipeline unterliegen der cross_val_predict Auswertung.

Mein umluftunabhängigem Code ist unten:

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)) 

Was ich zur Zeit von der best_estimator_ die Pipeline wird manuell neu bauen tue. Aber meine Pipelines haben normalerweise mehr Schritte wie SVD oder PCA, und manchmal füge ich Schritte hinzu oder entferne sie und führe die Grid-Suchen erneut aus, um die Daten zu untersuchen. Dieser Schritt muss dann immer wiederholt werden, wenn die Pipeline manuell neu aufgebaut wird, was fehleranfällig ist.

Gibt es eine Möglichkeit, die beste Pipeline von einem Fit GridSearchCV direkt zu extrahieren, so dass ich es an cross_val_predict weitergeben kann?

Antwort

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

Werke und kehrt:

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 

[Bearbeiten] Wenn ich den Code wieder einfach pipeline vorbei versucht (die ursprüngliche Pipeline), ist es die gleiche Leistung zurück (wie best_pipeline tat vorbei). Es ist also möglich, dass Sie einfach mit der Pipeline selbst arbeiten können, aber ich bin nicht 100% ig dabei.

Verwandte Themen