我们使用scikit-learn进行机器学习的模型训练时,用到的数据和算法参数会根据具体的情况相应调整变化,

但是,整个模型训练的流程其实大同小异,一般都是加载数据数据预处理特征选择模型训练等几个环节。

如果训练的结果不尽如人意,从数据预处理开始,再次重新训练。

今天介绍的Pipeline(中文名称:流水线),是一种将多个机器学习步骤整合在一起的工具。

它可以帮助我们简化了机器学习过程。

1. 什么是 Pipeline

scikit-learn 中,Pipeline就像是一个工业生产流水线,把数据预处理特征选择模型训练等多个环节按顺序连接起来。

例如,一个典型的机器学习流程可能包括数据标准化、主成分分析(PCA)进行特征提取,最后使用一个分类器(如支持向量机)进行分类。

在没有Pipeline流水线的时候,你需要分别对每个步骤进行处理,手动将一个步骤的输出传递给下一个步骤。而Pipeline允许你把这些步骤封装到一个对象中,以更简洁和高效的方式来处理整个机器学习流程。

从代码角度看,流水线是由一系列的(key, value)对组成。

其中key是一个自定义的名称,用于标识步骤;

value是一个实现了fit_transform方法的 scikit-learn 转换器(用于数据预处理和特征提取等),或者是一个仅实现了fit方法的估计器(用于模型训练和预测)。

2. Pipeline 的作用和优势

2.1. 简化训练流程

使用Pipeline能带来的最大的好处就是简化机器学习模型的训练流程

我们不用在每次训练模型或者进行预测的时候,手动地逐个调用数据预处理、特征工程和模型训练的步骤。

比如下面这个示例,没有Pipeline时:

from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import numpy as np # 生成一些模拟数据
X = np.random.rand(100, 1)
y = 2 * X + 1 + 0.1 * np.random.randn(100, 1) # 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 多项式特征扩展
poly = PolynomialFeatures(degree = 2)
X_poly = poly.fit_transform(X_scaled)
# 线性回归模型训练
model = LinearRegression()
model.fit(X_poly, y)

而使用流水线,代码可以简化为:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import numpy as np # 生成一些模拟数据
X = np.random.rand(100, 1)
y = 2 * X + 1 + 0.1 * np.random.randn(100, 1) pipeline = Pipeline([
('scaler', StandardScaler()),
('poly', PolynomialFeatures(degree = 2)),
('model', LinearRegression())
])
pipeline.fit(X, y)

这样不仅可以减少代码量,还能使代码结构更加清晰。

2.2. 避免数据泄露

在机器学习中,数据泄露是一个严重的问题。

例如,在进行数据预处理和模型选择时,如果不小心将测试数据的信息泄露到训练数据的处理过程中,会导致模型在测试集上的评估结果过于乐观。

Pipeline可以确保每个步骤只使用它应该使用的数据,在Pipeline中,训练数据按照步骤依次处理,测试数据也会以相同的顺序和方式处理,这样就可以很好地避免数据泄露。

而在交叉验证过程中,Pipeline会自动将每个折叠(fold)的数据按照正确的步骤顺序进行处理。

如果手动处理各个步骤,很容易在交叉验证的过程中错误地使用了全部数据进行预处理,从而导致数据泄露。

2.3. 方便模型调参

可以将整个Pipeline当作一个模型来进行参数调整

例如,对于一个包含数据预处理和分类器的Pipeline,可以通过网格搜索(Grid Search)或者随机搜索(Random Search)等方法来同时调整预处理步骤和分类器的参数。

再比如一个包含标准化支持向量机分类器的Pipeline,我们可以同时调整标准化的参数(如with_meanwith_std)和支持向量机的参数(如Cgamma)来找到最佳的模型配置。

3. Pipeline 使用示例

示例是最好的学习资料,下面使用scikit-learn 库中的 datasets 来分别构造回归分类聚类问题的Pipeline示例。

3.1. 预测糖尿病示例

此示例先对糖尿病数据进行标准化,然后使用线性回归模型进行房价预测。

from sklearn.datasets import load_diabetes
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score # 加载糖尿病数据集
diabetes = load_diabetes()
X = diabetes.data
y = diabetes.target # 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) pipeline = Pipeline([
('scaler', StandardScaler()),
('model', LinearRegression())
]) # 在训练集上训练模型
pipeline.fit(X_train, y_train) # 在测试集上进行预测
y_pred = pipeline.predict(X_test) # 计算均方误差(MSE)来评估模型在测试集上的性能
mse = mean_squared_error(y_test, y_pred)
print("均方误差(MSE):", mse) # 计算决定系数(R² 分数)来进一步评估模型拟合优度
r2 = r2_score(y_test, y_pred)
print("决定系数(R² 分数):", r2)

最后分别使用均方误差(MSE)和决定系数(R² 分数)这两个常见的回归评估指标来衡量模型在测试集上的性能表现,帮助了解模型对糖尿病相关指标预测的准确程度和拟合效果。

3.2. 鸢尾花分类示例

标准化鸢尾花数据,接着使用支持向量机分类器对手鸢尾花种类进行分类。

from sklearn.datasets import load_iris
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score # 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target # 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) pipeline = Pipeline([
('scaler', StandardScaler()),
('classifier', SVC())
]) # 在训练集上训练模型
pipeline.fit(X_train, y_train) # 在测试集上进行预测
y_pred = pipeline.predict(X_test) # 计算准确率来评估模型在测试集上的性能
accuracy = accuracy_score(y_test, y_pred)
print("准确率:", accuracy)

3.3. 手写数字聚类示例

先对数据进行标准化,再使用 K-Means 算法对手写数字图像数据进行聚类,这里简单地假设聚为** 10 类**。

from sklearn.datasets import load_digits
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.model_selection import train_test_split # 加载手写数字数据集
digits = load_digits()
X = digits.data # 划分训练集和测试集(在聚类场景下,划分训练集更多是一种常规操作示例,实际聚类分析中根据具体需求而定)
X_train, X_test = train_test_split(X, test_size=0.2, random_state=42) pipeline = Pipeline([
('scaler', StandardScaler()),
('clusterer', KMeans(n_clusters=10)) # 假设分为10类,因为手写数字有0-9
]) # 在训练集(这里可看作全部数据用于聚类学习的示例情况)上进行聚类训练
pipeline.fit(X_train) # 获取聚类标签
cluster_labels = pipeline['clusterer'].labels_ # 简单打印测试集上部分数据的聚类标签示例
print("测试集部分数据的聚类标签示例:")
print(cluster_labels[:10])

:上面的示例我在本机的 sckilit-learn 1.5.2 版本上都运行通过。

4. 总结

Pipeline给我们的模型训练带来了便利,

不过,为了用好Pipeline,使用时有些地方需要我们特别注意。

首先是步骤顺序,数据会按照步骤的顺序依次进行处理。

例如,如果你要先进行特征选择,然后进行数据标准化,那么你需要将特征选择步骤放在标准化步骤之前。如果顺序错误,可能会导致模型性能下降或者无法正常运行。

其次,各个步骤的接口兼容性也很重要,Pipeline中的每个步骤都需要满足一定的接口要求。

对于数据预处理步骤(转换器),需要实现fittransform(或者fit_transform)方法;

对于模型训练步骤(估计器),需要实现fit方法。

如果自定义的步骤没有正确实现这些方法,流水线在运行时会出现错误。

最后,使用Pipeline进行参数调整时,需要注意参数的命名

Pipeline中,参数的名称是由步骤名称和实际参数名称组合而成的。

例如,如果你有一个名为scaler的标准化步骤,其中有一个参数with_mean,那么在参数调整时,参数名称应该是scaler__with_mean

这种命名方式可以确保正确地调整每个步骤中的参数。

scikit-learn中的Pipeline:构建高效、可维护的机器学习流程的更多相关文章

  1. (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探

    一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...

  2. (原创)(四)机器学习笔记之Scikit Learn的Logistic回归初探

    目录 5.3 使用LogisticRegressionCV进行正则化的 Logistic Regression 参数调优 一.Scikit Learn中有关logistics回归函数的介绍 1. 交叉 ...

  3. scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)

    scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...

  4. Scikit Learn: 在python中机器学习

    转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...

  5. 在java中构建高效的结果缓存

    文章目录 使用HashMap 使用ConcurrentHashMap FutureTask 在java中构建高效的结果缓存 缓存是现代应用服务器中非常常用的组件.除了第三方缓存以外,我们通常也需要在j ...

  6. spark ml pipeline构建机器学习任务

    一.关于spark ml pipeline与机器学习一个典型的机器学习构建包含若干个过程 1.源数据ETL 2.数据预处理 3.特征选取 4.模型训练与验证 以上四个步骤可以抽象为一个包括多个步骤的流 ...

  7. 神经网络训练中的Tricks之高效BP(反向传播算法)

    神经网络训练中的Tricks之高效BP(反向传播算法) 神经网络训练中的Tricks之高效BP(反向传播算法) zouxy09@qq.com http://blog.csdn.net/zouxy09 ...

  8. 微软构建高效DevOps团队培训总结

    9.21和9.22这两天参加了微软DevOps的培训,主要是围绕TFS2015的不少新功能来讲的,相比较之前我们一直使用TFS2013来管理团队,确实强大了不少,也更加实用了. 首先,什么是DevOp ...

  9. 在Redis集群中使用pipeline批量插入

    在Redis集群中使用pipeline批量插入 由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下: Pipeline p = ...

  10. Scikit Learn

    Scikit Learn Scikit-Learn简称sklearn,基于 Python 语言的,简单高效的数据挖掘和数据分析工具,建立在 NumPy,SciPy 和 matplotlib 上.

随机推荐

  1. TypeScript – Decorator 装饰器

    前言 TypeScript 5.0 之后就可以使用正真的 JS Decorator 了, 从前 experiment 的版本依然可用, 但是不建议继续用, 因为差很远, 一起用会混乱. Decorat ...

  2. Spring —— bean生命周期

    bean生命周期 生命周期:从创建到消亡的完整过程 bean生命周期:bean从创建到销毁的整体过程 bean生命周期控制:在bean创建后到销毁前做一些事情   方式一:配置控制生命周期 <b ...

  3. Dart 2.14 版现已发布

    支持 Apple Silicon,增加了默认的 lint.更好的工具和新的语言功能提高生产力. 本月,我们发布了 Dart SDK 2.14 的正式版,新的版本旨在通过独特的可移植性.生产力和稳健性组 ...

  4. SuperMap iDesktopX创建HBase数据源并导入数据

    需提前部署HBase集群,HBase环境搭建请查看文章https://www.cnblogs.com/zhangyongli2011/p/12034628.html 本文基于10.1.1 win版本s ...

  5. ant-design-vue 登录表单校验

    最近刚刚上手了 Vue3 的 antdv ui框架,来做个简单的登录校验练练手 安装 antdv 依赖 npm install ant-design-vue --save 在 main.ts/js 中 ...

  6. 高通dump ftrace & kernelshark使用

    简介 高通 ramdump 可以解析出 ftrace,方便用于追踪 快省稳 问题. kernelshark 是一个可以查看 trace event 的图形化工具,方便梳理和观察内核微观行为. trac ...

  7. vue合计行添加点击事件

    项目开发中做统计报表的时候,用到了合计功能.这个直接添加el-table已经封装好的show-summary属性就可以,但是如何给合计单元格添加点击事件呢?@cell-click="cell ...

  8. Solon 3.0 新特性:HttpUtils 了解一下

    Solon 3.0 引入一个叫 HttpUtils 小插件,这是一个简单的同步 HTTP 客户端,基于 URLConnection 适配(也支持切换为 OkHttp 适配).使得编写 HTTP 客户端 ...

  9. SqlUtils 使用

    一.前言 随着 Solon 3.0 版本发布,新添加的 SqlUtils 接口,用于操作数据库,SqlUtils 是对 Jdbc 原始接口的封装.适合 SQL 极少或较复杂,或者 ORM 不适合的场景 ...

  10. KubeSphere Meetup 北京站火热报名中 | 搭载 CIC 2021 云计算峰会

    "CIC 2021 云计算峰会"是一场 Top 级行业盛会,将汇聚 800 家青云QingCloud 企业客户信息化负责人,采取线上线下相结合的方式,与会规模将超过 10000 人 ...