如何在一个 ColumnTransformer 中为所有类型的特征、分类特征和数字特征组合管道?

How to combine a pipeline for all types of features, for categorical features and numerical features in one ColumnTransformerr?

我正在尝试创建一个结合以下内容的管道:

  1. 各种功能的管道,无论类型如何(按功能清理不正确的数据)
  2. 分类特征的管道(分类输入器)
  3. 数值特征管道(数值输入器)

sklearn.compose.ColumnTransformer¶。

这是我正在尝试做的一段代码

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

alltypes = Pipeline([
    ('column_name_normalizer',ColumnNameNormalizer()),
    ('column_incorrect_data_cleaner',ColumnIncorrectDataCleaner(some_parameter),
])

num_pipeline = Pipeline([
    ('imputer',CustomNumImputer(some_parameter)), # remplir les valeurs manquants
])

cat_pipeline = Pipeline([
    ("cat", CustomCatImputer(some_parameter))
])

full_pipeline = ColumnTransformer([
        ("alltypes",alltypes,allcolumns),
        ("num", num_pipeline, numfeat),
        ("cat",cat_pipeline,catfeat)
])

try:
    X = pd.DataFrame(full_pipeline.fit_transform(X).toarray())
except AttributeError:
    X = pd.DataFrame(full_pipeline.fit_transform(X))

但是最后我得到了一个比开始时具有更多特征的数据框,这是因为管道中的所有特征都被连接起来,而不是对它们执行运算符 UNION:

例如我想对所有特征做一些转换,然后对分类特征做一些转换,对数值特征做一些转换,但我希望输出数据帧的大小始终相同。

你知道我该如何解决这个问题吗?

需要合并Pipeline的顺序幂,例如

cat_num_split = ColumnTransformer([
    ("num", num_pipeline, numfeat),
    ("cat", cat_pipeline, catfeat),
])
full_pipeline = Pipeline([
    ("alltypes", alltypes),
    ("cat_num", cat_num_split),
)]

这里有一个陷阱:alltypes 转换器将生成一个没有关于哪些列是哪些列的信息的 numpy 数组;您的 cat_num_split 功能列表 numfeatcatfeat 将取决于您对哪些列的了解,并且不能使用列名。

另一个不 运行 功能名称问题的替代方法是在此处切换顺序。

num_full_pipe = Pipeline([
    ("common", alltypes),
    ("num", num_pipeline),
])
cat_full_pipe = Pipeline([
    ("common", alltypes),
    ("cat", cat_pipeline),
])
full_pipeline = ColumnTransformer([
    ("num", num_full_pipe, numfeat),
    ("cat", cat_full_pipe, catfeat),
])

另见 Consistent ColumnTransformer for intersecting lists of columns