构建管道sklearn.pipeline

pipeline类本身具有fit、predict和score方法,其行为与Scikit-Learn中的其他模型相同。

 

例:使用Pipeline类来表示在使用MinMaxScaler缩放数据之后再训练一个SVM的工作流程

from sklearn.pipeline import Pipeline
pipe = Pipeline([("scaler",MinMaxScaler()),("svm",SVC())])
pip.fit(X_train,y_train)
pip.score(X_test,y_test)

这里 ,我们构建了一个由步骤列表组成的管道对象,每个步骤都是一个元组,包含一个名称(自定义)和一个估计器的实例。

首先对第一个步骤(缩放器)调用fit,然后使用该缩放器对训练数据进行变换,最后利用缩放后的数据来拟合SVM。利用管道,我们减少了“预处理+分类”过程所需要的代码量,而且,使用管道的主要优点在于,我们可以在cross_val_score或GridSearchCV中使用这个估计器。

 

例:在网格搜索中使用管道

param_grid = {'svm__C':[0.001,0.01,0.1,1,10,100],'svm__gamma':[0.001,0.01,0.1,1,10,100]}
grid = GridSearchCV(pipe,param_grid=param_grid,cv=5)
grid_search.fit(X_train,y_train)
print("Test set score:{:.2f}".format(grid_search.score(X_test,y_test))) 

我们需要为每个参数(C和gamma)指定它在管道中所属的步骤。为管道定义参数网格的语法是为每个参数指定步骤名称,后面加上__(双下划线),然后是参数名称(svm__C和svm_gamma)

 

例:用Pipeline类构建管道时语法有点麻烦,我们通常不需要为每一个步骤提供用户指定的名称,这种情况下,就可以用make_pipeline函数创建管道,它可以为我们创建管道并根据每个步骤所属的类为其自动命名。一般来说,自动命名的步骤名称是类名称的小写版本,如果多个步骤属于同一个类,则会附加一个数字。

from sklearn.pipeline import make_pipeline
pipe = make_pipeline(MinMaxScaler(),SVC())

 

①pipeline.steps是由元组组成的列表,pipeline.steps[0][1]是第一个估计器,pipeline.steps[1][1]是第二个估计器。

②要想访问管道中的步骤,最简单的方法是通过named_steps属性,它是一个字典,将步骤名称映射为估计器。

③GridSearchCV找到的最佳模型保存在grid.best_estimator_中。

④如果想跳过管道中的某个步骤,则可以将该步骤设置为None。

参考:

posted @ 2020-03-04 16:09  熊猫blue  阅读(608)  评论(0编辑  收藏  举报