2016-11-01 4 views
2

Ich versuche, ein Multi-Output-Modell mit GridSearchCV und Pipeline zu erstellen. Die Pipeline bereitet mir Probleme, weil Standard-Klassifikator-Beispiele nicht den OneVsRestClassifier() haben, der den Klassifikator umschließt. Ich verwende Scikit-Learn 0,18 und Python 3,5Scikit-lernen Multi-Output-Klassifikator mit: GridSearchCV, Pipeline, OneVsRestClassifier, SGDClassifier

## Pipeline: Train and Predict 
## SGD: support vector machine (SVM) with gradient descent 
from sklearn.multiclass import OneVsRestClassifier 
from sklearn.pipeline import Pipeline 
from sklearn.linear_model import SGDClassifier 

clf = Pipeline([ 
       ('vect', CountVectorizer(ngram_range=(1,3), max_df=0.50)), 
       ('tfidf', TfidfTransformer()), 
       ('clf', SGDClassifier(loss='modified_huber', penalty='elasticnet', 
              alpha=1e-4, n_iter=5, random_state=42, 
              shuffle=True, n_jobs=-1)), 
       ]) 

ovr_clf = OneVsRestClassifier(clf) 

from sklearn.model_selection import GridSearchCV 
parameters = {'vect__ngram_range': [(1,1), (1,3)], 
       'tfidf__norm': ('l1', 'l2', None), 
       'estimator__loss': ('modified_huber', 'hinge',), 
      } 

gs_clf = GridSearchCV(estimator=pipeline, param_grid=parameters, 
         scoring='f1_weighted', n_jobs=-1, verbose=1) 
gs_clf = gs_clf.fit(X_train, y_train) 

Aber das ergibt den Fehler: ....

ValueError: Invalid parameter estimator for estimator Pipeline(steps=[('vect', CountVectorizer(analyzer='word', binary=False, decode_error='strict', dtype=, encoding='utf-8', input='content', lowercase=True, max_df=0.5, max_features=None, min_df=1, ngram_range=(1, 3), preprocessor=None, stop_words=None, strip...er_t=0.5, random_state=42, shuffle=True, verbose=0, warm_start=False), n_jobs=-1))]). Check the list of available parameters with estimator.get_params().keys() .

Also, was ist der richtige Weg, Parameter, um durch die OneVsRestClassifier CLF mit param_grid und Pipeline? Muss ich den Vectorizer und Tdidf vom Klassifikator in der Pipeline trennen?

Antwort

6

Übergeben Sie OneVsRestClassifier() als einen Schritt der Pipeline selbst und SGDClassifier als Schätzer von OneVsRestClassifier. Sie können so gehen.

pipeline = Pipeline([ 
       ('vect', CountVectorizer(ngram_range=(1,3), max_df=0.50)), 
       ('tfidf', TfidfTransformer()), 
       ('clf', OneVsRestClassifier(SGDClassifier(loss='modified_huber', penalty='elasticnet', 
              alpha=1e-4, n_iter=5, random_state=42, 
              shuffle=True, n_jobs=-1))), 
       ]) 

Der Rest des Codes kann gleich bleiben. OneVsRestClassifier fungiert als Wrapper für andere Schätzfunktionen.

+2

Das hat funktioniert! (1) Ich habe den OneVsRestClassifier innerhalb der Pipeline verschoben, um SGDClassifier zu umbrechen. (2) Ich habe das Präfix "clf__" zu den param_grid-Handhabungsschätzparametern, d. H. "Clf__stimator__penalty", hinzugefügt. – MyopicVisage

Verwandte Themen