pipeline学习笔记

pipeline 简介

  pipeline是sklearn的一个模块,主要作用是可以将特征选择、数据处理、回归或分类等多个步骤串连起来。
  pipeline可以将多个estimator放在一起,按顺序运行,前一个estimator的输出是第二个estimator的输入,它对estimator有一些要求,前面的estimator必须有fit_transform函数,最后一个可以只有fit函数。

功能

  1. pipeline可以将多个步骤简单地连在一起,代码简洁。并且你只要对数据调用 fit和 predict 一次来适配所有的一系列评估器。
  2. 在需要做数据处理时,如果使用pipeline对训练集进行训练,得到的模型,对测试集进行预测时,使用的填充方案还是测试集的方案(如众数是训练集的众数,而不是测试集的众数),不会造成数据泄露。
  3. pipeline可以结合gridSearchCV,从而在整个过程中进行参数调优。

    代码举例

    简单例子

  4. 生成一个包含PCA和逻辑回归的pipeline。
  5. pipeline构造方法的输入是一系列的tuple(key,value),value是estimator)的名称,key是你对它的命名。
  6. 可以通过set_params设置参数值,格式为:estimator__参数=参数值。
  7. 可以通过get_params()函数,获取pipeline的estimators和对应的参数。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    from sklearn.pipeline import Pipeline
    from sklearn.decomposition import PCA
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import roc_auc_score
    import pandas as pd

    # 读取数据
    data=pd.read_csv("/data/creditcard.csv")

    # 将数据分为训练集和测试集
    y=data['Class']
    x=data.drop('Class',axis=1)
    train_x,test_x,train_y,test_y=train_test_split(x,y)

    # 构建pipeline
    ## 1.构建一个字典。
    ## 2.使用构造方法,输入为第一步的字典,则会按照字典里的顺序从左到右构造一个pipeline。
    estimators=[('reduce_dim',PCA()),('clf',RandomForestClassifier())]
    ## 如果不更改参数,下面的代码可以注释掉。
    pipe.set_params(clf__max_depth=3)
    ## 不是必须
    print(pipe.get_params())
    pipe=Pipeline(estimators)

    # 模型训练
    model=pipe.fit(train_x,train_y)

    # 模型预测
    predict_y=model.predict(test_x)
    auc=roc_auc_score(test_y,predict_y)
    print("auc:"+str(auc))

与gridSearchCV结合调参:多个模型

  1. 如果clf中的两个模型都有某个共同的参数,下边也可以加入参数的列表进行调参,但是如果只有某个模型中有,则加入时会报错。如max_depth只有随机森林有,逻辑回归没有,则不能在列表中加入“clf__max_depth=[3, 5, 8]”,当然可以通过添加不同参数的随机森林,修改clf列表来实现相同的效果。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    from sklearn.pipeline import Pipeline
    from sklearn.decomposition import PCA
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import roc_auc_score
    import pandas as pd
    from sklearn.linear_model.logistic import LogisticRegression
    from sklearn.model_selection import GridSearchCV

    # 读取数据
    data=pd.read_csv("/data/creditcard.csv")

    # 将数据分为训练集和测试集
    y=data['Class']
    x=data.drop('Class',axis=1)
    train_x,test_x,train_y,test_y=train_test_split(x,y)

    # 构建pipeline

    estimators=[('reduce_dim',PCA()),('clf',RandomForestClassifier())]

    # 结合gridSearch 进行调参
    ## 如果clf中的两个模型都有某个共同的参数,下边也可以加入参数的列表,但是如果只有某个模型中有,则加入时会报错。
    params=dict(reduce_dim=[None,PCA(5),PCA(10)],clf=[LogisticRegression(),RandomForestClassifier()])
    grid=GridSearchCV(pipe,param_grid=params)

    # 模型训练
    model=grid.fit(train_x,train_y)
    print(model.best_estimator_)

    # 模型预测
    predict_y=model.predict(test_x)
    auc=roc_auc_score(test_y,predict_y)
    print("auc:"+str(auc))

与gridSearchCV结合调参:同个模型的不同参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from sklearn.pipeline import Pipeline
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
import pandas as pd
from sklearn.model_selection import GridSearchCV

# 读取数据
data=pd.read_csv("/data/creditcard.csv")

# 将数据分为训练集和测试集
y=data['Class']
x=data.drop('Class',axis=1)
train_x,test_x,train_y,test_y=train_test_split(x,y)

# 构建pipeline

estimators=[('reduce_dim',PCA()),('clf',RandomForestClassifier())]

# 结合gridSearch 进行调参
param_grid = dict(reduce_dim__n_components=[2, 5, 10],
clf__max_depth=[3, 5, 8])
grid=GridSearchCV(pipe,param_grid=params)

# 模型训练
model=grid.fit(train_x,train_y)
print(model.best_estimator_)

# 模型预测
predict_y=model.predict(test_x)
auc=roc_auc_score(test_y,predict_y)
print("auc:"+str(auc))

make_pipeline的使用

1.make_pipeline是构造pipeline的简单的方式.
2.可以不写estimator的名称,默认是函数名的小写。

1
2
3
4
5
from sklearn.pipeline import make_pipeline
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier

pipe=make_pipeline(PCA(),RandomForestClassifier())

相关文章

参考

5.1. Pipeline(管道)和 FeatureUnion(特征联合): 合并的评估器