sklearn管道 - 如何在不同的列上应用不同的转换

时间:2016-08-17 16:34:04

标签: python scikit-learn pipeline

我对sklearn中的管道很新,我遇到了这个问题:我有一个混合了文本和数字的数据集,即某些列只有文本而rest有整数(或浮点数)。

我想知道是否可以构建一个管道,例如我可以在文本功能上调用LabelEncoder(),在数字列上调用MinMaxScaler()。我在网上看到的示例主要指向在整个数据集上使用LabelEncoder()而不是在选择列上使用{{1}}。这可能吗?如果有的话,任何指针都会非常感激。

3 个答案:

答案 0 :(得分:21)

我通常采用FeatureUnion方式,使用FunctionTransformer来提取相关列。

重要说明:

  • 您必须使用def定义您的功能,因为如果您想挑选模型,您不能在FunctionTransformer中使用lambdapartial

    < / LI>
  • 您需要使用FunctionTransformer

  • 初始化validate=False

这样的事情:

from sklearn.pipeline import make_union, make_pipeline
from sklearn.preprocessing import FunctionTransformer

def get_text_cols(df):
    return df[['name', 'fruit']]

def get_num_cols(df):
    return df[['height','age']]

vec = make_union(*[
    make_pipeline(FunctionTransformer(get_text_cols, validate=False), LabelEncoder()))),
    make_pipeline(FunctionTransformer(get_num_cols, validate=False), MinMaxScaler())))
])

答案 1 :(得分:6)

从v0.20开始,您可以使用ColumnTransformer来完成此操作。

答案 2 :(得分:0)

ColumnTransformer 的示例可能对您有所帮助:

# FOREGOING TRANSFORMATIONS ON 'data' ...
# filter data
data = data[data['county'].isin(COUNTIES_OF_INTEREST)]

# define the feature encoding of the data
impute_and_one_hot_encode = Pipeline([
        ('impute', SimpleImputer(strategy='most_frequent')),
        ('encode', OneHotEncoder(sparse=False, handle_unknown='ignore'))
    ])

featurisation = ColumnTransformer(transformers=[
    ("impute_and_one_hot_encode", impute_and_one_hot_encode, ['smoker', 'county', 'race']),
    ('word2vec', MyW2VTransformer(min_count=2), ['last_name']),
    ('numeric', StandardScaler(), ['num_children', 'income'])
])

# define the training pipeline for the model
neural_net = KerasClassifier(build_fn=create_model, epochs=10, batch_size=1, verbose=0, input_dim=109)
pipeline = Pipeline([
    ('features', featurisation),
    ('learner', neural_net)])

# train-test split
train_data, test_data = train_test_split(data, random_state=0)
# model training
model = pipeline.fit(train_data, train_data['label'])

您可以在以下位置找到完整代码:https://github.com/stefan-grafberger/mlinspect/blob/19ca0d6ae8672249891835190c9e2d9d3c14f28f/example_pipelines/healthcare/healthcare.py