Использование VotingClassifier с другими классификаторами внутри конвейера Sklearn - PullRequest
0 голосов
/ 04 мая 2018

Я хочу использовать VotingClassifier внутри sklearn Pipeline, где я определил набор классификаторов ..

Я получил некоторую интуицию от этого вопроса: Использование VotingClassifier в Sklearn Pipeline для построения приведенного ниже кода, но в этом вопросе каждый из классификаторов определен в независимом конвейере. Я не Я хочу использовать его таким образом, когда у меня есть набор функций, подготовленных ранее, и не стоит повторять генерацию этих функций в нескольких конвейерах с разными классификаторами (трудоемкий процесс)!

Как мне этого добиться?!

model = Pipeline([
        ('feat', FeatureUnion([
            ('tfidf', TfidfVectorizer(analyzer='char', ngram_range=(3, 5), min_df=0.01, lowercase=True, tokenizer=tokenizeTfidf)),    
        ])),


        ('pip1', Pipeline([('clf1', GradientBoostingClassifier(n_estimators=1000, random_state=7))])),
        ('pip2', Pipeline([('clf2', SVC())])),
        ('pip3', Pipeline([('clf3', RandomForestClassifier())])),
        ('clf', VotingClassifier(estimators=["pip1", "pip2", "pip3"]))
    ])

clf = model.fit(X_train, y_train)

но я получил эту ошибку:

 ('clf', VotingClassifier(estimators=["pip1", "pip2", "pip3"])),
  File "C:\Python35\lib\site-packages\imblearn\pipeline.py", line 115, in __init__
    self._validate_steps()
  File "C:\Python35\lib\site-packages\imblearn\pipeline.py", line 139, in _validate_steps
    "(but not both) '%s' (type %s) doesn't)" % (t, type(t)))
TypeError: All intermediate steps of the chain should be estimators that implement fit and transform or sample (but not both) 'Pipeline(memory=None,
     steps=[('clf1', GradientBoostingClassifier(criterion='friedman_mse', init=None,
              learning_rate=0.1, loss='deviance', max_depth=3,
              max_features=None, max_leaf_nodes=None,
              min_impurity_decrease=0.0, min_impurity_split=None,
              min_samples_leaf=1, min_samples_split=2,
              min_weight_fraction_leaf=0.0, n_estimators=1000,
              presort='auto', random_state=7, subsample=1.0, verbose=0,
              warm_start=False))])' (type <class 'imblearn.pipeline.Pipeline'>) doesn't)

1 Ответ

0 голосов
/ 07 мая 2018

Я предполагаю, что вы хотите сделать что-то вроде этого:

1) Преобразовать текстовые данные в tfidf с помощью TfidfVectorizer 2) Отправьте преобразованные данные 3 оценщикам (GradientBoostingClassifier, SVC, RandomForestClassifier) ​​и затем используйте голосование для получения прогнозов.

Если это так, то это то, что вам нужно.

model = Pipeline([
        ('feat', FeatureUnion([
            ('tfidf', TfidfVectorizer(analyzer='char',  
                                      ngram_range=(3, 5), 
                                      min_df=0.01, 
                                      lowercase=True, 
                                      tokenizer=tokenizeTfidf)),    
        ])),
        ('clf', VotingClassifier(estimators=[("pip1", GradientBoostingClassifier(n_estimators=1000, 
                                                                                 random_state=7)), 
                                             ("pip2", SVC()), 
                                             ("pip3", RandomForestClassifier())]))
    ])

Кроме того, если вы используете только один TfidfVectorizer и не комбинируете с ним никакие другие функции, вам даже не понадобится FeatureUnion:

model = Pipeline([
        ('tfidf', TfidfVectorizer(analyzer='char',  
                                  ngram_range=(3, 5), 
                                  min_df=0.01, 
                                  lowercase=True, 
                                  tokenizer=tokenizeTfidf)),    
        ('clf', VotingClassifier(estimators=[("pip1", GradientBoostingClassifier(n_estimators=1000, 
                                                                                 random_state=7)), 
                                             ("pip2", SVC()), 
                                             ("pip3", RandomForestClassifier())]))
    ])
...