大多数机器学习应用不仅需要应用单个算法,而且还需要将许多不同的处理步骤和机器学习模型链接在一起,例如对数据进行缩放,然后手动合并特征,再利用无监督学习来学习特征。为了简化构建变换和模型链的过程,Scikit-Learn提供了pipeline类,可以将多个处理步骤合并为单个Scikit-Learn估计器。pipeline类本身具有fit、predict和score方法,其行为与Scikit-Learn中的其他模型相同。
1. 使用Pipeline类来表示在使用MinMaxScaler缩放数据之后再训练一个SVM的工作流程
这里 ,我们构建了一个由步骤列表组成的管道对象,每个步骤都是一个元组,包含一个名称(自定义)和一个估计器的实例。首先对第一个步骤(缩放器)调用fit,然后使用该缩放器对训练数据进行变换,最后利用缩放后的数据来拟合SVM。利用管道,我们减少了“预处理+分类”过程所需要的代码量,而且,使用管道的主要优点在于,我们可以在cross_val_score或GridSearchCV中使用这个估计器。
from sklearn.pipeline import Pipeline
pipe = Pipeline([("scaler",MinMaxScaler()),("svm",SVC())])
# Pipeline([("xxx",yyy()),("aaa",bbb())])
pipe.fit(X_train,y_train)
pipe.score(X_test,y_test)
2. 在网格搜索中使用管道
我们需要为每个参数(C和gamma)指定它在管道中所属的步骤。为管道定义参数网格的语法是为每个参数指定步骤名称,后面加上__(双下划线),然后是参数名称(svm__C和svm_gamma)。
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.fit(X_train,y_train)
print("Test set score:{:.2f}".format(grid.score(X_test,y_test)))
3. 用make_pipeline创建管道
用Pipeline类构建管道时语法有点麻烦,我们通常不需要为每一个步骤提供用户指定的名称,这种情况下,就可以用make_pipeline函数创建管道,它可以为我们创建管道并根据每个步骤所属的类为其自动命名。
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(MinMaxScaler(),SVC())
一般来说,自动命名的步骤名称是类名称的小写
版本,如果多个步骤属于同一个类,则会附加一个数字。
网友评论