scikit-learn中的pipeline使用和解释(详细且易于理解,附使用代码)
为何引入
英文意思为管道,它的功能也正如它的英文意思。
它是将许多操作(为了准确下文中把操作用estimator替代,通俗你可以将其理解为是一种操作)封装融合在一起,然后按顺序执行,比如对数据分类之前可能会进行降维等预处理。正因如此,pipeline中除了最后一个estimator,其余所有estimator必须是transformer(也就是对数据的转换,这种类都有transform函数,如常见的降维方法)。最后一个estimator可以是任意类型,比如classifier(分类器),当然也可以是transformer。
它经常用于参数选择(grid search over parameters),也就是与GridSearchCV一起使用。
用法
1.构造一个pipeline
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC #导入svm分类器
from sklearn.decomposition import PCA #导入PCA降维器
pipe = Pipeline( [('reduce_dim', PCA()), ('clf', SVC())])
如上,它的构造函数的参数是一个list,list中的每个元素是一个元组,每一个元组代表一个操作,它是由两个元素构成,第一个是一个字符串(这就是你为这步操作起的名字,可以随便起),第二个即是对应的 estimator。例如上面的代码就是先搞了一个PCA降维器,再搞了一个分类器。
也可以用如下方法
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(PCA(), SVC())
这样的话你不用起名了,系统会自动为每步操作起名,但这个名字你最好知道。
2.访问每步操作
就拿上面的例子来说,建立了一个pipe。我想访问它的第一个estimator,可以用下面的方法
pipe.steps[0]
上述会返回一个元组,就是构造时所使用的那个元组(名字+estimator)
而下述则不会返回名字,只会返回estimator
pipe[0] 或 pipe['reduce_dim'] (以数字索引或者你命名的操作名字来访问)
甚至可以用类似列表切片的方式来返回一个(子)pipeline,如下
pipe[:1]
pipe[-1:]
3.每步操作(estimator)的参数
我们知道,每个estimator都有参数的,比如PCA()括号中间就有很多参数,我没写其实都是使用的默认参数。
为了和GridSearchCV一起使用,了解这一部分是很必要的。
比如SVC()这个estimator有一个参数C,这个C是对错误分类的惩罚系数。如果把pipe中的这个estimator即SVC()的参数C改为,可以
pipe.set_params(clf__C=10)
注意:这个clf就是这个estimator的名字,名字和参数名中间是两个“”。(犹记得初学python时类的构造函数是__init__,当时打了一个,找了半天都不知道错在哪)
举一个它和GridSearchCV一起使用的例子:
from sklearn.model_selection import GridSearchCV
param_grid = dict(reduce_dim__n_components=[2, 5, 10],clf__C=[0.1, 10, 100]) #一个字典
grid_search = GridSearchCV(pipe, param_grid=param_grid)
这个参数可以是estimator本身,比如:
如果想用多个分类器来分类,而不是只用SVC()分类去调节SVC的参数,可以这样做
(我用了两个分类器,一个是SVC一个是logistic分类器,下面的PCA(5)和PCA(10)是两个类型相同但参数不同的estimator)
param_grid = dict(reduce_dim=['passthrough', PCA(5), PCA(10)],
clf=[SVC(), LogisticRegression()],
clf__C=[0.1, 10, 100])
grid_search = GridSearchCV(pipe, param_grid=param_grid)
注意:上面的passthrough表示的是把这步忽略掉,也就是不做第一步操作直接做分类的操作,因为某些情况下在PCA后分类效果可能更差(注意不能passthrough掉最后一步操作)
4.注意
pipeline具有该管道最后一个estimator具有的所有方法,即如果最后一个estimator是分类器,则Pipeline可以将其用作分类器。如果最后一个estimator是transformer,那么管道也是如此。