TypeError: если оценка не указана, переданная оценка должна иметь метод «оценка» при использовании CountVectorizer в GridSearch.

Я практикуюсь с текстом, используя scikit-learn.

Чтобы лучше познакомиться с GridSearch, я начну с примера кода, который можно найти здесь:

###############################################################################
# define a pipeline combining a text feature extractor with a simple
# classifier
pipeline = Pipeline([
    ('vect', CountVectorizer())
])

parameters = {
    'vect__max_df': (0.5, 0.75, 1.0)
}
grid_search.fit(X_train, y_train)

print("Best score: %0.3f" % grid_search.best_score_)  

Заметьте, я очень осторожен, и у меня есть только одна оценка и один параметр!

Я обнаружил, что когда я запускаю это, я получаю сообщение об ошибке:

TypeError: If no scoring is specified, the estimator passed should have a 'score' method. The estimator Pipeline(steps=[('vect', CountVectorizer(analyzer=u'word', binary=False, 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))]) does not.

Хммм... почему мне не хватает какого-то атрибута "оценка"?

Когда я проверяю возможные параметры,

print CountVectorizer().get_params().keys()   

Я не вижу ничего, где я мог бы выиграть, как это подразумевает этот ответ.

В документации сказано By default, parameter search uses the score function of the estimator to evaluate a parameter setting. Так зачем мне указывать метод оценки?

Несмотря на это, я думал, что мне может понадобиться явно передать аргумент scoring, но это не помогло и выдало мне ошибку: grid_search.fit(X_train, y_train, scoring=None)

Я не понимаю эту ошибку!


person Monica Heddneck    schedule 18.01.2016    source источник


Ответы (2)


GridSearch максимизирует оценку по сетке параметров. Вы должны указать, какой тип оценки использовать, потому что существует множество возможных типов оценок. Например, для задач классификации вы можете использовать точность, f1-оценку и т. д. Обычно тип оценки указывается путем передачи строки в аргументе scoring (см. оценочный параметр). В качестве альтернативы классы моделей, такие как SVC или RandomForestRegressor, будут иметь метод .score(). GridSearch вызовет это, если аргумент scoring не указан. Однако это может быть или не быть тем типом оценки, который вы хотите оптимизировать. Существует также возможность передать функцию в качестве аргумента scoring, если у вас есть необычная метрика, которую вы хотите использовать в GridSearch.

Преобразователи, такие как CountVectorizer, не реализуют метод оценки, потому что это просто детерминированные преобразования признаков. По той же причине не существует методов оценки, которые имеет смысл применять к этому типу объектов. Вам нужен класс модели (или, возможно, алгоритм кластеризации) в конце вашего конвейера, чтобы оценка имела смысл.

person Dthal    schedule 18.01.2016
comment
Да! Точно. Спасибо! Это сообщение об ошибке могло бы быть немного более описательным. Дело не в том, что в CV отсутствует аргумент оценки — скорее, в конвейере отсутствует нечто, что фактически делает оценку! - person Monica Heddneck; 18.01.2016
comment
Один вопрос, если позволите: скажем, у меня есть pipeline = Pipeline([ ('vect', CountVectorizer()), ('tfidf', TfidfTransformer()), ('clf', SGDRegressor()) ]). Я уверен, что он пробует и vect --> clf, и tfidf --> clf? - person Monica Heddneck; 18.01.2016
comment
Он просто оценит результат последнего шага, SGDRegressor. Перед этим конвейер пропускает ваши данные через преобразователь, а затем использует выходные данные преобразователя в качестве входных данных для модели. Прогнозы из модели — это то, что может быть лучше или хуже, вот что и оценивается. - person Dthal; 18.01.2016
comment
Имеет ли смысл идти vect --> tfidf --> regressor --> classifier, или мне нужно сделать отдельный конвейер для каждого конкретного оценщика? и СПАСИБО за помощь! - person Monica Heddneck; 18.01.2016
comment
Конвейер будет вызывать метод predict только для последней оценки в конвейере. Если перед классификатором есть регрессор, конвейер будет рассматривать его как преобразователь, а не как модель, и будет вызывать свой метод transform вместо метода predict. Обычно это не имеет смысла. - person Dthal; 18.01.2016
comment
@МоникаХедднек. Я не уверен, что правильно прочитал ваш предыдущий вопрос (второй комментарий). В этом конвейере данные поступают в CountVectorizer, а их выходные данные — в TfidfTransformer. Это не альтернативы, оба применяются к данным последовательно для каждой комбинации параметров в GridSearch. - person Dthal; 18.01.2016

Ага! Я понял.

Я не понимал, как работает конвейер. Конечно, я мог бы создать CountVectorizer, но зачем? Вы никак не можете получить от него оценку или вообще что-то с ним сделать, кроме как иметь разреженную матрицу, просто сидящую там.

Мне нужно создать классификатор (SGDRegressor) или регрессор (SGDClassifier).

Я не понимал, что трубопровод пойдет

Резюме --> Регрессор
или
Резюме --> Классификатор

Конвейер делает то, что подразумевает его название... соединяет объекты последовательно.

Другими словами, это работает:

pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('clf', SGDRegressor())
])
person Monica Heddneck    schedule 18.01.2016