如何将Imputter设置为sklearn管道的一部分



我正在处理Titanic数据集,我希望处理管道上的所有预处理活动。所以,这是我的代码:

获取数据集

!wget "https://calmcode.io/datasets/titanic.csv"

然后阅读如下:

import numpy as np
import pandas as pd 
from sklearn.preprocessing import MinMaxScaler, OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
dt = pd.read_csv("./data/titanic.csv", index_col=["PassengerId"])

然后我设置了一个单独的管道,假设它对数值特征进行预处理:

numerical_features = ["Age", "SibSp", "Parch", "Fare"]
numerical_pipeline = Pipeline(steps=[("min_max_scaler", MinMaxScaler()),
('num_imputer',SimpleImputer(missing_values=np.nan, strategy='mean')])

然后安装管道:

column_transformer = ColumnTransformer(transformers=[
('numeric_transformer', numerical_pipeline, numerical_features),remainder='drop')
column_transformer.fit(dt)
transformed_dt = column_transformer.transform(dt)

但是,我只需要在Age特性中应用Imputer,而不需要在所有其他列中应用。目前,它将估算器应用于所有列。

我的问题是:

如何指定仅在"年龄"列上应用SimpleImputer,而不在所有numerical_pipeline中应用?

我认为您需要使用两个列转换器,所以如果您以这种方式设置minmax:

minmax = ColumnTransformer([(
"minmax",
MinMaxScaler(),
["age", "sibsp", "parch", "fare"])
],remainder='drop')

输出没有列名,但根据我们输入的列名,年龄将是第一位的,因此:

imp = ColumnTransformer([(
"impute",
SimpleImputer(missing_values=np.nan, strategy='mean'),
[0])
],remainder='passthrough')

然后进入管道:

Pipeline([("scale",minmax),("impute",imp)]).fit_transform(dt)

正如您在评论中所说,您希望首先估算,然后进行缩放。在这种情况下,我将首先创建一个列转换器,它只估算一列,通过其他三个数字列,并删除不属于该集合的列。之后,在该列转换器的输出上添加一个MinMaxScaler。代码内

ct = ColumnTransformer(
[
("num_imputer", SimpleImputer(missing_values=np.nan, strategy="mean"), ["Age"]),
("needed_columns", "passthrough", ["SibSp", "Parch", "Fare"]),
],
)
pipeline = Pipeline(steps=[("transform", ct), ("scale", MinMaxScaler())])

这里重要的一点是,您将第二个条目添加到transformer列表中,该条目具有单词"transformer";通过";并且指定了应该在没有任何修改的情况下通过的所有列。

最新更新