news 2026/3/16 8:20:39

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/3/16 12:52:45

31、Shell编程:从基础到高级应用

Shell编程:从基础到高级应用 1. Here文档的使用 在输出文本时,除了使用 echo 命令的两种方法外,还有一种称为Here文档(Here Document)或Here脚本的方式。Here文档是一种额外的I/O重定向形式,它允许我们将一段文本嵌入到脚本中,并将其作为命令的标准输入。其基本语法…

作者头像 李华
网站建设 2026/3/15 8:20:08

35、脚本开发的故障排除、流程控制与参数处理

脚本开发的故障排除、流程控制与参数处理 1. 脚本开发中的故障排除 在脚本开发过程中,故障排除是一项至关重要的工作。下面将介绍一些常见的故障排除方法。 1.1 测试用例设计 为了进行有效的测试,开发和应用良好的测试用例非常重要。我们需要仔细选择输入数据或操作条件,…

作者头像 李华
网站建设 2026/3/15 8:20:04

YashanDB数据库的国际化与本地化策略

YashanDB数据库的国际化&#xff08;Internationalization, i18n&#xff09;与本地化&#xff08;Localization, l10n&#xff09;策略主要包括以下几个方面&#xff1a;1. 字符编码支持- Unicode 支持&#xff1a;确保数据库使用 UTF-8 或其他 Unicode 编码&#xff0c;以支持…

作者头像 李华
网站建设 2026/3/15 8:20:01

YashanDB数据库的核心模块及功能剖析

数据库系统的查询性能以及数据一致性的维护一直是数据库技术的核心难题。如何在保证事务的ACID特性前提下&#xff0c;提升查询执行效率和系统的高可用能力&#xff0c;是关系型数据库设计中的重要课题。YashanDB作为面向高性能和高可用性的关系型数据库&#xff0c;采用多种技…

作者头像 李华
网站建设 2026/3/15 8:19:58

动态规划入门

动态规划入门 文章目录动态规划入门动态规划的概念dp的重点必须存在 “重叠子问题”必须满足 “最优子结构”状态定义与状态转移方程例子动态规划的解题步骤例题动态规划的概念 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;&#xff1a;是一种求解多阶段…

作者头像 李华
网站建设 2026/3/15 8:19:59

CogVideoX终极指南:从零开始打造你的专属3D视频生成器

你是否曾经想过&#xff0c;把普通的2D视频变成震撼的3D立体效果&#xff1f;或者让静态图片动起来&#xff0c;配上深度感十足的立体视觉&#xff1f;CogVideoX正是为此而生&#xff01;这款强大的AI工具不仅能将文字和图像转化为视频&#xff0c;还能实现2D到3D的华丽变身。今…

作者头像 李华