GridSearchCVとPipelineで複数出力モデルを構築しようとしています。標準の分類器の例では、分類器を折り返すOneVsRestClassifier()がないため、Pipelineは問題を抱えています。私はscikit-学ぶ0.18とPython 3.5GridSearchCV、Pipeline、OneVsRestClassifier、SGDClassifierを使用したScikit-learnのマルチ出力クラシファイア
## 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)
しかし、これは誤りもたらし使用しています: を....
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()
.
のでOneVsRestClassifierを通じてCLFにパラメータを渡すための正しい方法は何ですかparam_gridとPipelineを使用していますか?ベクタライザとtdidfをパイプラインの分類器から分離する必要がありますか?
それがうまくいった! (1)SGDClassifierをラップするために、パイプライン内のOneVsRestClassifierを移動しました。 (2)プレフィックス 'clf__'をparam_gridの見積もりパラメータ、つまり 'clf__estimator__penalty'に追加しました。 – MyopicVisage