Python 对sklearn管道中的列应用多个预处理步骤

Python 对sklearn管道中的列应用多个预处理步骤,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我第一次尝试sklearn管道,并使用泰坦尼克号数据集。我想首先在中输入缺少的值,然后进行一次热编码。在Sex属性中,我只想做一个热编码。因此,我有以下两个步骤,其中两个步骤用于。但是它没有像预期的那样工作,因为除了输出中显示的一个热编码(列中有“S”)之外,列仍然存在 如果我在一个步骤中对进行插补和一次热编码,它将按预期工作 这背后的原因是什么?或者我做错了什么?另外,我没有找到任何与此相关的信息 categorical_cols_impute = ['Embarked'] categoric

我第一次尝试sklearn管道,并使用泰坦尼克号数据集。我想首先在
中输入缺少的值,然后进行一次热编码。在
Sex
属性中,我只想做一个热编码。因此,我有以下两个步骤,其中两个步骤用于
。但是它没有像预期的那样工作,因为除了输出中显示的一个热编码(列中有“S”)之外,
列仍然存在

如果我在一个步骤中对
进行插补和一次热编码
,它将按预期工作

这背后的原因是什么?或者我做错了什么?另外,我没有找到任何与此相关的信息

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))
])

列变压器
变压器是并行应用的,而不是顺序应用的。因此,在您的示例中,
在转换后的数据中出现两次:一次来自第一个变换器,保留其字符串类型,另一次来自第二个变换器,这次是一个热编码的(但不是先插补的!(?)

因此,只需取消对已装载管道中的第二步的注释,并从
category\u cols
中删除
已装载的


另请参见(但我不认为它是完全重复的)。

感谢您提供此链接。它消除了进一步的疑虑。