在处理文本数据时,我理解需要将文本标签编码成某种数值表示(例如,使用 LabelEncoder
、OneHotEncoder
等)。
但是,我的疑问是,当你使用一些特征提取类(例如 TfidfVectorizer
、CountVectorizer
等)时,是否需要显式地执行这一步,还是这些类会在后台自动对标签进行编码?
如果确实需要自己单独对标签进行编码,你能否在 Pipeline
中执行这一步(如下的示例)
pipeline = Pipeline(steps=[ ('tfidf', TfidfVectorizer()), ('sgd', SGDClassifier()) ])
或者你需要在使用管道之前先对标签进行编码,因为管道期望 fit()
和 transform()
数据(而不是标签)?
回答:
请查看 scikit-learn
词汇表中关于 transform 的术语:
在转换器中,将输入,通常只有 X,转换到某个转换空间(通常记为 Xt)。输出是一个数组或稀疏矩阵,长度为 n_samples,且列数在拟合后固定。
事实上,几乎所有转换器都只转换特征。这对 TfidfVectorizer
和 CountVectorizer
同样适用。如果有疑问,你总是可以检查转换函数的返回类型(例如 CountVectorizer
的 fit_transform
方法)。
当你在一个管道中组合多个转换器时,情况也是如此。这在其 用户指南 中有说明:
转换器通常与分类器、回归器或其他估计器结合使用,以构建一个复合估计器。最常用的工具是 Pipeline。Pipeline 通常与 FeatureUnion 结合使用,后者将转换器的输出连接成一个复合特征空间。TransformedTargetRegressor 处理目标的转换(例如对 y 进行对数变换)。相比之下,Pipeline 只转换观测数据(X)。
因此,总的来说,你通常需要单独处理标签,并且在拟合估计器/管道之前进行处理。