1、通用的管道接口 Pipeline 类不但可用于预处理和分类,实际上还可以将任意数量的估计器连接在一起。 例如,你可以构建一个包含特征提取、特征选择、缩放和分类的管道,总共有
Pipeline 类不但可用于预处理和分类,实际上还可以将任意数量的估计器连接在一起。
- 例如,你可以构建一个包含特征提取、特征选择、缩放和分类的管道,总共有 4 个步骤。同样,最后一步可以用回归或聚类代替分类。
对于管道中估计器的唯一要求就是,除了最后一步之外的所有步骤都需要具有 transform 方法,这样它们可以生成新的数据表示,以供下一个步骤使用。
在调用 Pipeline.fit 的过程中,管道内部依次对每个步骤调用 fit 和 transform,其输入是前一个步骤中 transform 方法的输出。对于管道中的最后一步,则仅调用 fit。
#pipeline.steps 是由元组组成的列表, 所以 pipeline.steps[0][1] 是第一个估计器,pipeline.steps[1][1] 是第二个估计器。
from sklearn.pipeline import Pipeline
def fit(self,X,y):
X_transformed = X
for name, estimator in self.steps[:-1]:
#遍历出最后一步之外的所有步骤
#对数据进行拟合和变换
X_transformed = estimator.fit_transform(X_transformed,y)
#对最后一步进行拟合
self.steps[-1][1].fit(X_transformed,y)
return self
#使用 Pipeline 进行预测时,我们同样利用除最后一步之外的所有步骤对数据进行变换 (transform),然后对最后一步调用 predict:
def predict(self,X):
X_transformed = X
for step in self.steps[:-1]:
X_transformed = step[1].transform(X_transformed)
return self.steps[-1][1].predict(X_transformed)
2、用make_pipeline方便地创建管道
利用上述语法创建管道有时有点麻烦,我们通常不需要为每一个步骤提供用户指定的名称。有一个很方便的函数 make_pipeline,可以为我们创建管道并根据每个步骤所属的类为其自动命名。make_pipeline 的语法如下所示:
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import SVC
#标准写法
pipe1 = Pipeline([("scaler",MinMaxScaler()),("svm",SVC(C=100))])
pipe2 = make_pipeline(MinMaxScaler(),SVC(C=100))
#管道对象 pipe1 和 pipe2 的作用完全相同,但 pipe2 的步骤是自动命名的。 我们可以通过查看 steps 属性来查看步骤的名称:
print("pipeline1 steps:{}".format(pipe1.steps))
print("pipeline2 steps:{}".format(pipe2.steps))
```
pipeline1 steps:[('scaler', MinMaxScaler()), ('svm', SVC(C=100))]
pipeline2 steps:[('minmaxscaler', MinMaxScaler()), ('svc', SVC(C=100))]
```