我正在处理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";通过";并且指定了应该在没有任何修改的情况下通过的所有列。