Scikit-learn multi-output classifier using: GridSearchCV, Pipeline, OneVsRestClassifier, SGDClassifier
<p>I am attempting to build a multi-output model with GridSearchCV and Pipeline. The Pipeline is giving me trouble because standard classifier examples don't have the OneVsRestClassifier() wrapping the classifier. I'm using scikit-learn 0.18 and python 3.5</p>

<pre><code>## 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)
</code></pre>

<p>But this yields the error:
....</p>

<blockquote>
  <p>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 <code>estimator.get_params().keys()</code>.</p>
</blockquote>

<p>So what is the correct way to pass parameters to clf through the OneVsRestClassifier using param_grid and Pipeline? Do I need to separate the vectorizer and tdidf from the classifier in the Pipeline?</p>