【问题标题】:How to combine a pipeline for all types of features, for categorical features and numerical features in one ColumnTransformerr?如何在一个 ColumnTransformer 中为所有类型的特征、分类特征和数值特征组合管道?
【发布时间】:2021-06-19 02:55:08
【问题描述】:

我正在尝试创建一个结合了的管道:

  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:

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

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

【问题讨论】:

    标签: scikit-learn pipeline sklearn-pandas


    【解决方案1】:

    你需要结合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

    【讨论】:

    • 我尝试了您的第二种方法,因为您说这种方法可以避免功能名称问题。最后的 ColumnTransformer 似乎确实将我的特征名称映射到整数,但我猜你的意思是,通过记住 ColumnTransformer 管道中传递的特征的顺序,可以轻松检索此映射。你是这个意思吗?
    • 正确:如果alltypes 不改变列的顺序或数量,那么使用索引就可以了。但除此之外,您需要知道哪些索引实际上对应于您想要进入数字或分类管道的内容。
    • 谢谢,这真的很有帮助!
    猜你喜欢
    • 2019-12-08
    • 2020-01-12
    • 2019-06-30
    • 1970-01-01
    • 2016-03-21
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多