繁体   English   中英

在 ColumnTransformer 之后指定 scikit-learn 管道中的列

[英]Specifying columns in scikit-learn pipeline after ColumnTransformer

我想构建一个 scikit-learn 管道,其中一些列具有估算值,然后随后将缩放应用于某些列。 如果我将这两个操作放在同一个列转换器中,这将不起作用,因为它们并行进行(因此缺少值会导致缩放器失败)。 但是,如果我制作两个列转换器并串联运行它们,我会遇到无法指定列名的问题(因为第一个转换器的输出是 np 数组)。 解决这个问题的正确方法是什么?

numeric_columns = list(X.select_dtypes('float64').columns)
cat_columns = list(X.select_dtypes('object').columns)+list(X.select_dtypes('int64').columns)

# Imputation
imp_mean = SimpleImputer(strategy='mean')
imp_freq = SimpleImputer(strategy='most_frequent')
imputer = ColumnTransformer(
    [('Imput_mean', imp_mean, numeric_columns),
     ('Imput_freq', imp_freq, cat_columns),
    ], remainder='passthrough'
)

# Scaling 
feature_transformer = ColumnTransformer(
    [('num',StandardScaler(),numeric_columns), 
    ], remainder='passthrough'
)

#Hyperparameters
parameters = {'model__n_components':[1,2,3,4,5]}

#Pipeline
pipeline = Pipeline([('imputer', imputer),
                     ('feature_transformer', feature_transformer),
                     ('model', PLSRegression())])

#Cross validation strategy
cv = KFold(n_splits=10, shuffle=True)

#Cross valdiate and evaluate
clf = GridSearchCV(pipeline, parameters, scoring="r2", cv=10)
cross_val_score(clf, X, y, cv=cv, scoring="r2"))

您可以嵌套一个Pipeline来处理ColumnTransformer实例中的数字列(串行执行)的预处理。

这是一个例子:

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

X = pd.DataFrame({'city': ['London', 'London', '', 'Sallisaw'],
          'title': ['His Last Bow', 'How Watson Learned the Trick', 'A Moveable Feast', 'The Grapes of Wrath'],
          'expert_rating': [5, 3, np.nan, 5],
          'user_rating': [4, np.nan, 4, 3]})

在此处输入图像描述

numeric_columns = list(X.select_dtypes('float64').columns)
cat_columns = list(X.select_dtypes('object').columns) + list(X.select_dtypes('int64').columns)

imp_mean = SimpleImputer(strategy='mean')
imp_freq = SimpleImputer(missing_values='', strategy='most_frequent')

ct = ColumnTransformer([
        ('Imput_freq', imp_freq, cat_columns),
        ('pipe_num', Pipeline([('Imput_mean', imp_mean), ('num', StandardScaler())]), numeric_columns)
    ], remainder='passthrough'
)

pd.DataFrame(ct.fit_transform(X))

在此处输入图像描述

这是一篇类似的帖子: 如何使用 sklearn 管道执行并行和串行转换? .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM