Scikit learn 如何将所有类型的特征、分类特征和数字特征的管道组合在一个列Transformer中?

Scikit learn 如何将所有类型的特征、分类特征和数字特征的管道组合在一个列Transformer中?,scikit-learn,pipeline,sklearn-pandas,Scikit Learn,Pipeline,Sklearn Pandas,我正在尝试创建一个结合以下内容的管道: 用于各种功能的管道,无论类型如何(按功能清除不正确的数据) 分类特征管道(分类输入器) 数字特征管道(数字输入器) 在一个 这是我要做的一段代码 from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline alltypes = Pipeline([ ('column_name_normalizer',ColumnNameNormalizer

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

  • 用于各种功能的管道,无论类型如何(按功能清除不正确的数据)
  • 分类特征管道(分类输入器)
  • 数字特征管道(数字输入器)
  • 在一个

    这是我要做的一段代码

    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))
    
    然而,最终我得到了一个数据帧,其特征数量比开始时更多,这是因为管道中的所有特征都是串联的,而不是对它们执行运算符联合:

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


    您知道如何解决此问题吗?

    您需要结合管道的顺序功能,例如

    cat\u num\u split=列变压器([
    (“num”,num_管道,numfeat),
    (“cat”,cat_管道,catfeat),
    ])
    完整管道=管道([
    (“所有类型”,所有类型),
    (“猫数”,猫数分裂),
    )]
    
    这里有一个陷阱:
    alltypes
    转换器将生成一个numpy数组,其中没有关于哪些列是哪些列的信息;您的
    cat_num_split
    功能列表
    numfeat
    catfeat
    将取决于您对哪些列是哪些列的了解,并且不能使用列名

    另一种不涉及功能名称问题的方法是在此处切换顺序

    num\u full\u管道=管道([
    (“普通”,所有类型),
    (“num”,num_管道),
    ])
    cat_满管=管道([
    (“普通”,所有类型),
    (“cat”,cat_管道),
    ])
    全管道=柱形变压器([
    (“num”,num_full_pipe,numfeat),
    (“cat”,cat_满管,catfeat),
    ])
    

    另请参见。

    我尝试了您的第二种方法,因为您说过这一种方法可以避免功能名称问题。最后的ColumnTransformer似乎确实将我的特性名称映射为整数,但我猜您的意思是,通过记住ColumnTransformer管道中传递的特性的顺序,可以轻松地检索此映射。这就是你的意思吗?对:如果
    alltypes
    不改变列的顺序或数量,那么使用索引就可以了。但除此之外,您需要知道哪些索引实际上对应于要进入数字管道或分类管道的内容。谢谢,这真的很有帮助!