【人工智能】Python中的机器学习管道:如何用scikit-learn构建高效的ML管道
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门!
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界
在机器学习项目中,数据预处理、特征工程、模型训练与评估是不可或缺的环节。随着项目规模的扩大和复杂度的增加,手动管理这些步骤不仅繁琐且容易出错。scikit-learn提供的管道(Pipeline)工具,能够将这些步骤自动化、模块化,极大地提升了机器学习流程的效率和可维护性。本文将深入探讨如何使用scikit-learn构建高效的机器学习管道,涵盖从数据预处理到模型评估的完整流程。通过详细的代码示例和中文注释,读者将学习如何整合各种预处理步骤、选择合适的模型、进行参数调优以及评估模型性能。此外,本文还将介绍如何在管道中引入自定义的转换器,以满足特定项目的需求。通过本文的学习,读者将全面掌握使用scikit-learn构建和优化机器学习管道的实用技能,能够在实际项目中高效应用这一工具,提升模型开发的速度与质量。
引言
在机器学习项目中,数据预处理、特征工程、模型选择与评估是关键步骤。这些步骤通常需要多次重复执行,尤其在进行模型调优和交叉验证时,手动管理这些流程不仅耗时且容易出错。为了提高工作效率和代码的可维护性,构建一个高效的机器学习管道成为了必然选择。scikit-learn作为Python中最流行的机器学习库之一,提供了强大的管道工具,能够将多个步骤整合在一起,形成一个完整的流程。
本文将系统地介绍如何使用scikit-learn构建高效的机器学习管道。首先,我们将介绍机器学习管道的基本概念和重要性;随后,详细讲解如何使用Pipeline类整合数据预处理和模型训练步骤;接着,通过具体的代码示例,展示如何构建一个完整的机器学习管道,并进行模型评估和参数调优;最后,探讨一些高级技巧,如自定义转换器和管道在生产环境中的应用。通过本文的学习,读者将能够熟练掌握使用scikit-learn构建和优化机器学习管道的技巧,从而提升机器学习项目的效率和效果。
机器学习管道概述
什么是机器学习管道?
机器学习管道(Machine Learning Pipeline)是一种将多个数据处理和模型训练步骤串联起来的方式,使得整个机器学习流程更加系统化和自动化。管道的核心思想是将数据预处理、特征工程、模型训练和评估等步骤按照一定的顺序组合在一起,形成一个可复用的工作流程。
为什么需要机器学习管道?
- 提高效率:通过自动化多个步骤,减少重复劳动,节省时间。
- 减少错误:减少手动操作带来的错误,提高流程的可靠性。
- 代码模块化:将不同的处理步骤模块化,提升代码的可读性和可维护性。
- 便于调优:通过管道,可以轻松地进行参数调优和交叉验证,优化模型性能。
- 增强可复用性:管道可以在不同的数据集和项目中重复使用,提升工作效率。
机器学习管道的组成
一个典型的机器学习管道通常包括以下几个步骤:
- 数据预处理:处理缺失值、异常值、数据清洗等。
- 特征工程:特征选择、特征转换、特征缩放等。
- 模型训练:选择并训练机器学习模型。
- 模型评估:评估模型性能,进行交叉验证等。
- 模型部署:将训练好的模型应用于实际数据中。
通过将这些步骤整合在一起,机器学习管道能够实现从原始数据到最终模型的一体化流程。
使用scikit-learn构建机器学习管道
scikit-learn提供了Pipeline类,能够方便地将多个步骤整合在一起。以下是构建机器学习管道的基本步骤。
安装与导入必要的库
在开始之前,确保已安装scikit-learn库。如果尚未安装,可以使用以下命令进行安装:
pip install scikit-learn
然后,导入必要的库:
import numpy as np
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
示例数据集
为了演示如何构建机器学习管道,我们将使用一个示例数据集。这里使用Pandas生成一个简单的数据集,其中包含数值和类别特征,以及缺失值。
# 创建示例数据集
data = {'年龄': [25, 30, 45, np.nan, 35, 40, 50, 23, 33, 38],'收入': [50000, 60000, 80000, 55000, np.nan, 72000, 85000, 40000, 58000, 65000],'城市': ['北京', '上海', '广州', '深圳', '北京', '上海', '广州', '深圳', '北京', '上海'],'购买意愿': [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
}df = pd.DataFrame(data)
print(df)
输出:
年龄 收入 城市 购买意愿
0 25.0 50000.0 北京 0
1 30.0 60000.0 上海 1
2 45.0 80000.0 广州 0
3 NaN 55000.0 深圳 1
4 35.0 NaN 北京 0
5 40.0 72000.0 上海 1
6 50.0 85000.0 广州 0
7 23.0 40000.0 深圳 1
8 33.0 58000.0 北京 0
9 38.0 65000.0 上海 1
数据预处理步骤
在机器学习管道中,数据预处理通常包括以下几个步骤:
- 处理缺失值:使用填充方法处理数值和类别特征中的缺失值。
- 特征编码:将类别特征转换为数值形式,以便模型能够处理。
- 特征缩放:对数值特征进行标准化或归一化,提升模型性能。
1. 处理缺失值
对于数值特征,我们可以使用均值填充缺失值;对于类别特征,可以使用最频繁值填充。
# 定义数值和类别特征
numeric_features = ['年龄', '收入']
numeric_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='mean')), # 使用均值填充缺失值('scaler', StandardScaler()) # 标准化数值特征
])categorical_features = ['城市']
categorical_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')), # 使用最频繁值填充缺失值('onehot', OneHotEncoder(handle_unknown='ignore')) # 独热编码
])
2. 特征工程
使用ColumnTransformer将不同类型的特征应用不同的预处理步骤。
# 组合预处理步骤
preprocessor = ColumnTransformer(transformers=[('num', numeric_transformer, numeric_features),('cat', categorical_transformer, categorical_features)])
3. 构建完整的机器学习管道
将预处理步骤与模型训练步骤整合在一起,形成一个完整的管道。
# 构建完整的管道
pipeline = Pipeline(steps=[('preprocessor', preprocessor),('classifier', LogisticRegression())
])
拆分数据集
将数据集拆分为训练集和测试集,以便评估模型性能。
# 定义特征和目标变量
X = df.drop('购买意愿', axis=1)
y = df['购买意愿']# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
模型训练与评估
使用构建好的管道进行模型训练和评估。
# 训练模型
pipeline.fit(X_train, y_train)# 预测测试集
y_pred = pipeline.predict(X_test)# 评估模型
print("分类报告:")
print(classification_report(y_test, y_pred))
print("混淆矩阵:")
print(confusion_matrix(y_test, y_pred))
输出示例
分类报告:precision recall f1-score support0 1.00 1.00 1.00 11 1.00 1.00 1.00 1accuracy 1.00 2macro avg 1.00 1.00 1.00 2
weighted avg 1.00 1.00 1.00 2混淆矩阵:
[[1 0][0 1]]
参数调优与交叉验证
使用GridSearchCV对管道中的模型进行参数调优,并结合交叉验证提升模型性能。
# 定义参数网格
param_grid = {'classifier__C': [0.1, 1.0, 10.0],'classifier__solver': ['liblinear', 'lbfgs']
}# 使用GridSearchCV进行参数调优
grid_search = GridSearchCV(pipeline, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)# 输出最佳参数和最佳得分
print("最佳参数:", grid_search.best_params_)
print("最佳交叉验证得分:", grid_search.best_score_)# 使用最佳模型进行预测
y_pred_best = grid_search.predict(X_test)# 评估最佳模型
print("最佳模型分类报告:")
print(classification_report(y_test, y_pred_best))
输出示例
最佳参数: {'classifier__C': 1.0, 'classifier__solver': 'liblinear'}
最佳交叉验证得分: 1.0
最佳模型分类报告:precision recall f1-score support0 1.00 1.00 1.00 11 1.00 1.00 1.00 1accuracy 1.00 2macro avg 1.00 1.00 1.00 2
weighted avg 1.00 1.00 1.00 2
完整代码示例
以下是完整的代码示例,整合了上述所有步骤。
import numpy as np
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix# 创建示例数据集
data = {'年龄': [25, 30, 45, np.nan, 35, 40, 50, 23, 33, 38],'收入': [50000, 60000, 80000, 55000, np.nan, 72000, 85000, 40000, 58000, 65000],'城市': ['北京', '上海', '广州', '深圳', '北京', '上海', '广州', '深圳', '北京', '上海'],'购买意愿': [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
}df = pd.DataFrame(data)# 定义数值和类别特征
numeric_features = ['年龄', '收入']
numeric_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='mean')), # 使用均值填充缺失值('scaler', StandardScaler()) # 标准化数值特征
])categorical_features = ['城市']
categorical_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')), # 使用最频繁值填充缺失值('onehot', OneHotEncoder(handle_unknown='ignore')) # 独热编码
])# 组合预处理步骤
preprocessor = ColumnTransformer(transformers=[('num', numeric_transformer, numeric_features),('cat', categorical_transformer, categorical_features)])# 构建完整的管道
pipeline = Pipe相关文章:
【人工智能】Python中的机器学习管道:如何用scikit-learn构建高效的ML管道
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在机器学习项目中,数据预处理、特征工程、模型训练与评估是不可或缺的环节。随着项目规模的扩大和复杂度的增加,手动管理这些步骤不仅繁琐…...
Redis存在安全漏洞
Redis是美国Redis公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值(Key-Value)存储数据库,并提供多种语言的API。 Redis存在安全漏洞。攻击者利用该漏洞使用特制的Lua脚本触发堆栈缓冲区溢出漏洞,从…...
Scala图书管理系统
项目创建并实现基础UI package org.appimport scala.io.StdInobject Main {def main(args: Array[String]): Unit {var running truewhile (running) {println("欢迎来到我的图书管理系统,请选择")println("1.查看所有图书")println("2…...
【数据可视化案列】白葡萄酒质量数据的EDA可视化分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
Postman接口测试:全局变量/接口关联/加密/解密
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 全局变量和环境变量 全局变量:在postman全局生效的变量,全局唯一 环境变量:在特定环境下生效的变量,本环境内唯一 …...
vue+elementui实现下拉表格多选+搜索+分页+回显+全选2.0
一、vueelementui实现下拉表格多选搜索1.0 二、vueelementui实现下拉表格多选搜索分页回显全选2.0 在1.0的基础上,终于可以实现在下拉框表格分页的前提下不同页码的回显辣,分页是前端来分页的(代码略乱且没有封装还很长,随便看看…...
电商系统-产品经理
电视产品经理的工作体系: 产品经理的分类与职责 C端产品经理:面向个人用户,关注用户体验和产品易用性B端产品经理:面向企业客户,注重功能完整性和商业价值专业方向细分: 用户产品经理:专注用户…...
《庐山派从入门到...》PWM板载蜂鸣器
《庐山派从入门到...》PWM板载蜂鸣器 配置PWM模块控制板载无源蜂鸣器播放【一闪一闪亮晶晶】播放do re mi 《庐山派从入门到...》PWM控制无源蜂鸣器 PWM(Pulse Width Modulation,脉宽调制)是一种在嵌入式系统中常用的技术,它可以用…...
【河南新标】豫财预〔2024〕105号-《关于省级政务信息化建设项目支出预算标准的规定》-费用标准解读系列29
2024年12月3日,河南省财政厅发布了《关于省级政务信息化建设项目支出预算标准的规定》豫财预〔2024〕105号。《关于省级政务信息化建设项目支出预算标准的规定 (试行)》(豫财预 〔2020〕81号)同时废止。新的豫财预〔20…...
【数据结构】数据结构整体大纲
数据结构用来干什么的?很简单,存数据用的。 (这篇文章仅介绍数据结构的大纲,详细讲解放在后面的每一个章节中,逐个击破) 那为什么不直接使用数组、集合来存储呢 ——> 如果有成千上亿条数据呢ÿ…...
【C++基础】09、结构体
一、结构体(struct) C/C 数组允许定义可存储相同类型数据项的变量,但是结构体是 C 中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。 结构体用于表示一条记录,假设现在想要跟踪图书馆中书本的动态,可能需要跟踪每…...
大恒相机开发(2)—Python软触发调用采集图像
大恒相机开发(2)—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序,用于从大恒相机采集图像,通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码: # version:…...
QT的前景与互联网岗位发展
qt是用来干什么的 --》桌面应用开发(做电脑的应用程序,面对客户端)。 主要用于开发跨平台的应用程序和用户界面(UI)。它是一个全面的C库集合,提供了构建软件应用所需的各种工具和功能。 客户端开发的重…...
青藤入选工信部“2024年网络安全技术应用典型案例拟支持项目名单”
近日,工业和信息化部公示了“2024年网络安全技术应用典型案例拟支持项目名单”,青藤云安全联合某股份制银行共同申报的主机威胁狩猎平台项目凭借其技术先进性及行业示范性成功入选。 网络安全技术应用试点示范工作是由工业和信息化部、国家互联网信息办公…...
NVIDIA GPU 内部架构介绍
NVIDIA GPU 架构 NVIDIA GPU 的 SM(Streaming Multiprocessor) 和 GPC(Graphics Processing Cluster) 是 GPU 架构中的关键组成部分。它们决定了 GPU 的计算能力和性能,以下是对这两个参数的详细介绍: 1. …...
重温设计模式----装饰模式
文章目录 装饰模式定义UML 图其主要优点包括:装饰模式的主要角色有:C 代码示例总结 装饰模式定义 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式必生成子类更加灵活 装饰模式(Decorator Pattern&…...
第十六章 C++ 字符串
C 字符串 C 提供了以下两种类型的字符串表示形式: C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C 中继续得到支持。字符串实际上是使用 null 字符 终止的一维字符数组。因此,一个以 null 结尾的…...
MySQL中Seconds_Behind_Master是怎么计算的
目录 1.Seconds_Behind_Master计算方式2.Seconds_Behind_Master 计算方式会存在什么问题3.更好的方式3.1 实现方法3.2 优点在MySQL中,Seconds_Behind_Master是一个用于表示从库(Slave)落后于主库(Master)的时间(以秒为单位)的指标。 1.Seconds_Behind_Master计算方式 其…...
React Native 集成原生Android功能
React Native 集成原生功能完整指南 前言 在 React Native 开发中,我们经常需要使用设备的原生功能,比如蓝牙、打印机等。本文将以集成打印机功能为例,详细介绍如何在 React Native 项目中集成 Android 原生功能。 集成步骤概述 创建原生…...
Mac mini m4安装PD和Crack和关闭SIP
文章目录 说明PD下载地址Crack下载地址PD版本补丁版本说明SIP简介SIP关闭方法启用 SIP:补充说明 说明 参考文章地址 PD下载地址 PD20.0.0 PD20.0.1 PD20.1.0 PD20.1.1 PD20.1.2 PD20.1.3 Crack下载地址 Parallels Desktop Activation Tool PD版本补丁版本…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
