具有向量输入的 Columntransformer 多列

数据挖掘 scikit-学习 预处理
2021-09-16 23:32:42

这可能更像是一个编码问题而不是数据科学,所以如果这不是提出这个问题的正确平台,我们深表歉意。

我的问题与sklearn'sColumnTransformer类有关。考虑'description'对应于具有 9508 行的文本/字符串数据列。以下按预期工作:

In [61]: transformer = ColumnTransformer(transformers=[('text-features', CountVectorizer(), 'description')])

In [62]: X=transformer.fit_transform(df)

In [63]: X.shape
Out[63]: (9508, 5913)

但是,以下(注意[]周围'description'):

In [64]: transformer = ColumnTransformer(transformers=[('text-features', CountVectorizer(), ['description'])])

In [65]: X=transformer.fit_transform(df)

没有按预期工作:

In [66]: X.shape
Out[66]: (1, 3)

请注意,解析其他转换器的列名列表没有问题,例如OneHotEncoder(). 这使得以编程方式为包含异构数据类型列的数据帧配置转换器变得困难。

一种可能性是单独为每列配置变压器,即使多列需要相同的变压器,但我想知道是否有更好的方法来处理这个问题?

2个回答

请参阅文档中的第 6.1.4 节

根据文档,每当转换器需要一维数组作为输入时,列都被指定为字符串 ( "title")。对于需要 2D 数据的转换器,我们需要将列指定为字符串列表 ( ["title"])。

使用make_column_transformer并设置remainder'passthrough'所有未在转换器中指定的剩余列将自动通过。

from sklearn.compose import make_column_transformer
...
df = ...

transformer = make_column_transformer((TfidfVectorizer(), ['text_column']),
                                      (OneHotEncoder(), ['categorical_column']), 
                                       remainder='passthrough')
X = transformer.fit_transform(df)