管道异构数据

数据挖掘 Python 管道
2022-02-27 12:10:53

我面临一个我不知道如何解决的问题,但由于我是初学者,可能有一个我找不到的简单解决方案。

我正在使用 Titanic 数据集,我想使用管道(为了避免使用交叉验证的数据泄漏)。出于这个原因,我使用了两条管道(一条用于数值,一条用于分类)+ FeatureUnion()。

有什么问题?在数值管道中,我填充了 Age 的 NaN 值,然后为该变量创建了一些存储桶。该管道的结果将是一个包含所有数字特征 + 1 个分类变量的数据框。对于分类变量的编码,我对分类变量使用管道,然后使用 FeatureUnion 连接两个数据集。但问题是我在数值管道中创建的新变量没有进入分类管道,导致数据帧带有一个未编码的分类变量。我该如何解决这个问题?

代码:

num_pipeline = Pipeline(steps = [
('selector', DataFrameSelector(numerical_features)),
('imputer', df_imputer(strategy="median")), #Numerical
('new_variables', df_new_variables()) #Numerical
])

cat_pipeline = Pipeline(steps = [
('selector', DataFrameSelector(categorical_features)),
('label_encoder', MultiColumnLabelEncoder()) #Categorical
])

full_pipeline = FeatureUnion(transformer_list=[
("num_pipeline", num_pipeline),
("cat_pipeline", cat_pipeline)
]) 

感谢您的时间

最好的祝福

编辑:

我正在考虑使用 ColumnTransformer,因为我认为它更适合我的示例,因为我必须为不同的列应用不同的转换,但问题是当使用 ColumnTransformer 时,输出将是一个没有列名的数组,我认为如果我们想使用特征选择,将很难处理。这就是我选择 Pipelines 而不是 ColumnTransformer 的原因。

谈到在进入管道之前创建存储桶的选项,我不能,因为它是基于我正在处理缺失值的变量创建的。

在这种情况下,最好的选择是什么?

1个回答

方法 1:在转换之前创建特征

如果要基于数值变量创建分类变量,然后将其处理,则cat_pipeline需要在列转换器之前创建它。

实现一个转换器(称为“bucketer”?),它接受 p 个变量并将其转换为 p+1(如果要添加分类表示并保留初始数值特征)。这个变压器是你管道的第一步。

然后,创建一个 ColumnTransformer (我认为它更适合你的情况,但没有足够的细节来确定。我建议你阅读这个来确定)。第二次转换是管道中的第二步。

每个分支都根据它应该输出的内容进行馈送,因为特征创建(分桶)是在列转换器之前完成的。

管道1

方法 2:在转换中创建特征

否则,您可以创建两个主要路径:

  • 无论输入类型如何,一个分支将只输出分类特征。
  • 另一个将只输出数字特征,无论输入类型如何。

管道2

您可能想在某些分支中重新使用您的功能选择器,我只是想说明两种可能的方法

希望这可以帮助