【问题标题】:OneHotEncoder doesn't remove categorical in pipeline [duplicate]OneHotEncoder 不会删除管道中的分类 [重复]
【发布时间】:2022-01-23 09:03:03
【问题描述】:

我有一个实验室处理预处理数据。我尝试将 ColumnTransformer 与管道语法一起使用。我在下面有一些代码。

preprocess = ColumnTransformer(
                    [('imp_mean', SimpleImputer(strategy='mean'), numerics_cols),
                     ('imp_mode', SimpleImputer(strategy='most_frequent'), categorical_cols),
                     ('onehot', OneHotEncoder(handle_unknown='ignore'), categorical_cols),
                     #('stander', StandardScaler(), fewer_cols_train_X_df.columns)
                    ])

在我运行这段代码并调用管道后,结果是。

       ['female', 1.0, 0.0, 0.0],
       ['male', 0.0, 1.0, 0.0],
       ['female', 1.0, 0.0, 0.0],
       ['male', 0.0, 1.0, 0.0],
       ['male', 0.0, 1.0, 0.0],
       ['male', 0.0, 1.0, 0.0],
       ['male', 0.0, 1.0, 0.0],
       ['female', 1.0, 0.0, 0.0],
       ['male', 0.0, 1.0, 0.0],
       ['male', 0.0, 1.0, 0.0],
       ['male', 0.0, 1.0, 0.0],
       ['male', 0.0, 1.0, 0.0],
       ['male', 0.0, 1.0, 0.0],
       ['female', 1.0, 0.0, 0.0],
       ['female', 1.0, 0.0, 0.0],
       ['male', 0.0, 1.0, 0.0],

您可以在结果中看到分类。我试着放下它,但它还在这里。 所以我只想在这个结果中删除分类来运行 StandardScaler。我不明白为什么它不起作用。 感谢您的阅读。

【问题讨论】:

标签: machine-learning scikit-learn one-hot-encoding


【解决方案1】:

使用ColumnTransformer,您无法在不同的列上执行顺序信息。该对象将执行为给定列定义的第一个操作,然后将其标记为预处理。

因此,在您的示例中,分类列只会被估算,但不会被 One-hot 编码。

要执行此操作(对列进行插补和 One-hot 编码,您应该将这些预处理放在 Pipeline 上以按顺序执行它们。

下面的示例说明了如何处理数值和分类特征的不同处理。

from sklearn.compose import ColumnTransformer, make_column_selector
from sklearn.pipeline import Pipeline
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder, StandardScaler

X = pd.DataFrame({'gender' : ['male', 'male', 'female'],
                 'A' : [1, 10 , 20],
                 'B' : [1, 150 , 20]})

categorical_preprocessing = Pipeline(
[
    ('imp_mode', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore')),
])

numerical_preprocessing = Pipeline([
    ('imputer', SimpleImputer(strategy='mean')),
    ('scaler', StandardScaler()),
])

preprocessing = ColumnTransformer(
                    [
                        ('catecorical', categorical_preprocessing,
                         make_column_selector(dtype_include=object)),
                        ('numerical', numerical_preprocessing,
                         make_column_selector(dtype_include=np.number)),
                    ])

preprocessing.fit_transform(X)

输出:

array([[ 0.        ,  1.        , -1.20270298, -0.84570663],
       [ 0.        ,  1.        , -0.04295368,  1.40447708],
       [ 1.        ,  0.        ,  1.24565666, -0.55877045]])

【讨论】:

  • 谢谢!它为我工作。嗯,如何在管道之前制作 ColumnTransformer?有可能吗?
  • 嗯,它只是在管道之前创建的ColumnTransformer 的定义。然后将其作为一个步骤添加。
猜你喜欢
  • 2022-01-27
  • 2020-04-19
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
相关资源
最近更新 更多