sklearn ColumnTransformer:变压器中的重复列
Posted
技术标签:
【中文标题】sklearn ColumnTransformer:变压器中的重复列【英文标题】:sklearn ColumnTransformer: Duplicate columns in transformers 【发布时间】:2020-12-08 01:21:38 【问题描述】:我正在寻求使用 sklearn 的 ColumnTransformer 函数构建数据预处理管道的帮助。
目前我的管道看起来像这样:
from scipy.stats.mstats import winsorize
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
ColumnTransformer(remainder='passthrough',
transformers=[
('Winsorize', FunctionTransformer(winsorize,
kw_args='axis': 0, 'inplace': False, 'limits': [0, 0.01]), ['feat_1','feat_2']),
('num_impute', SimpleImputer(strategy='median'), ['feat_3', 'feat_4']),
])
请注意,每个转换器都提供了一组独特的功能。
我遇到的问题是如何对相同的特征应用堆叠分析。例如,
ColumnTransformer(remainder='passthrough',
transformers=[
('Winsorize', FunctionTransformer(winsorize,
kw_args='axis': 0, 'inplace': False, 'limits': [0, 0.01]), ['feat_1','feat_2']),
('num_impute', SimpleImputer(strategy='median'), ['feat_1', 'feat_2', 'feat_3']),
])
请注意,两个转换器都提供了 feat_1 和 feat_2。
这样的管道将为 feat_1 和 feat_2 创建重复的列(基于 Winsorize 的两列,基于 num_impute 的两列)
【问题讨论】:
【参考方案1】:据我了解,您可以使用两个ColumnTransformer
和一个FeatureUnion
来实现您想要的。一个ColumnTransformer
将具有remainder='passthrough'
以保留除正在转换的列之外的所有列,而另一个将具有remainder='drop'
。可能看起来像这样:
from sklearn.pipeline import FeatureUnion
ct1 = ColumnTransformer(
remainder='passthrough',
transformers=[(
'Winsorize', FunctionTransformer(
winsorize,
kw_args='axis': 0, 'inplace': False, 'limits': [0, 0.01]
),
['feat_1', 'feat_2']
)]
)
ct2 = ColumnTransformer(
remainder='drop',
transformers=[('num_impute', SimpleImputer(strategy='median'), ['feat_1', 'feat_2', 'feat_3'])],
)
union = FeatureUnion([('ct1', ct1), ('ct2', ct2)])
【讨论】:
per sklearn doc:“FeatureUnion 获取一个转换器对象列表。在拟合期间,每个对象都独立地拟合数据。转换器并行应用,它们输出的特征矩阵被连接起来并排成一个更大的矩阵”看起来这将连接转换而不是应用在一个系列中 哦,好的,您想在winsorize
步骤之后进行估算?
你是对的。【参考方案2】:
如果您需要对列应用多个转换,您可以使用Pipeline
作为每个列集的转换器。
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
imputer = SimpleImputer(strategy="median")
winsorize = FunctionTransformer(
winsorize, kw_args="axis": 0, "inplace": False, "limits": [0, 0.01])
ColumnTransformer([
("F1,F2", Pipeline([
("Winsorize", winsorize),
("Impute", imputer)
]), ["feat_1","feat_2"]),
("F3", imputer, ["feat_3"])
], remainder="passthrough")
【讨论】:
以上是关于sklearn ColumnTransformer:变压器中的重复列的主要内容,如果未能解决你的问题,请参考以下文章
sklearn ColumnTransformer:变压器中的重复列
sklearn OneHotEncoder 与 ColumnTransformer 导致稀疏矩阵代替创建假人
sklearn Pipeline:“ColumnTransformer”类型的参数不可迭代
sklearn.compose.ColumnTransformer:fit_transform() 接受 2 个位置参数,但给出了 3 个
Sklearn ColumnTransformer + Pipeline = TypeError
将 FunctionTransformer 与 sklearn Pipeline 和 ColumnTransformer 一起使用 - 错误:无效的类型提升