2016-05-04 2 views
2

Как я могу использовать FeatureUnion в scikit learn, так что Gridsearch может обрабатывать его части по желанию?scikit-learn FeatureUnion gridsearch над подмножествами функций

Код ниже работает и устанавливает FeatureUnion с TfidfVectorizer для слов и TfidfVectorizer для символов.

При выполнении Gridsearch в дополнение к тестированию заданного пространства параметров я также хотел бы протестировать только «vect__wordvect» с его параметром ngram_range (без наличия TfidfVectorizer для символов), а также только «vect__lettervect» с нижний регистр True и False, другой TfidfVectorizer отключен.

EDIT: полный пример кода, основанный на предположении maxymoo.

Как это можно сделать?

from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.pipeline import Pipeline, FeatureUnion 
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.linear_model import LogisticRegression 
from sklearn.grid_search import GridSearchCV 
from sklearn.datasets import fetch_20newsgroups 

# setup the featureunion 
wordvect = TfidfVectorizer(analyzer='word') 
lettervect = CountVectorizer(analyzer='char') 
featureunionvect = FeatureUnion([("lettervect", lettervect), ("wordvect", wordvect)]) 

# setup the pipeline 
classifier = LogisticRegression(class_weight='balanced') 
pipeline = Pipeline([('vect', featureunionvect), ('classifier', classifier)]) 

# gridsearch parameters 
parameters = { 
      'vect__wordvect__ngram_range': [(1, 1), (1, 2)], # commenting out these two lines 
      'vect__lettervect__lowercase': [True, False],  # runs, but there is no parameterization anymore 
      'vect__transformer_list': [[('wordvect', wordvect)], 
             [('lettervect', lettervect)], 
             [('wordvect', wordvect), ('lettervect', lettervect)]]} 
gs_clf = GridSearchCV(pipeline, parameters) 

# data 
newsgroups_train = fetch_20newsgroups(subset='train', categories=['alt.atheism', 'sci.space']) 

# gridsearch CV 
gs_clf = GridSearchCV(pipeline, parameters) 
gs_clf = gs_clf.fit(newsgroups_train.data, newsgroups_train.target) 
for score in gs_clf.grid_scores_: 
    print "gridsearch scores: ", score 

ответ

3

FeatureUnion имеет параметр transformer_list, который можно использовать для сетки-поиск более; так что в вашем случае ваши параметры поиска сетки станут

parameters = {'vect__wordvect__ngram_range': [(1, 1), (1, 2)], 
       'vect__lettervect__lowercase': [True, False], 
       'vect__transformer_weights': [{"lettervect":1,"wordvect":0}, 
              {"lettervect":0,"wordvect":1}, 
              {"lettervect":1,"wordvect":1}]} 
+0

Отсутствует после vect__transformer_list. Даже после его исправления я получаю: 'vect__transformer_list': [[('wordvec': wordvec)], ^^ SyntaxError: недействительный синтаксис – tkja

+0

Документация по transformer_list довольно разрежена, я не понимаю, как исправить/скорректировать код на scikit learn 0.17.1 – tkja

+0

Извините, в моем ответе было много странных опечаток, я исправил его, теперь он работает? – maxymoo

Смежные вопросы