【问题标题】:Apply multiple preprocessing steps to a column in sklearn pipeline将多个预处理步骤应用于 sklearn 管道中的列
【发布时间】: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))
])

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    ColumnTransformer 变压器是并行应用的,而不是顺序应用的。因此,在您的示例中,Embarked 最终出现在您的转换数据中两次:一次来自第一个转换器,保持其字符串类型,再次来自第二个转换器,这次是单热编码(但不是首先估算!(?)) .

    因此,只需取消注释已启动管道中的第二步,并从 categorical_cols 中删除 Embarked

    另见Consistent ColumnTransformer for intersecting lists of columns(但我不认为这是完全重复的)。

    【讨论】:

    • 感谢您提供链接。它消除了进一步的疑虑。
    猜你喜欢
    • 2021-07-15
    • 2021-11-10
    • 2016-07-15
    • 2020-04-09
    • 2020-11-30
    • 2020-06-02
    • 2021-12-18
    • 2013-10-16
    • 1970-01-01
    相关资源
    最近更新 更多