TypeError: Если оценка не указана, переданный оценщик должен иметь метод "Score" при использовании 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)
Я не понимаю эту ошибку!
2 ответа
GridSearch максимизирует оценку по сетке параметров. Вы должны указать, какой тип оценки использовать, потому что существует множество возможных типов оценок. Например, для задач классификации можно использовать точность, f1-оценку и т. Д. Обычно тип оценки определяется передачей строки в scoring
аргумент (см. параметр оценки). Альтернативно, классы моделей, такие как SVC или RandomForestRegressor, будут иметь .score()
метод. GridSearch будет называть это, если нет scoring
аргумент предоставляется. Однако это может быть, а может и не быть типом оценки, которую вы хотите оптимизировать. Существует также возможность передачи функции в качестве scoring
аргумент, если у вас есть необычная метрика, которую вы хотите использовать GridSearch.
Трансформаторы, такие как CountVectorizer, не реализуют метод оценки, потому что они являются просто детерминированными преобразованиями функций. По той же причине, нет никаких методов оценки, которые имеют смысл применять к этому типу объекта. Вам нужен класс модели (или, возможно, алгоритм кластеризации) в конце вашего конвейера, чтобы оценка имела смысл.
Ага! Я понял.
Я не понимал, как работает трубопровод. Конечно, я мог бы создать CountVectorizer
, но почему? Нет никакого способа, которым вы можете получить оценку или сделать что-то с этим, кроме того, что у вас есть небольшая матрица.
Мне нужно создать классификатор (SGDRegressor) или регрессор (SGDClassifier).
Я не понимал, что трубопровод пойдет
CV -> Регрессор
или же
CV -> Классификатор
Конвейер делает то, что подразумевает его название... объединяет объекты в серию.
Другими словами, это работает:
pipeline = Pipeline([
('vect', CountVectorizer()),
('clf', SGDRegressor())
])