当我们对训练集应用各种预处理操作时(特征标准化、主成分分析等等), 我们都需要对测试集重复利用这些参数,以免出现数据泄露(data leakage)。
pipeline 实现了对全部步骤的流式化封装和管理(streaming workflows with pipelines),可以很方便地使参数集在新数据集(比如测试集)上被重复使用。
Pipeline可以将许多算法模型串联起来,比如将特征提取、归一化、分类组织在一起形成一个典型的机器学习问题工作流。主要带来两点好处:
1. 直接调用fit和predict方法来对pipeline中的所有算法模型进行训练和预测。
2. 可以结合grid search对参数进行选择。
pipeline英文文档和pipeline中文文档
Parameters
funcution
等等,详情可以参看官方文档。
⭐如何设定参数比便用于网格调参。
这个例子是最简单的例子,在参考文献【1】【2】【3】中有许多更为复杂也更实用的例子。这个例子只是用于分析pipeline的流程。
⭐问题是要对数据集 Breast Cancer Wisconsin 进行分类,
它包含 569 个样本,第一列 ID,第二列类别(M=恶性肿瘤,B=良性肿瘤),第 3-32 列是实数值的特征。
from pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import LabelEncoder
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/'
'breast-cancer-wisconsin/wdbc.data', header=None)
# Breast Cancer Wisconsin dataset
X, y = df.values[:, 2:], df.values[:, 1]
encoder = LabelEncoder()
y = encoder.fit_transform(y)
>>> encoder.transform(['M', 'B'])
array([1, 0])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=0)
我们要用 Pipeline 对训练集和测试集进行如下操作:
StandardScaler
对数据集每一列做标准化处理,(是 transformer)PCA
将原始的 30 维度特征压缩的 2 维度,(是 transformer)LogisticRegression
。(是 Estimator)调用 Pipeline 时,输入由元组构成的列表,每个元组第一个值为变量名,元组第二个元素是 sklearn 中的 transformer 或 Estimator。
注意中间每一步是 transformer,即它们必须包含 fit 和 transform 方法,或者 fit_transform
。
最后一步是一个 Estimator,即最后一步模型要有 fit 方法,可以没有 transform 方法。
然后用 Pipeline.fit对训练集进行训练,pipe_lr.fit(X_train, y_train)
再直接用 Pipeline.score 对测试集进行预测并评分 pipe_lr.score(X_test, y_test)
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
pipe_lr = Pipeline([('sc', StandardScaler()),
('pca', PCA(n_components=2)),
('clf', LogisticRegression(random_state=1))
])
pipe_lr.fit(X_train, y_train)
print('Test accuracy: %.3f' % pipe_lr.score(X_test, y_test))
# Test accuracy: 0.947
⭐Pipeline 的工作方式:
当管道 Pipeline 执行 fit 方法时,
首先 StandardScaler 执行 fit 和 transform 方法,
然后将转换后的数据输入给 PCA,
PCA 同样执行 fit 和 transform 方法,
再将数据输入给 LogisticRegression,进行训练。
注意中间每一步是transformer,即它们必须包含 fit 和 transform 方法,或者fit_transform
。
最后一步是一个Estimator,即最后一步模型要有 fit 方法,可以没有 transform 方法。
⭐当然,还可以用来选择特征,也可以应用 K-fold cross validation,详见参考文献【5】。
【1】 Managing Machine Learning Workflows with Scikit-learn Pipelines Part 2: Integrating Grid Search
【2】Managing Machine Learning Workflows with Scikit-learn Pipelines Part 2: Integrating Grid Search
【3】Managing Machine Learning Workflows with Scikit-learn Pipelines Part 3: Multiple Models, Pipelines, and Grid Searches
【4】Using AutoML to Generate Machine Learning Pipelines with TPOT
【5】Automate Machine Learning Workflows with Pipelines in Python and scikit-learn
【6】用 Pipeline 将训练集参数重复应用到测试集