Python TypeError:如果未指定评分,则通过的估计员应具有';得分';方法,当在GridSearch中使用CountVectorizer时
我正在使用scikit学习练习一些文本 为了更加熟悉GridSearch,我从以下示例代码开始: 注意,我在这里非常小心,我只有一个估计器和一个参数 我发现当我运行此命令时,会出现以下错误: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=
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())
])