我正面临一个我不知道如何解决的问题,但由于我是个初学者,可能有一个简单的解决方案我找不到。
我正在处理泰坦尼克数据集,我想使用管道(以避免使用交叉验证的数据泄漏)。因此,我使用两个管道(一个用于数字,一个用于分类)+ FeatureUnion()。
有什么问题吗?在数值管道中,我填充年龄的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时,输出将是一个没有列名的数组,如果我们想使用特性选择,这将很难处理。这就是为什么我选择管道而不是ColumnTransformer。
谈到在进入管道之前创建桶的选项,我不能这样做,因为它是基于我正在处理的缺少值的变量创建的。
在这种情况下,最好的选择是什么?
发布于 2020-04-14 10:13:19
之前创建特性
如果您想要基于一个数值变量创建一个分类变量,然后在cat_pipeline
中处理它,则需要在列转换器之前创建它。
实现一个变压器(称为“水桶”?)这将接受p变量并将其转换为p+1 (如果您想要添加分类表示并保留初始的数值特性)。这个变压器是你管子的第一步。
然后,创建一个ColumnTransformer (我认为它更适合您的情况,但没有足够的细节来确定。我建议你肯定是阅读这篇文章 )。第二个转换是管道中的第二个步骤。
每个分支都根据其应该输出的内容提供信息,因为特性创建(斗式)是在列转换器之前完成的。
中创建特性
否则,您可以创建两个主要路径:
。
希望这能有所帮助
https://datascience.stackexchange.com/questions/72286
复制相似问题