我正试图用gridsearchcv和pipeline构建一个多输出模型。管道给我带来了麻烦,因为标准的分类器示例没有包装分类器的onevsrestClassifier()。我用的是SciKit Learn 0.18和python 3.5

## 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:估计量的参数估计量无效
管道(步骤=[('vect',countvectorizer(analyzer='word',
binary=false,解码错误='strict',
dtype=,encoding='utf-8',input='content',
小写=真,max_df=0.5,max_features=无,min_df=1,
ngram_range=(1,3),preprocessor=无,stop_words=无,
条带…er_t=0.5,随机_状态=42,随机移动=真,
verbose=0,warm_start=false),
n_jobs=-1)))。使用estimator.get_params().keys()查看可用参数列表。
那么,使用参数网格和管道将参数传递给CLF的正确方法是什么呢?我是否需要从管道中的分类器中分离矢量器和TDIDF?

最佳答案

将onevsrestClassifier()作为管道本身的一个步骤传递,将sgdclassifier作为onevsrestClassifier的估计量传递。
你可以这样走。

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

其余代码可以保持不变。OnevsrestClassifier充当其他估计量的包装器。

关于python - Scikit-learn多输出分类器使用:GridSearchCV,Pipeline,OneVsRestClassifier,SGDClassifier,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40352612/

10-10 18:21