将多个预处理步骤应用于 sklearn 管道中的列
Posted
技术标签:
【中文标题】将多个预处理步骤应用于 sklearn 管道中的列【英文标题】:Apply multiple preprocessing steps to a column in sklearn pipeline 【发布时间】:2021-04-09 17:50:39 【问题描述】:我第一次尝试使用 sklearn 管道并使用 Titanic 数据集。我想首先在Embarked
中估算缺失值,然后进行一次热编码。在Sex
属性中,我只想做一个热编码。所以,我有以下步骤,其中两个步骤用于Embarked
。但它没有按预期工作,因为Embarked
列除了它的一个热编码之外仍然存在,如输出所示(列具有“S”)。
如果我在一个步骤中对Embarked
进行插补和一个热编码,它会按预期工作。
这背后的原因是什么,或者我做错了什么?另外,我没有找到任何与此相关的信息。
categorical_cols_impute = ['Embarked']
categorical_impute = Pipeline([
("mode_impute", SimpleImputer(missing_values=np.nan, strategy='constant', fill_value='S')),
# ("one_hot", OneHotEncoder(sparse=False))
])
categorical_cols = ['Embarked', 'Sex']
categorical_one_hot = Pipeline([
("one_hot", OneHotEncoder(sparse=False))
])
preprocesor = ColumnTransformer([
("cat_impute", categorical_impute, categorical_cols_impute),
("cat_one_hot", categorical_one_hot, categorical_cols)
], remainder="passthrough")
pipe = Pipeline([
("preprocessor", preprocesor),
# ("model", RandomForestClassifier(random_state=0))
])
【问题讨论】:
【参考方案1】:ColumnTransformer
变压器是并行应用的,而不是顺序应用的。因此,在您的示例中,Embarked
最终出现在您的转换数据中两次:一次来自第一个转换器,保持其字符串类型,再次来自第二个转换器,这次是单热编码(但不是首先估算!(?)) .
因此,只需取消注释已启动管道中的第二步,并从 categorical_cols
中删除 Embarked
。
另见Consistent ColumnTransformer for intersecting lists of columns(但我不认为这是完全重复的)。
【讨论】:
感谢您提供链接。它消除了进一步的疑虑。以上是关于将多个预处理步骤应用于 sklearn 管道中的列的主要内容,如果未能解决你的问题,请参考以下文章
HttpApplication处理对象与HttpModule处理模块