scikit-learn中的Pipeline:构建高效、可维护的机器学习流程
我们使用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_mean和with_std)和支持向量机的参数(如C和gamma)来找到最佳的模型配置。
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中的每个步骤都需要满足一定的接口要求。
对于数据预处理步骤(转换器),需要实现fit和transform(或者fit_transform)方法;
对于模型训练步骤(估计器),需要实现fit方法。
如果自定义的步骤没有正确实现这些方法,流水线在运行时会出现错误。
最后,使用Pipeline进行参数调整时,需要注意参数的命名。
在Pipeline中,参数的名称是由步骤名称和实际参数名称组合而成的。
例如,如果你有一个名为scaler的标准化步骤,其中有一个参数with_mean,那么在参数调整时,参数名称应该是scaler__with_mean。
这种命名方式可以确保正确地调整每个步骤中的参数。
scikit-learn中的Pipeline:构建高效、可维护的机器学习流程的更多相关文章
- (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探
一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...
- (原创)(四)机器学习笔记之Scikit Learn的Logistic回归初探
目录 5.3 使用LogisticRegressionCV进行正则化的 Logistic Regression 参数调优 一.Scikit Learn中有关logistics回归函数的介绍 1. 交叉 ...
- scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)
scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...
- Scikit Learn: 在python中机器学习
转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...
- 在java中构建高效的结果缓存
文章目录 使用HashMap 使用ConcurrentHashMap FutureTask 在java中构建高效的结果缓存 缓存是现代应用服务器中非常常用的组件.除了第三方缓存以外,我们通常也需要在j ...
- spark ml pipeline构建机器学习任务
一.关于spark ml pipeline与机器学习一个典型的机器学习构建包含若干个过程 1.源数据ETL 2.数据预处理 3.特征选取 4.模型训练与验证 以上四个步骤可以抽象为一个包括多个步骤的流 ...
- 神经网络训练中的Tricks之高效BP(反向传播算法)
神经网络训练中的Tricks之高效BP(反向传播算法) 神经网络训练中的Tricks之高效BP(反向传播算法) zouxy09@qq.com http://blog.csdn.net/zouxy09 ...
- 微软构建高效DevOps团队培训总结
9.21和9.22这两天参加了微软DevOps的培训,主要是围绕TFS2015的不少新功能来讲的,相比较之前我们一直使用TFS2013来管理团队,确实强大了不少,也更加实用了. 首先,什么是DevOp ...
- 在Redis集群中使用pipeline批量插入
在Redis集群中使用pipeline批量插入 由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下: Pipeline p = ...
- Scikit Learn
Scikit Learn Scikit-Learn简称sklearn,基于 Python 语言的,简单高效的数据挖掘和数据分析工具,建立在 NumPy,SciPy 和 matplotlib 上.
随机推荐
- ASP.NET Core – Handle Error on Web API
前言 上一篇讲了 ASP.NET Core – Handle Error on Razor Page 这一篇继续说说 Web API 的错误处理. 主要参考 Handle errors in ASP. ...
- C# 中的 AEAD_AES_256_GCM
注意:AEAD_AES_256_GCM Key的长度必须是32位,nonce的长度必须是12位,附加数据有可能为空值.AEAD_AES_128_GCM Key的长度必须是16位,nonce的长度必须是 ...
- Tabby,一款老外都在用的 SSH工具,竟然还支持网页操作
会编程的蜗牛 主要分享java编程,也会涉及其他方向的技术分享. 1篇原创内容 公众号 序言各位好啊,我是会编程的蜗牛,作为java开发者,或者说编程人员,程序员的我们,Linux服务器总是我们一个绕 ...
- Nuxt Kit中的 Nitro 处理程序
title: Nuxt Kit中的 Nitro 处理程序 date: 2024/9/21 updated: 2024/9/21 author: cmdragon excerpt: 摘要:本文详细介绍了 ...
- std::stod:“123.456”-> 123.456
std::stod 是 C++ 标准库中一个用于将字符串转换为 double 类型的函数.它属于 <string> 头文件中的函数,通常用于将包含数字的字符串转换为相应的浮点数值. 函数原 ...
- 数据库故障处理优质文章汇总(含Oracle、MySQL、MogDB等)
数据库告警.紧急问题处理这些项目对于大多数朋友来讲应该不陌生了.从墨天轮社区整理的"最受DBA欢迎的技术文档合辑"系列中可以发现,大家对"故障诊断专题"的热情居 ...
- 墨天轮沙龙 | 北京大学李文杰:面向知识图谱应用的图数据库系统gStore
在6月8日举办的[墨天轮数据库沙龙第七期-开源生态专场]中,北京大学重庆大数据研究院图数据库与知识图谱实验室副主任.北京大学王选计算机研究所全职博士后 李文杰老师分享了<面向知识图谱应用的图数据 ...
- iOSwkwebView 打开 TXT/PDF 文件乱码的问题
最近做资料文件下载下来并查看的时候,用 WKWebView 打开office 类型的文件的时候是没问题的,但是打开测试人员上传的一个 TXT/PDF 文件就出现了乱码问题,经过查看,应该是文件的编码问 ...
- JDBC连接数据库(mysql)基本实现-七步
// 包名 package com.zhulx; import java.sql.DriverAction; import java.sql.DriverManager; import java.sq ...
- Nuxt3+PM2集群模式启动及勘误
起因 之前写过一篇 Nuxt3 的文章,Nuxt3 环境变量配置,用到了 PM2,但是里面的一些配置存在问题,最近有空又验证了一下,这里做一个勘误. 问题 PM2 的启动配置中有一项是exec_mod ...