pipeline 简介
pipeline是sklearn的一个模块,主要作用是可以将特征选择、数据处理、回归或分类等多个步骤串连起来。
pipeline可以将多个estimator放在一起,按顺序运行,前一个estimator的输出是第二个estimator的输入,它对estimator有一些要求,前面的estimator必须有fit_transform函数,最后一个可以只有fit函数。
功能
- pipeline可以将多个步骤简单地连在一起,代码简洁。并且你只要对数据调用 fit和 predict 一次来适配所有的一系列评估器。
- 在需要做数据处理时,如果使用pipeline对训练集进行训练,得到的模型,对测试集进行预测时,使用的填充方案还是测试集的方案(如众数是训练集的众数,而不是测试集的众数),不会造成数据泄露。
- pipeline可以结合gridSearchCV,从而在整个过程中进行参数调优。
代码举例
简单例子
- 生成一个包含PCA和逻辑回归的pipeline。
- pipeline构造方法的输入是一系列的tuple(key,value),value是estimator)的名称,key是你对它的命名。
- 可以通过set_params设置参数值,格式为:estimator__参数=参数值。
- 可以通过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
32from 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结合调参:多个模型
- 如果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
34from 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 | from sklearn.pipeline import Pipeline |
make_pipeline的使用
1.make_pipeline是构造pipeline的简单的方式.
2.可以不写estimator的名称,默认是函数名的小写。1
2
3
4
5from sklearn.pipeline import make_pipeline
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
pipe=make_pipeline(PCA(),RandomForestClassifier())