ValueError: недопустимая модель параметра для оценщика CountVectorizer при использовании параметров GridSearch

У меня есть конвейер sklearn, который выполняет классификацию текста с использованием двух типов функций: стандартные функции tfidf, созданные с помощью CountVectorizer () и TfidfTransformer () (TfidfVectorizer ()), и некоторые лингвистические функции. Я пытаюсь передать различные диапазоны ngram в CountVectorizer (), а затем нахожу лучший n с помощью GridSearh.

Вот мой код:

text_clf = Pipeline([('union', FeatureUnion([
                              ('tfidf', Pipeline([
                                       ('sents', GetItem(key='sent')), 
                                       ('vect', CountVectorizer()),
                                       ('transform', TfidfTransformer())
                               ])),
                              ('LF', Pipeline([
                                     ('features', GetItem(key='features')), 
                                     ('dict_vect', DictVectorizer())
                               ]))],
                               transformer_weights={'LF': 0.6, 'tfidf': 0.8}
                               )),
                              ('clf', SGDClassifier())
                     ])

parameters = [{'union__tfidf__vect__model__ngram_range': ((1, 1), (1, 2), (1, 3), (1, 4)), 
            'clf__alpha': (1e-2, 1e-3, 1e-4, 1e-5), 
            'clf__loss': ('hinge', 'log', 'modified_huber', 'squared_hinge', 'perceptron'), 
            'clf__penalty': ('none', 'l2', 'l1', 'elasticnet'), 
            'clf__n_iter': (3, 4, 5, 6, 7, 8, 9, 10)}]

gs_clf = GridSearchCV(text_clf, parameters, cv=5, n_jobs=-1)
gs_clf = gs_clf.fit(all_data, labels)

(Я опускаю некоторые строки, которые, кажется, не имеют отношения к проблеме.)

Но выдает ошибку:

ValueError: Invalid parameter model for estimator CountVectorizer(analyzer=u'word', binary=False, charset=None,
    charset_error=None, decode_error=u'strict',
    dtype=<type 'numpy.int64'>, encoding=u'utf-8', input=u'content',
    lowercase=True, max_df=1.0, max_features=None, min_df=1,
    ngram_range=(1, 1), preprocessor=None, stop_words=None,
    strip_accents=None, token_pattern=u'(?u)\\b\\w\\w+\\b',
    tokenizer=None, vocabulary=None)

То же самое происходит с TfidfVectorizer ().

И все работает нормально, если я напрямую передаю ngram_range векторизатору в конвейере: ('vect', CountVectorizer(ngram_range=(1,2)))

Спасибо!


person Katya Stolpovskaya    schedule 06.10.2015    source источник


Ответы (2)


Ошибка в том, что у вас union__tfidf__vect__model__ngram_range, а должно быть union__tfidf__vect__ngram_range. Обратите внимание, как он вызывает "модель" как недопустимый параметр:

ValueError: недопустимая модель параметра

Также, в качестве примечания, я думаю, что использование TfidfVectorizer упростит ситуацию.

person David    schedule 06.10.2015
comment
Спасибо Дэвиду за помощь! Я просто запутался в этом сообщении: stackoverflow.com/questions/27810855/ - person Katya Stolpovskaya; 07.10.2015

У вас есть строгое именованное отношение между vectr__ tfidf__ clfsvm__

pipe_clf_svm = Pipeline([('vectr', CountVectorizer(analyzer=textproc_max, 
                    preprocessor=no_numb_preprocessor, min_df=4)),
                            ('tfidf', tfidfT), 
                                ('clfsvm', clf_svm),])

parameters2 = {'vectr__ngram_range': [(1,1),(1,2),(1,3)],
                  'tfidf__use_idf': (True, False),  #}
                    'clfsvm__alpha': (1e-2, 1e-3),}

эти 3 vectr__ tfidf__ clfsvm__ называются псевдонимами, как в pipe_clf_svm. named_steps ['vectr']

person Max Kleiner    schedule 19.07.2018