news 2026/7/7 19:44:43

ADVANCE Day23

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ADVANCE Day23

@浙大疏锦行

📘 Day 23 实战作业:机器学习工程化 —— Pipeline 管道流

1. 作业综述

核心目标
本作业旨在将机器学习工作流从“手动脚本”升级为“工业级管道”。我们将利用sklearn.pipeline模块,将数据清洗(缺失值填充)、特征处理(编码、标准化)与模型训练封装为一个原子对象。

为什么要使用 Pipeline?
在之前的作业中,我们在数据预处理时往往需要手动执行fillna->map/get_dummies->StandardScaler。这种分散的操作在实际工程中存在巨大隐患:

  1. 数据泄露 (Data Leakage):如果在整个数据集上做标准化再切分,测试集的信息就泄露到了训练集中。Pipeline 能确保预处理参数(如均值、方差)只从训练集学习,并正确应用到测试集。
  2. 代码复用性差:针对新数据,需要重新写一遍清洗逻辑。Pipeline 可以直接保存并复用。
  3. 调参困难:无法在一个搜索空间内同时调整预处理参数(如 PCA 维度)和模型参数(如 树的数量)。

本作业关键技术点

  • Pipeline: 串联处理步骤。
  • ColumnTransformer: 针对不同列(数值/分类)应用不同的处理逻辑。
  • SimpleImputer,OrdinalEncoder,OneHotEncoder: 标准预处理组件的使用。

步骤 1:数据加载与预处理规划

任务描述

  1. 加载信贷数据集。
  2. 不进行任何手动预处理(如手动 fillna 或 map),直接划分X XXy yy
  3. 识别出哪些列是数值型、哪些是有序分类、哪些是无序分类,为构建管道做准备。
importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_split# 1. 加载数据data=pd.read_csv(r'F:\Training_camp\test\Credit_Data.csv')# 2. 分离特征和标签 (直接使用原始数据)y=data['Credit Default']X=data.drop(['Credit Default'],axis=1)# 3. 划分数据集 (在预处理之前划分!这是Pipeline的一大优势)X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)print(f"数据划分完成!训练集:{X_train.shape}, 测试集:{X_test.shape}")# 4. 自动识别列类型 (为 Pipeline 做准备)# 连续数值特征numeric_features=X.select_dtypes(exclude=['object']).columns.tolist()# 离散分类特征 (需要进一步区分有序和无序,这里先统称为分类)categorical_features=X.select_dtypes(include=['object']).columns.tolist()print(f"数值特征:{len(numeric_features)}个")print(f"分类特征:{len(categorical_features)}个")
数据划分完成!训练集: (6000, 17), 测试集: (1500, 17) 数值特征: 13 个 分类特征: 4 个

步骤 2:构建处理组件 (Transformers)

核心概念
Pipeline 就像一条汽车组装线,我们需要先定义好每个环节的“机械臂”:

  • 有序特征:填充缺失值 ->OrdinalEncoder(编码为 1, 2, 3)
  • 无序特征:填充缺失值 ->OneHotEncoder(独热编码)
  • 连续特征:填充缺失值 ->StandardScaler(标准化)

任务
使用Pipeline类分别封装这三类特征的处理逻辑。

fromsklearn.pipelineimportPipelinefromsklearn.imputeimportSimpleImputerfromsklearn.preprocessingimportStandardScaler,OneHotEncoder,OrdinalEncoderfromsklearn.composeimportColumnTransformer# --- 1. 定义 有序特征 处理流 ---# 必须手动指定顺序,否则模型不知道大小关系ordinal_cols=['Home Ownership','Years in current job','Term']ordinal_categories=[['Own Home','Rent','Have Mortgage','Home Mortgage'],['< 1 year','1 year','2 years','3 years','4 years','5 years','6 years','7 years','8 years','9 years','10+ years'],['Short Term','Long Term']]ordinal_transformer=Pipeline(steps=[('imputer',SimpleImputer(strategy='most_frequent')),# 众数填补('encoder',OrdinalEncoder(categories=ordinal_categories,handle_unknown='use_encoded_value',unknown_value=-1))])# --- 2. 定义 无序特征 处理流 ---nominal_cols=['Purpose']nominal_transformer=Pipeline(steps=[('imputer',SimpleImputer(strategy='most_frequent')),('encoder',OneHotEncoder(handle_unknown='ignore',sparse_output=False))# 独热编码])# --- 3. 定义 连续特征 处理流 ---# 排除掉上面用过的列,剩下的就是连续特征continuous_cols=[colforcolinX.columnsifcolnotinordinal_cols+nominal_cols]continuous_transformer=Pipeline(steps=[('imputer',SimpleImputer(strategy='median')),# 中位数填补('scaler',StandardScaler())# 标准化 (这对逻辑回归/SVM等很重要,对树模型影响较小但无害)])# --- 4. 组装成一个大的处理器 (ColumnTransformer) ---# 它的作用是:把数据按列劈开,分别扔给上面定义好的三个处理器,最后再拼起来preprocessor=ColumnTransformer(transformers=[('num',continuous_transformer,continuous_cols),('ord',ordinal_transformer,ordinal_cols),('nom',nominal_transformer,nominal_cols)],remainder='passthrough'# 其他未指定的列保持原样)print("✅ 预处理组件构建完成!")
✅ 预处理组件构建完成!

步骤 3:组装总流水线与模型训练

任务描述
preprocessor(数据处理) 和classifier(分类模型) 串联成最终的Pipeline对象。
之后,我们只需要对这个 Pipeline 对象调用.fit(),它就会自动完成所有清洗、转换和训练工作。

fromsklearn.ensembleimportRandomForestClassifierfromsklearn.metricsimportclassification_reportimporttime# 1. 组装最终管道# 逻辑:原始数据 -> preprocessor (清洗+编码+标准) -> classifier (随机森林)full_pipeline=Pipeline(steps=[('preprocessor',preprocessor),('model',RandomForestClassifier(random_state=42))])# 2. 训练 (Fit)print("🚀 开始训练 Pipeline...")start_time=time.time()# 注意:这里直接传入原始的 X_train,管道会自动处理一切full_pipeline.fit(X_train,y_train)# 3. 预测 (Predict)# 注意:直接传入原始的 X_test,管道会自动 transform 之后再预测y_pred=full_pipeline.predict(X_test)end_time=time.time()print(f"✅ 训练完成!耗时:{end_time-start_time:.4f}秒")# 4. 评估print("\n--- 分类报告 ---")print(classification_report(y_test,y_pred))
🚀 开始训练 Pipeline... ✅ 训练完成!耗时: 1.5297 秒 --- 分类报告 --- precision recall f1-score support 0 0.76 0.97 0.85 1059 1 0.77 0.28 0.41 441 accuracy 0.76 1500 macro avg 0.77 0.62 0.63 1500 weighted avg 0.77 0.76 0.72 1500

🎓 Day 23 总结:工程化的力量

通过今天的实战,我们将原本分散、混乱的数据处理代码,重构为了一个优雅的Pipeline对象。

Pipeline 的核心优势

  1. 封装性 (Encapsulation)full_pipeline.fit(X, y)一行代码搞定所有,不用担心漏掉哪一步预处理。
  2. 安全性 (Safety):自动在训练集上计算均值/方差,并应用到测试集,严防数据泄露
  3. 可移植性 (Portability):这个full_pipeline对象可以直接保存 (Pickle),以后来了新数据,加载出来直接.predict()即可,无需重写清洗逻辑。

这是从“写作业”迈向“写项目”的重要一步!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 21:57:45

21、Linux 系统中的文件归档、备份与正则表达式使用

Linux 系统中的文件归档、备份与正则表达式使用 一、文件归档与压缩 在 Linux 及类 Unix 系统中,文件的归档和压缩是常见操作,常用的工具包括 tar 、 gzip 、 bzip2 和 zip 。 1.1 tar 结合压缩工具 现代 GNU 版本的 tar 直接支持 gzip 和 bzip2 压缩,分…

作者头像 李华
网站建设 2026/7/7 19:44:34

39、高级Shell脚本编程技巧与概念

高级Shell脚本编程技巧与概念 1. 数组扩展与循环 在某些情况下,数组元素的扩展可能是无序的,这时可以将循环的整个输出通过管道传递给 sort 命令进行排序。另外,使用 "${!array[@]}" 扩展可以得到数组索引列表,而非数组元素列表,这在一些循环操作中很有用…

作者头像 李华
网站建设 2026/7/7 15:19:22

python_字幕文本、音频、视频一键组合

python_字幕文本、音频、视频一键组合 import os import re import random import pyJianYingDraft as draft from pyJianYingDraft import (TrackType, TextStyle, ClipSettings, TextBackground,KeyframeProperty, trange)def split_subtitle(subtitle):"""将…

作者头像 李华
网站建设 2026/7/7 18:31:13

python_字幕、音频、媒体文件(图片或视频)一键组合

python_字幕、音频、媒体文件(图片或视频)一键组合 import os import re import random import pyJianYingDraft as draft from pyJianYingDraft import (TrackType, TextStyle, ClipSettings, TextBackground,KeyframeProperty, trange) from PIL import Image # 用于获取图片…

作者头像 李华
网站建设 2026/7/7 6:21:01

基于SpringBoot特色农产品销售系统毕业设计项目源码

题目简介基于 SpringBoot 的特色农产品销售系统&#xff0c;直击 “农产品产销信息不对称、溯源难、订单履约效率低、供应链管控弱” 的核心痛点&#xff0c;依托 SpringBoot 轻量级框架优势&#xff0c;构建 “商品展示 订单管理 溯源追踪 供应链管控” 的一体化销售平台。…

作者头像 李华
网站建设 2026/7/7 3:36:29

YashanDB数据库的缓存机制及其对企业性能提升的影响

在现代数据库技术中&#xff0c;性能瓶颈和数据一致性问题是普遍存在的关键挑战。随着企业数据规模快速增长和业务复杂度提升&#xff0c;数据库系统的响应速度和稳定性直接影响企业的运营效率和竞争力。作为一款具备多样部署形态的高性能数据库&#xff0c;YashanDB通过多层缓…

作者头像 李华