特征工程决策手册 — 先切分再造特征,统计量只认训练折
R — 原文 (Reading)
"Keep the first model simple and get the infrastructure right." (保持第一个模型简单,先把基础设施做对——基础设施主要指数据管道与特征处理链。)
— Martin Zinkevich, 《Rules of Machine Learning》 Rule #4(Google 工程经验总结,公开文档;通行表述直引)
决定机器学习项目成败差异的最大单一因素,是所使用的特征;特征工程是把领域知识注入模型的主要通道。(转述)
— 转述自 Pedro Domingos, "A Few Useful Things to Know About Machine Learning", CACM 2012 第 1 节(来源性质:业界公认综述论文)
表格类任务中,换更强算法带来的提升通常小于认真做特征带来的提升;垃圾进垃圾出(garbage in, garbage out)——模型放大的是你喂给它的信号质量。(转述,Kaggle 高排名选手赛后复盘的通行说法)
— 工程实践共识(Kaggle community wisdom)
来源说明: 本 skill 属批C"工程实践共识"系列——《机器学习》(西瓜书)不含工程落地内容 (BOOK_OVERVIEW 批判: "全书不讲数据质量管理、特征管道版本化、线上-线下一致性"), 故 R 段改引业界公开文献并标注来源性质;凡无法保证逐字精确处一律标(转述)。
I — 方法论骨架 (Interpretation)
特征工程 = 把原始字段翻译成模型假设空间听得懂的语言。四类字段各有自己的决策树:
- 数值特征: 缺失与异常先行;变换三问——强偏态→对数变换;量纲混杂且模型是线性/距离类→标准化;需要分段稳定效应→分箱。树模型对单调变换免疫,不必白费。
- 类别特征: 有序→序数编码保序;低基数无序→one-hot;高基数→折外目标编码(带平滑)/哈希/embedding。ID 与编号列永远不入模。
- 时间特征: 只用"预测时刻之前"的信息——滞后项、历史窗口聚合、日历属性;窗口右端不得越过预测时刻。
- 特征交叉: 线性模型需要手工交互项,树模型天然自带;优先领域知识驱动,拒绝暴力笛卡尔积。
两条元纪律高于一切技巧。其一,先切分后变换:均值、分位数、分箱边界、编码映射表等一切统计量只在训练折内学习,再 transform 到验证/测试——否则编码器本身就是泄漏源。其二,重要性复盘:训完必看特征重要性排序,异常高的特征先查泄漏再庆祝。
A1 — 业界公开案例 (Past Application)
注: 西瓜书无对应案例(工程落地不在书内),本节改用业界公开案例充当类比素材。
案例 1: Google Play 推荐的 Wide & Deep 架构 (Cheng et al., 2016)
- 问题: 推荐模型既要记住"见过就推"的历史共现规律,又要对没见过的组合有泛化能力。
- 方法论的使用: wide 部分用手工特征交叉(已装应用 × 曝光应用)负责记忆;deep 部分把高基数稀疏类别嵌入低维稠密向量负责泛化;两路联合训练。
- 结论: 特征交叉与 embedding 不是二选一的流派之争,而是"记忆 vs 泛化"的分工。
- 结果: 成为工业推荐系统的标准骨架之一,"交叉给记忆、embedding 给泛化"沉淀为通用设计词汇。
案例 2: Kaggle 表格赛的高基数类别处理
- 问题: 商品/广告数据的类别列动辄数十万取值,one-hot 直接维度爆炸。
- 方法论的使用: 社区沉淀出目标编码(类别值替换为其对应目标均值)的标准安全用法——K 折外拟合(out-of-fold)+ 平滑;CatBoost 的 ordered target statistics 是这一思路的系统化版本。
- 结论: 高基数不是绝路,但目标编码器本身是泄漏高危点,折外拟合的成本不可省略。
- 结果: 目标编码进入主流 GBM 生态的默认工具箱,同时"target encoding 泄漏"成为最著名的翻车词条。
案例 3: 书内理论回声——编号属性的终点演示 (c14)
- 问题: 把样本"编号"列喂给按信息增益选属性的决策树会发生什么?
- 方法论的使用: 原书实际演算:编号列每个取值恰对应一个样本,信息增益高达 0.998,用它划分的树训练误差为 0 却毫无泛化能力。
- 结论: "ID 类特征不入模"这条工程铁律在书内有最干净的理论演示——工程界将其固化为特征管道的第一道过滤规则。
- 结果: 本 skill 的数据体检步骤据此把 ID/编号列列为显式隔离项。
A2 — 触发场景 (Future Trigger) ★
用户会在什么情境下需要这个 skill?
- 用户拿到新表格数据集,问"这列日期怎么处理""城市列几百个取值怎么办""要不要标准化/取对数"。
- 用户做时序预测,要构造滑动窗口/滞后特征,担心用到未来信息。
- 用户想给线性模型或推荐模型造交叉特征,或 one-hot 后维度爆炸不知如何取舍。
- 用户跑完模型看特征重要性,发现某个特征重要性高得离谱,分不清是宝藏还是炸弹。
- 用户听说 target encoding 但不清楚它为什么危险、怎么用才安全。
语言信号 (用户的话里出现这些就应激活)
- "特征工程怎么做" / "feature engineering" / "这个特征该怎么处理"
- "one-hot 维度爆炸" / "高基数类别" / "high cardinality" / "目标编码会不会泄漏"
- "标准化还是归一化" / "要不要取对数" / "standardize" / "log transform" / "分箱"
- "滑动窗口/滞后特征会不会用到未来" / "lag features" / "time series features"
- "特征重要性第一名是个 ID 列?" / "feature importance looks weird"
与相邻 skill 的区分
- 与
ml-dimensionality的区别: 那是从已有特征池里做减法(特征选择、PCA 压缩);本 skill 是从原始数据造出特征池的加法环节。先后衔接:先构造,后挑选。 - 与
ml-leakage-defense的区别: 那是泄漏的全局审计体系(三大类型+检测信号+上线清单);本 skill 只在"变换器/编码器怎么写才不漏"这一个点与其交界,全面排查移交对方。 - 与
ml-diagnosis的区别: 效果不好时的偏差/方差归因归它;若诊断揪出 ID 列红旗,构造侧的整改回到本 skill。 - 与
ml-evaluation-design的区别: 切分方案由它事先设计;本 skill 的一切"折内拟合"纪律以那份划分为前提。
E — 可执行步骤 (Execution)
当 skill 被激活后, agent 按以下新数据集特征处理顺序清单执行:
第 0 步: 先切分,再动手
- 与用户确认训练/验证/测试(或 CV 折)划分已定且与任务匹配(时序必须按时间切);此后所有统计量只允许在训练部分计算。
- 完成标准: 划分方式(随机/分层/按时间)被明确写出。
- 判停条件: 划分未定或可疑 → 移交 ml-evaluation-design,本清单暂停。
数据体检
- 逐列登记: 类型(数值/类别有序/类别无序/时间/文本/ID)、缺失率、唯一值数、与目标的粗关系。
- 完成标准: 产出一列清单表;ID/编号类高基数列被显式标记"不入模"。
数值特征处置
- 顺序: 缺失(填充参数折内学)→ 异常(业务判断截断/保留)→ 变换(强偏态→log1p;线性/距离类模型→标准化;树模型跳过后两项)。分箱仅用于需要稳定性/可解释/喂养线性模型时,箱边界来自训练折。
- 完成标准: 每个数值列留下"缺失/异常/变换"三行处理记录。
类别特征选码
- 决策序: 有序→序数编码;低基数无序(≲15 取值)→one-hot;高基数→折外目标编码(带平滑)或哈希/embedding。
- 完成标准: 编码器 fit 只见过训练折;每列记录所选编码及一句理由。
- 判停条件: 手头只有"全量拟合"式目标编码实现 → 停,改折外方案或退回 one-hot/频数编码。
时间特征
- 只允许三类: 滞后项(lag)、历史窗口聚合(窗口右端 ≤ 预测时刻)、日历属性。
- 完成标准: 对每个时间特效能回答"该值的计算范围是否完全落在预测时刻之前"。
特征交叉与交互
- 线性/推荐场景用领域知识挑 2-3 组交叉;树模型默认不加。
- 完成标准: 每个交叉项写明业务动机,无全组合暴力相乘。
重要性复盘
- 训完看重要性排序: Top 特征逐一过"预测时刻可得性"质询,并对头号特征做一次消融。
- 完成标准: 头部特征均有可得性确认;异常者移交 ml-leakage-defense 深查后才可作为结论引用。
B — 边界 (Boundary) ★
不要在以下情况使用此 skill
- 端到端深度学习场景(图像/语音/原始文本): 表示学习自动完成特征工作,手工流程基本不适用(只剩输入侧预处理)。
- 数据还没看一眼就开始批量造特征: 先体检后构造;顺序颠倒会围绕脏数据设计出一堆精致废料。
- 目标是因果推断的项目: 本 skill 的全部手段都在制造相关性特征,直接喂因果分析会引入碰撞偏差等新问题。
业界警告的失败模式
- 目标编码全量拟合: 把测试集答案的平均值写进训练特征,线下虚高线上崩——最高频翻车点,深查走 ml-leakage-defense。
- 训练/服务 skew(Zinkevich 反复强调): 离线管道里的特征在线上拿不到或口径不一致,模型一上线就失灵。
- garbage in garbage out: 特征工程救不了错误标签与错误采集,先查数据质量再谈加工。
- 暴力交叉爆炸: 笛卡尔积式组合稀释样本,维度上天收益为负。
作者盲点 / 时代局限 (为何需要本 skill)
- 西瓜书的工程落地环节不在书内(BOOK_OVERVIEW 批判原文: "全书不讲数据质量管理、特征管道版本化、线上-线下一致性、A/B 上线等落地环节;'评估'止步于离线指标")——本 skill 即对该盲点的补全。
- 书内有价值的锚点是反向的: c14 编号属性演示(信息增益 0.998、训练误差 0 而泛化为零)正是"ID 列不入模"的理论根据,本 skill 将其工程化为第一道过滤。
- 书中 i.i.d. 前提不给时序特征留位置,滑动窗口的时间边界纪律只能来自时序建模实践。
容易混淆的邻近方法论
- 特征选择 ≠ 特征工程的前半段: 选择是在既有池上做减法(ml-dimensionality),工程是先做乘法造池子。
- 数据清洗 ≠ 特征工程: 清洗恢复数据本来面目,特征工程改造它适配假设空间;流水线的前后两站。
- "embedding 终结了手工特征": embedding 只是高基数类别的一种编码选项;表格数据上手工特征至今仍是 GBDT 竞赛主力,谈不上取代。
相关 skills
- depends-on: ml-evaluation-design(先有划分,才有"折内拟合"可言)
- contrasts-with: ml-dimensionality(构造 vs 挑选/压缩)
- composes-with: ml-leakage-defense(编码器泄漏深挖), ml-diagnosis(ID 列红旗的构造侧整改), ml-experiment-tracking(特征管道版本化)
审计信息
- 验证通过: 批C·工程实践共识单元(无书内对应章节,书内仅 c14 提供理论回声);V1 ✓ / V2 ✓ / V3 ✓ 待阶段 3 统一复核
- 测试通过率: 待阶段 3 测试 (详见 test-prompts.json)
- skill_version: 0.0.1
- 蒸馏时间: 2026-08-24