《Python机器学习基础教程》笔记
大多数机器学习应用不仅需要应用单个算法,而且还需要将许多不同的处理步骤和机器学习模型链接在一起,例如对数据进行缩放,然后手动合并特征,再利用无监督学习来学习特征。为了简化构建变换和模型链的过程,Scikit-Learn提供了pipeline类,可以将多个处理步骤合并为单个Scikit-Learn估计器。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)。
三、用make_pipeline创建管道
用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。