news 2026/6/10 11:07:12

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/6/1 2:26:19

25、文本处理工具全解析

文本处理工具全解析 在文本处理的世界里,有许多实用的工具能帮助我们高效地完成各种任务,如文件打补丁、字符转换、文本编辑和拼写检查等。下面将详细介绍这些工具及其使用方法。 文件打补丁:patch 工具 当我们创建了 diff 文件后,就可以使用 patch 工具将旧文件更新为…

作者头像 李华
网站建设 2026/6/4 17:32:23

轻量级AI模型本地化部署终极指南:3步搞定60M参数T5模型

轻量级AI模型本地化部署终极指南&#xff1a;3步搞定60M参数T5模型 【免费下载链接】t5_small T5-Small is the checkpoint with 60 million parameters. 项目地址: https://ai.gitcode.com/openMind/t5_small 还在为AI模型部署的复杂流程而头疼吗&#xff1f;今天我们将…

作者头像 李华
网站建设 2026/5/31 16:25:04

前端状态管理艺术:iView组件协同打造流畅用户体验

前端状态管理艺术&#xff1a;iView组件协同打造流畅用户体验 【免费下载链接】iview A high quality UI Toolkit built on Vue.js 2.0 项目地址: https://gitcode.com/gh_mirrors/iv/iview 你是否经历过这样的困惑&#xff1a;用户点击按钮后界面毫无反应&#xff0c;多…

作者头像 李华
网站建设 2026/6/7 11:58:47

二叉树基本概念及遍历

二叉树基本概念及遍历 1、基本概念 二叉树是一种特殊的树形数据结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;通常称为左子节点和右子节点。它是非线性数据结构中最基础、最重要的一种。 2、核心特征 2.1. 结构特性 每个节点最多有两个子节点&#xff08;0个、1个…

作者头像 李华
网站建设 2026/6/10 11:05:56

基于SpringBoot城市化自修室管理系统(毕业设计项目源码+文档)

课题摘要基于 SpringBoot 的城市化自修室管理系统&#xff0c;直击 “自修室预约流程繁琐、座位管控混乱、设备使用无序、运营数据统计缺失” 的核心痛点&#xff0c;依托 SpringBoot 轻量级框架优势&#xff0c;构建 “座位预约 场地管控 设备管理 数据运营” 的一体化管理…

作者头像 李华