Python TypeError:如果未指定评分,则通过的估计员应具有';得分';方法,当在GridSearch中使用CountVectorizer时

Python TypeError:如果未指定评分,则通过的估计员应具有';得分';方法,当在GridSearch中使用CountVectorizer时,python,scikit-learn,pipeline,grid-search,Python,Scikit Learn,Pipeline,Grid Search,我正在使用scikit学习练习一些文本 为了更加熟悉GridSearch,我从以下示例代码开始: 注意,我在这里非常小心,我只有一个估计器和一个参数 我发现当我运行此命令时,会出现以下错误: TypeError: If no scoring is specified, the estimator passed should have a 'score' method. The estimator Pipeline(steps=[('vect', CountVectorizer(analyzer=

我正在使用scikit学习练习一些文本

为了更加熟悉GridSearch,我从以下示例代码开始:

注意,我在这里非常小心,我只有一个估计器和一个参数

我发现当我运行此命令时,会出现以下错误:

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.
我看不到任何我可以得分的地方,这一点是由

文档中说,
默认情况下,参数搜索使用估计器的评分函数来评估参数设置。
那么为什么我需要指定评分方法呢

无论如何,我认为我可能需要明确地传递一个
评分
参数,但这没有帮助,并给了我一个错误:
grid\u search.fit(X\u train,y\u train,scoring=None)


我不明白这个错误

GridSearch将参数网格上的分数最大化。您必须指定使用哪种分数,因为可能有许多不同类型的分数。例如,对于分类问题,您可以使用精度、f1分数等。通常,分数类型是通过在
scoring
参数中传递字符串来指定的(请参阅)。或者,模型类,如SVC或RandomForestRegressionor,将有一个
.score()
方法。如果未提供
评分
参数,GridSearch将调用该函数。但是,这可能是您想要优化的分数类型,也可能不是。如果您希望GridSearch使用一个不寻常的度量,那么还可以选择将一个函数作为
scoring
参数传入


变换器和CountVectorizer一样,不实现score方法,因为它们只是确定性特征变换。出于同样的原因,没有任何评分方法适用于该类型的对象。您需要在管道的末尾添加一个模型类(或者可能是一个聚类算法),以便进行合理的评分。

GridSearch将参数网格上的评分最大化。您必须指定使用哪种分数,因为可能有许多不同类型的分数。例如,对于分类问题,您可以使用精度、f1分数等。通常,分数类型是通过在
scoring
参数中传递字符串来指定的(请参阅)。或者,模型类,如SVC或RandomForestRegressionor,将有一个
.score()
方法。如果未提供
评分
参数,GridSearch将调用该函数。但是,这可能是您想要优化的分数类型,也可能不是。如果您希望GridSearch使用一个不寻常的度量,那么还可以选择将一个函数作为
scoring
参数传入


变换器和CountVectorizer一样,不实现score方法,因为它们只是确定性特征变换。出于同样的原因,没有任何评分方法适用于该类型的对象。你需要一个模型类(或者可能是一个聚类算法)在你的管道的末尾,以便进行有意义的评分。

Aha!我想出来了

我不明白管道是怎么工作的。当然,我可以创建一个
计数向量器
,但为什么呢?你不可能从中得到分数,或者基本上用它做任何事情,除了有一个稀疏矩阵坐在那里

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

我没有意识到管道会断开

CV-->回归器

CV-->分类器

管道做它的名字所暗示的…将对象串联在一起

换句话说,这是有效的:

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

啊哈!我想出来了

我不明白管道是怎么工作的。当然,我可以创建一个
计数向量器
,但为什么呢?你不可能从中得到分数,或者基本上用它做任何事情,除了有一个稀疏矩阵坐在那里

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

我没有意识到管道会断开

CV-->回归器

CV-->分类器

管道做它的名字所暗示的…将对象串联在一起

换句话说,这是有效的:

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

对确切地谢谢这个错误消息肯定会更具描述性。这并不是说简历中缺少了一个得分参数——而是管道中缺少了一些真正能够得分的东西!如果可以的话,我还有一个问题:假设我有
pipeline=pipeline([('vect',countvectorier()),('tfidf',tfidftranformer()),('clf',SGDRegressor())])
。我确信它会同时尝试
vect
-->
clf
,以及
tfidf
-->
clf
?它只会对最后一步的输出,即sgdregrestor进行评分。在此之前,管道通过转换器运行数据,然后使用转换器的输出作为模型的输入。模型中的预测是好的还是坏的,所以这就是得分的原因。使用
vect
-->
tfidf
-->
回归器
-->
分类器
或者我应该为每个特定的估计器执行单独的管道吗?谢谢你的帮助@莫尼卡赫德内克。我不确定我是否正确阅读了你先前的问题(第二条评论)。在该管道中,数据进入
countvectorier
,其输出进入
TfidfTransformer
。这些不是备选方案,它们都是按顺序应用于GridSearch中每个参数组合的数据。是的!确切地谢谢这个错误消息肯定会更具描述性。这并不是说简历中缺少了一个得分参数——而是管道中缺少了一些真正能够得分的东西!如果可以的话,我有一个问题:假设我有
pipeline=Pipelin
pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('clf', SGDRegressor())
])