将多个预处理步骤应用于 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处理模块

有没有办法在 sklearn 管道中链接 pd.cut FunctionTransformer?

如何腌制sklearn管道中的各个步骤?

使用列操作步骤创建 sklearn 管道

是否可以将多个管道组合到 Neuraxle 或 sklearn 中的单个估计器中以创建多输出分类器并一次性适应