使用 ColumnTransformer/FeatureUnion 后构建完整数据框(特征值 + 名称)的推荐方法是啥?

Posted

技术标签:

【中文标题】使用 ColumnTransformer/FeatureUnion 后构建完整数据框(特征值 + 名称)的推荐方法是啥?【英文标题】:What's the recommended approach for building a complete data frame (feature values + names) after using ColumTransformer/ FeatureUnion?使用 ColumnTransformer/FeatureUnion 后构建完整数据框(特征值 + 名称)的推荐方法是什么? 【发布时间】:2020-03-18 05:55:45 【问题描述】:

我在 Internet 上多次看到此主题,但从未见过一个完整、全面的解决方案,该解决方案可以使用当前库版本的 sklearn 全面适用于所有用例。有人可以尝试使用以下示例解释如何实现吗?

In this example I'm using the following dataset

data = pd.read_csv('heart.csv')

# Preparing individual pipelines for numerical and categorical features
pipe_numeric = Pipeline(steps=[
    ('impute_num', SimpleImputer(
        missing_values = np.nan, 
        strategy = 'median', 
        copy = False, 
        add_indicator = True)
    )
])

pipe_categorical = Pipeline(steps=[
    ('impute_cat', SimpleImputer(
        missing_values = np.nan, 
        strategy = 'constant', 
        fill_value = 99999,
        copy = False)
    ),
    ('one_hot', OneHotEncoder(handle_unknown='ignore'))
])

# Combining them into a transformer
transformer_union = ColumnTransformer([
    ('feat_numeric', pipe_numeric, ['age']),
    ('feat_categorical', pipe_categorical, ['cp']),
], remainder = 'passthrough')

# Fitting the transformer
transformer_union.fit(data)

# We can then apply and get the data in the following way
transformer_union.transform(data)

# And it has the following shape
transformer_union.transform(data).shape

现在主要问题来了:如何有效地将输出的 numpy 数组与所有转换产生的新列名结合起来?这个例子虽然需要相当多的工作,但仍然相对简单,但如果管道更大,这可能会变得更加复杂。

# Transformers object
transformers = transformer_union.named_transformers_

# Categorical features (from transformer)
transformers['feat_categorical'].named_steps['one_hot'].get_feature_names()

# Numerical features (from transformer) - no names are available? 
transformers['feat_numeric'].named_steps['impute_num']

# All the other columns that were not transformed - no names are available?
transformers['remainder']

我已经检查了各种不同的示例,但似乎没有任何灵丹妙药:

    sklearn 本身不支持这一点 - 无法获得可以轻松与数组组合成新 DF 的列名对齐向量,但也许我弄错了 - 谁能指出我如果是这样的话,资源?

    有些人正在实施他们的自定义转换器/管道,但是当您想要构建大型管道时,这会有点忙

    是否有任何其他与 sklearn 相关的软件包可以缓解该问题?

我对 sklearn 的管理方式感到有些惊讶 - 在 tidymodels 生态系统中的 R 中(它仍在开发中,但尽管如此),使用 prepbake 方法很容易处理。我想它可以以某种方式类似地完成。

全面检查最终输出对于数据科学工作至关重要 - 有人可以就最佳路径提出建议吗?

【问题讨论】:

【参考方案1】:

sklearn 开发人员正在为此努力;讨论涵盖多个 SLEP 和许多问题。已经取得了一些进展,一些转换器实现了get_features_names,而另一些转换器在输入是熊猫数据框时具有跟踪列名的内部属性。 ColumnTransformer 确实有 get_feature_names,但 Pipeline 没有,所以它会在您的示例中失败。

目前最完整的解决方案好像是sklearn-pandas:https://github.com/scikit-learn-contrib/sklearn-pandas

另一个有趣的方法隐藏在eli5 中。在他们的explain_weights 中,他们有一个通用函数transform_feature_names。它有一些专门的调度,但除此之外尝试调用get_feature_names;最值得注意的是,Pipeline 有一个调度。不幸的是,目前这将在使用 Pipeline 作为转换器的 ColumnTransformer 上失败;有关示例和可能的解决方法,请参见 https://***.com/a/62124484/10495893。

【讨论】:

以上是关于使用 ColumnTransformer/FeatureUnion 后构建完整数据框(特征值 + 名称)的推荐方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)