在管道/gridSearch 中使用 TFI/DF 和 CountVectorizer

Posted

技术标签:

【中文标题】在管道/gridSearch 中使用 TFI/DF 和 CountVectorizer【英文标题】:Using TFI/DF and CountVectorizer in a pipeline/gridSearch 【发布时间】:2020-02-10 10:37:08 【问题描述】:

我正在尝试在一个管道中使用 TFI/DF 和 CountVectorizer。 我做了以下事情:

pipe = Pipeline([
    ('tfic', TfidfVectorizer()),
    ('cvec',  CountVectorizer()),
    ('lr' ,LogisticRegression())
])

及参数:

pipe_parms = 
    'cvec__max_features' : [100,500],
    'cvec__ngram_range' : [(1,1),(1,2)],
    'cvec__stop_words' : [ 'english', None]

网格搜索:

gs = GridSearchCV(pipe, param_grid= pipe_parms, cv=3)

我遇到了一个错误

未找到下层。

使用countVectorizerTfidfVectorizer 可以,但不能同时使用。

我阅读了有关 *** 的其他问题,他们表示如果我希望两者都使用一个管道工作,我应该使用 TfidfTransformer()。 这样做,我收到一个错误“无法将字符串转换为浮点数”

有没有办法在一个管道中使用两个矢量化器?或您建议的其他方法。

谢谢

编辑: 我找到了一个使用 FeatureUnion 组合 2 个并行转换器(在本例中为 count 和 Tfidf 矢量化器)的解决方案。 我在这里写了一篇关于它的简短博客文章: https://link.medium.com/OPzIU0T3N0

【问题讨论】:

【参考方案1】:

希望我的解释能让您更清楚地了解这里发生的事情。

首先您尝试应用TfidfVectorizer 转换。这会将文本集合更改为由数字组成的 TfidfVector。假设你有这个文本列表

texts = [
    'I am a bird',
    'a crow is a bird',
    'bird fly high in the sky',
    'bird bird bird',
    'black bird in the dead of night',
    'crow is black bird'
]

运行

TfidfVectorizer().fit_transform(texts).todense()

将导致

matrix([[0.91399636, 0.40572238, 0.        , 0.        , 0.        ,
         0.        , 0.        , 0.        , 0.        , 0.        ,
         0.        , 0.        , 0.        ],
        [0.        , 0.35748457, 0.        , 0.66038049, 0.        ,
         0.        , 0.        , 0.        , 0.66038049, 0.        ,
         0.        , 0.        , 0.        ],
...])

然后,从这个数字矩阵中,您尝试应用 CountVectorizer,我认为这不是您想要的。如果没有Pipeline,你的代码会是这样的

CountVectorizer().fit_transform(
    TfidfVectorizer().fit_transform(texts).todense()
)

根据scikit-learn's documentation CountVectorizer 接受字符串或字节序列而不是数字。

有没有办法在一个管道中使用两个矢量化器?或者你有什么其他的建议?

我建议您使用CountVectorizerTfidfVectorizer 之一,不要在1 个管道中同时使用。通俗地说,CountVectorizer 将输出您传递的字符串集合中每个单词的频率,而TfidfVectorizer 还将输出每个单词的标准化频率。话虽如此,这两种方法都有相同的目的:使用频率将文本集合更改为数字。因此,您应该只使用其中之一。

如果您详细说明,我很乐意添加我的答案,为什么要在一个管道中使用两个矢量化器。

【讨论】:

非常感谢您的回答,这有助于解释我不知道的不同事情。我发现使用 FeatureUnion 实际上可以让您在一个管道中同时执行两个矢量化器。我写了这个。 link.medium.com/OPzIU0T3N0

以上是关于在管道/gridSearch 中使用 TFI/DF 和 CountVectorizer的主要内容,如果未能解决你的问题,请参考以下文章

带有 SkLearn 管道的 GridSearch 无法正常工作

使用 Gridsearch 进行 RFE 排名

在 GridSearch CV 之后进行预测时是不是遵循管道步骤

使用带有管道和 GridSearch 的 cross_val_score 进行嵌套交叉验证

最佳模型的 GridSearch:保存和加载参数

ValueError:使用 GridSearch 参数时估计器 CountVectorizer 的参数模型无效