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

本文深入讲解了sklearn库中的Pipeline模块,阐述了如何利用Pipeline进行数据预处理、特征工程及模型训练的一体化流程,特别强调了其在避免数据泄露、简化参数调整过程中的优势。同时,提供了对乳腺癌数据集进行分类的实例,展示了Pipeline在实际问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


3 参考文献

【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 将训练集参数重复应用到测试集

<think>好的,用户想了解机器学习pipeline的概念和用法。首先,我需要回忆一下pipeline的基本定义。Pipeline机器学习中通常指的是将多个处理步骤串联起来,形成一个自动化的工作流。这样做的目的是为了提高效率和可维护性。 接下来,用户提到了概念和实现方法,所以需要分两部分来回答。概念部分需要解释pipeline的作用,比如数据预处理、特征工程、模型训练等步骤的整合。实现方法的话,可能需要提到具体的库,比如scikit-learn中的Pipeline类,以及如何通过它来构建流程。 然后,用户提供的引用中有提到Scikit-learn的示例代码,保存和加载pipeline的方法。这应该在实现方法部分提到,作为实际应用的例子。另外,引用里还提到了提示词设计,但用户的问题主要集中在pipeline,所以这部分可能不太相关,但需要确认是否要结合提示词的内容。 用户可能对pipeline的具体使用步骤不太清楚,需要详细说明如何创建Pipeline对象,添加步骤,比如标准化、降维、模型训练等。同时,要强调Pipeline的优势,比如避免数据泄漏、代码简洁、便于部署等。 可能还需要考虑用户的实际应用场景,比如他们在处理数据时是否遇到重复的步骤,或者模型部署的问题,Pipeline如何解决这些问题。此外,用户可能想知道如何调参,比如使用GridSearchCV来优化整个流程的参数。 最后,生成相关问题时要围绕pipeline展开,比如优点、应用场景、与普通代码的区别、参数调优方法等,确保覆盖用户可能感兴趣的扩展内容。需要确保回答结构清晰,步骤明确,并引用提供的参考资料中的例子,比如保存pipeline的代码示例。</think>### 机器学习 Pipeline 的概念及实现方法 #### 1. Pipeline 的核心概念 机器学习 Pipeline(流水线)是一种将数据预处理、特征工程、模型训练等步骤封装为统一流程的技术,通过自动化串联多个处理步骤,实现端到端的机器学习任务。其核心特点包括: - **模块化**:将数据标准化、特征选择、模型训练等步骤解耦为独立模块 - **可重复性**:确保实验流程的标准化和可复现 - **防数据泄漏**:通过统一管理数据流转,避免训练集与测试集的信息混杂[^1] 例如,一个典型的分类任务 Pipeline 流程可表示为: $$ \text{输入数据} \rightarrow \text{缺失值填充} \rightarrow \text{特征缩放} \rightarrow \text{特征选择} \rightarrow \text{模型训练} \rightarrow \text{预测输出} $$ #### 2. 实现方法(以 Scikit-learn 为例) **步骤 1:构建 Pipeline 对象** ```python from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn.svm import SVC pipeline = Pipeline([ ('scaler', StandardScaler()), # 标准化 ('pca', PCA(n_components=2)), # 降维 ('classifier', SVC()) # 分类模型 ]) ``` **步骤 2:训练与预测** ```python pipeline.fit(X_train, y_train) # 自动按顺序执行所有步骤 y_pred = pipeline.predict(X_test) # 对新数据执行相同处理流程 ``` **步骤 3:保存与加载(引用示例[^2])** ```python import joblib joblib.dump(pipeline, 'model.pkl') # 保存完整流程 loaded_pipe = joblib.load('model.pkl') # 加载即用 ``` #### 3. 关键优势 1. **避免数据泄漏**:所有预处理步骤在交叉验证时仅使用训练数据 2. **代码简洁性**:将多个处理步骤封装为单一对象 3. **超参数统一调优**:可通过网格搜索同时优化预处理和模型参数 ```python from sklearn.model_selection import GridSearchCV params = {'pca__n_components': [2,3], 'classifier__C': [0.1, 1]} grid = GridSearchCV(pipeline, params) ``` #### 4. 典型应用场景 - **特征工程复杂**:需要多步骤数据转换 - **模型部署**:将预处理与模型打包为单一可部署单元 - **实验对比**:快速切换不同算法组合进行评估
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值