python - 使用 ColumTransformer/FeatureUnion 后构建完整数据框(特征值 + 名称)的推荐方法是什么?
问题描述
我在 Internet 上多次看到这个主题,但从未见过一个完整、全面的解决方案,它可以适用于当前库版本的 sklearn 的所有用例。有人可以尝试使用以下示例解释如何实现吗?
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 中(它仍在开发中,但尽管如此),使用prep
andbake
方法很容易处理。我想它可以以某种方式类似地完成。
全面检查最终输出对于数据科学工作至关重要——有人可以就最佳路径提出建议吗?
解决方案
sklearn 开发人员正在为此努力;讨论涵盖多个 SLEP 和许多问题。已经取得了一些进展,get_features_names
当输入是 pandas 数据框时,一些转换器实现了,而另一些则具有跟踪列名的内部属性。 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://stackoverflow.com/a/62124484/10495893 。
推荐阅读
- javascript - 请求解释 React 中“将事件处理程序绑定到类实例”的概念
- java - com.example.myapplication W/ActivityThread:handleWindowVisibility:令牌 android.os.BinderProxy@4fbd972 没有活动
- android - 插件和应用程序发布的颤振问题
- javascript - 加载选项后选择元素上的默认值
- c++ - 我写了一个英语到猪拉丁语转换器,即使它编译正确,它也说它在抛出一个'std :: out of range'的实例后终止
- node.js - NodeJS - 与 python 交互式 shell 一起使用的 child_process spawn - 没有可见的输出
- jquery - Laravel - 如何解决错误 404 - 在下拉列表过滤器中找不到页面
- mql5 - 我如何编写接近一半位置的代码?
- php - 无法使用 ajax 请求登录,但可以正常登录
- c - fread 声明看似无所事事