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,那么管道也是如此。

5.避免重复计算的缓存机制

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值