使用 `TfidfVectorizer`、`CountVectorizer` 等时需要对标签进行编码吗?

Posted

技术标签:

【中文标题】使用 `TfidfVectorizer`、`CountVectorizer` 等时需要对标签进行编码吗?【英文标题】:It is necessary to encode labels when using `TfidfVectorizer`, `CountVectorizer` etc? 【发布时间】:2021-08-25 01:32:27 【问题描述】:

在处理文本数据时,我理解需要将文本标签编码为某种数字表示(即,通过使用 LabelEncoderOneHotEncoder 等)

但是,我的问题是,当您使用某些特征提取类(即TfidfVectorizerCountVectorizer 等)时,您是否需要明确执行此步骤,或者这些是否会为您编码标签?

如果您确实需要自己单独对标签进行编码,您是否可以在Pipeline 中执行此步骤(如下图所示)

    pipeline = Pipeline(steps=[
        ('tfidf', TfidfVectorizer()),
        ('sgd', SGDClassifier())
    ])

或者您是否需要事先对标签进行编码,因为管道需要 fit()transform() 数据(而不是标签)?

【问题讨论】:

【参考方案1】:

查看 scikit-learn 词汇表中的术语 transform:

在转换器中,将输入(通常只有 X)转换为一些转换后的空间(通常表示为 Xt)。输出是一个长度为 n_samples 且列数在拟合后固定的数组或稀疏矩阵。

事实上,几乎所有的转换器都只转换特征。这也适用于TfidfVectorizerCountVectorizer。如果有疑问,您可以随时检查转换函数的返回类型(如CountVectorizerfit_transform 方法)。

在管道中组装多个变压器时也是如此。它在其user guide中声明:

Transformers 通常与分类器、回归器或其他估计器组合以构建复合估计器。最常用的工具是管道。 Pipeline 通常与 FeatureUnion 结合使用,它将转换器的输出连接到复合特征空间中。 TransformedTargetRegressor 处理变换目标(即对数变换 y)。 相比之下,Pipelines 只转换观察到的数据 (X)

因此,总而言之,您通常会在适合估算器/管道之前单独处理标签。

【讨论】:

以上是关于使用 `TfidfVectorizer`、`CountVectorizer` 等时需要对标签进行编码吗?的主要内容,如果未能解决你的问题,请参考以下文章

存储 TfidfVectorizer 以供将来使用

使用 Sklearn 的 TfidfVectorizer 变换

在实践中如何使用 TfidfVectorizer 和元数据进行分类?

Tfidftransformer 和 Tfidfvectorizer 有啥区别?

将提取的向量加载到 TfidfVectorizer

使用 `TfidfVectorizer`、`CountVectorizer` 等时需要对标签进行编码吗?