TypeError:如果没有指定评分,则在GridSearch中使用CountVectorizer时,传递的估算器应该有一个'score'方法

时间:2016-01-18 06:11:34

标签: python scikit-learn pipeline grid-search

我正在使用scikit-learn练习一些文字。

为了更熟悉GridSearch,我首先找到了here的一些示例代码:

###############################################################################
# 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()   

我没有看到任何可以得分的地方,正如this answer暗示的那样。

文档说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 个答案:

答案 0 :(得分:1)

GridSearch通过参数网格最大化得分。您必须指定要使用的分数类型,因为可能有许多不同类型的分数。例如,对于分类问题,您可以使用准确性,f1分数等。通常,通过在scoring参数中传递字符串来指定分数类型(请参阅scoring parameter)。或者,模型类(如SVC或RandomForestRegressor)将具有.score()方法。如果没有提供scoring参数,GridSearch将调用它。但是,这可能是您想要优化的分数类型,也可能不是。如果您有一个希望GridSearch使用的异常指标,还可以选择将函数作为scoring参数传递。

变形金刚,如CountVectorizer,不实施分数方法,因为它们只是确定性的特征变换。出于同样的原因,没有任何评分方法适用于该类型的对象。您需要在管道末尾使用模型类(或可能是聚类算法)才能进行评分。

答案 1 :(得分:0)

啊哈!我想到了。

我不了解管道是如何工作的。当然,我可以创建一个CountVectorizer,但为什么呢?除了坐在那里的稀疏矩阵之外,你无法从中获得分数,或基本上对它做任何事情。

我需要创建一个分类器(SGDRegressor)或一个回归器(SGDClassifier)。

我没有意识到管道将会出现

简历 - &gt;回归

简历 - &gt;分类器

管道就像它的名字所暗示的那样......将对象串联起来。

换句话说,这有效:

pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('clf', SGDRegressor())
])