sklearn中的FeatureUnion()和ColumnTransformer()有什么区别?
如果我要构建包含混合数据类型(分类,数字,非结构化文本)的功能的监督模型,而我需要结合使用单独的管道,应该使用哪个模型?
来源:https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.FeatureUnion.html
来源:https://scikit-learn.org/stable/modules/generated/sklearn.compose.ColumnTransformer.html
答案 0 :(得分:1)
根据sklearn文档:
FeatureUnion:连接多个转换器对象的结果。此估算器将变形器对象列表与输入数据并行应用,然后合并结果。将多个特征提取机制组合到单个转换器中很有用。
ColumnTransformer:将转换器应用于数组或熊猫DataFrame的列。该估计器允许分别转换输入的不同列或列子集,并且将每个转换器生成的特征连接起来以形成单个特征空间。这对于异构数据或列状数据很有用,可以将多种特征提取机制或变换组合到单个转换器中。
因此,FeatureUnion将不同的转换器应用于整个输入数据,然后通过连接它们来组合结果。
另一方面,ColumnTransformer将不同的转换器应用于整个输入数据的不同子集,然后再次将结果串联起来。
对于您建议的情况,ColumnTransformer应该是第一步。然后,将所有列都转换为数值后,借助FeatureUnion,您可以通过将PCA和SelectKBest结合起来来进一步转换它们
最后,您当然可以将FeatureUnion用作ColumnTransformer,但您必须在每个分支中都包含一个列/类型选择器,而不是仅将感兴趣的列向下馈入管道中的下一个转换器。 :https://ramhiser.com/post/2018-04-16-building-scikit-learn-pipeline-with-pandas-dataframe/
但是,ColumnTransformer正是通过更简单的方式做到了这一点。
答案 1 :(得分:0)
这两种方法都用于将独立的转换(变压器)组合成一个转换器,通过独立的我的意思是不需要以定义的顺序执行的转换(变压器)。这是因为与常规管道不同,一个变压器未应用于另一变压器的输出。
主要区别在于:特征并集对象中的每个转换器都将整个数据作为输入。在列转换器对象中时,它们仅获取部分数据作为输入。两者最终将每个转换器的结果连接在一起。两者都可以使用并行处理。