利用sklearn中pipeline构建机器学习工作流

原文链接:https://blog.csdn.net/anshuai_aw1/article/details/82498857

当我们对训练集应用各种预处理操作时(特征标准化、主成分分析等等), 我们都需要对测试集重复利用这些参数,以免出现数据泄露(data leakage)。

pipeline 实现了对全部步骤的流式化封装和管理(streaming workflows with pipelines),可以很方便地使参数集在新数据集(比如测试集)上被重复使用。

Pipeline可以将许多算法模型串联起来,比如将特征提取、归一化、分类组织在一起形成一个典型的机器学习问题工作流。主要带来两点好处:

1. 直接调用fit和predict方法来对pipeline中的所有算法模型进行训练和预测。

2. 可以结合grid search对参数进行选择。

1 官方文档
pipeline英文文档和pipeline中文文档

Parameters

steps : 步骤:列表(list) 
被连接的(名称,变换)元组(实现拟合/变换)的列表,按照它们被连接的顺序,最后一个对象是估计器(estimator)。
memory:内存参数,Instance of sklearn.external.joblib.Memory or string, optional (default=None)
属性,name_steps:bunch object,具有属性访问权限的字典 
只读属性以用户给定的名称访问任何步骤参数。键是步骤名称,值是步骤参数。或者也可以直接通过”.步骤名称”获取
funcution

Pipline的方法都是执行各个学习器中对应的方法,如果该学习器没有该方法,会报错
假设该Pipline共有n个学习器
transform,依次执行各个学习器的transform方法
fit,依次对前n-1个学习器执行fit和transform方法,第n个学习器(最后一个学习器)执行fit方法
predict,执行第n个学习器的predict方法
score,执行第n个学习器的score方法
set_params,设置第n个学习器的参数
get_param,获取第n个学习器的参数
等等,详情可以参看官方文档。

⭐如何设定参数比便用于网格调参。

2 举例
这个例子是最简单的例子,在参考文献【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】
 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`sklearn.pipeline`是Scikit-learn库的一个模块,用于构建和管理机器学习流水线(pipeline)。机器学习流水线是一种将多个数据处理步骤和机器学习模型串联起来的方式,以便更方便地进行模型训练和预测。 在`sklearn.pipeline`,可以通过`Pipeline`类来定义一个流水线对象。流水线对象由多个步骤组成,每个步骤可以是数据处理操作(如特征预处理、特征选择等)或机器学习模型。每个步骤都可以指定一些参数,以便自定义其行为。 使用流水线可以将不同的数据处理和建模步骤封装在一起,从而实现更高效、更简洁的机器学习工作流程。流水线可以确保在训练和预测时所有步骤按顺序执行,并且可以方便地进行参数调优和交叉验证。 下面是一个简单的示例,展示如何使用`sklearn.pipeline`构建一个简单的流水线: ```python from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression # 定义流水线的步骤 steps = [ ('scaler', StandardScaler()), # 特征预处理 ('classifier', LogisticRegression()) # 分类器 ] # 创建流水线对象 pipeline = Pipeline(steps) # 使用流水线进行训练和预测 pipeline.fit(X_train, y_train) y_pred = pipeline.predict(X_test) ``` 在上述示例,流水线包含两个步骤:特征预处理(使用`StandardScaler`进行特征缩放)和分类器(使用`LogisticRegression`进行分类)。可以根据实际需求自定义流水线的步骤和参数,并使用流水线进行模型训练和预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值