我面临一个我不知道如何解决的问题,但由于我是初学者,可能有一个我找不到的简单解决方案。
我正在使用 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 的原因。
谈到在进入管道之前创建存储桶的选项,我不能,因为它是基于我正在处理缺失值的变量创建的。
在这种情况下,最好的选择是什么?