簡體   English   中英

Scikit-learn多輸出分類器使用:GridSearchCV,Pipeline,OneVsRestClassifier,SGDClassifier

[英]Scikit-learn multi-output classifier using: GridSearchCV, Pipeline, OneVsRestClassifier, SGDClassifier

我正在嘗試使用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:估算器管道的無效參數估計器(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),預處理器= None,stop_words = None,strip ... er_t = 0.5,random_state = 42,shuffle = True, verbose = 0,warm_start = False),n_jobs = -1))])。 使用estimator.get_params().keys()檢查可用參數列表。

那么使用param_grid和Pipeline通過OneVsRestClassifier將參數傳遞給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充當其他估算器的包裝器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM