Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sklearn pipeline-如何在不同的列上应用不同的转换_Python_Scikit Learn_Pipeline - Fatal编程技术网

Python sklearn pipeline-如何在不同的列上应用不同的转换

Python sklearn pipeline-如何在不同的列上应用不同的转换,python,scikit-learn,pipeline,Python,Scikit Learn,Pipeline,我对sklearn中的管道非常陌生,我遇到了这个问题:我有一个混合了文本和数字的数据集,即某些列只有文本,其余列有整数(或浮点数) 我想知道是否有可能构建一个管道,例如在文本功能上调用LabelEncoder(),在数字列上调用MinMaxScaler()。我在web上看到的示例大多指向在整个数据集上使用LabelEncoder(),而不是在选择列上。这可能吗?如果是这样的话,我将非常感谢任何指针。我通常使用FeatureUnion,使用FunctionTransformer拉出相关列 重要提示

我对sklearn中的管道非常陌生,我遇到了这个问题:我有一个混合了文本和数字的数据集,即某些列只有文本,其余列有整数(或浮点数)


我想知道是否有可能构建一个管道,例如在文本功能上调用
LabelEncoder()
,在数字列上调用
MinMaxScaler()
。我在web上看到的示例大多指向在整个数据集上使用
LabelEncoder()
,而不是在选择列上。这可能吗?如果是这样的话,我将非常感谢任何指针。

我通常使用
FeatureUnion
,使用
FunctionTransformer
拉出相关列

重要提示:

  • 你必须用
    def
    定义你的函数,因为如果你想修改你的模型,你不能在FunctionTransformer中使用
    lambda
    partial

  • 您需要使用
    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())))
])

我通常的做法是使用
FeatureUnion
,使用
FunctionTransformer
拉出相关列

重要提示:

  • 你必须用
    def
    定义你的函数,因为如果你想修改你的模型,你不能在FunctionTransformer中使用
    lambda
    partial

  • 您需要使用
    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())))
])
从v0.20开始,您可以使用来完成此操作。

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

的示例可能会帮助您:

# 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'])
您可以在下面找到完整的代码:

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

# 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'])

您可以在下面找到完整的代码:

知道我为什么会得到“TypeError:所有估计器都应该实现拟合和变换”吗?如果我运行您的代码?scikit learn 0.19.1Nevermind,签名已明显更改-我已提交了一份编辑我们如何处理,如果还有一个功能不需要与上述功能一起进行任何缩放?知道我为什么会得到“TypeError:所有估计器都应该实现拟合和变换”吗?如果我运行您的代码?scikit learn 0.19.1Nevermind,签名已明显更改-我已提交了一份编辑我们如何处理,如果还有一项功能不需要与上述功能一起进行任何缩放?您能提供一个示例吗?您能提供一个示例吗?