0

我正在使用 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)

我不明白这个错误!

4

2 回答 2

2

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

Transformer,如 CountVectorizer,不实现 score 方法,因为它们只是确定性的特征转换。出于同样的原因,没有任何评分方法适用于该类型的对象。你需要一个模型类(或者可能是一个聚类算法)在你的管道结束时才有意义。

于 2016-01-18T06:38:27.113 回答
1

啊哈!我想到了。

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

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

我没有意识到管道会走

CV --> Regressor
or
CV --> Classifier

管道执行其名称所暗示的...将对象串联在一起。

换句话说,这有效:

pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('clf', SGDRegressor())
])
于 2016-01-18T06:43:12.543 回答