上一篇总览说清了「特征决定上限」,也说了同一套特征在离线和在线要同口径。这一篇把镜头拉远,看一套能长期跑的特征体系长什么样。
备料师要接手一个新后厨,得先想明白三件事:这道菜能用哪些料?料从哪进货?料坏了谁来报警? 对应到机器学习,就是特征工程的三张清单——特征使用方案、特征获取方案、特征监控方案。全程用一个真实任务串起来:美团「点击下单率」预估。
Table of contents
Open Table of contents
一句话理解
一个上线跑几年的模型,80% 的效果由特征带来。所以特征体系不是「训练前搭一次」的一次性工程,而是像后厨供应链一样,要选品、要进货、要天天质检。
- 使用方案 = 菜单设计:这道菜该放哪些料,哪些料现在拿得到。
- 获取方案 = 供应链:料从哪进、怎么存、要多快能上桌。
- 监控方案 = 质检:料新不新鲜、够不够、坏没坏,坏了怎么应急。
0. 先定位:特征工程在整个框架的哪一段
一个经典的机器学习任务链路是:
数据清洗 ⇒ 特征 & 标注数据生成 ⇒ 模型学习 ⇒ 模型应用
└────────── 特征工程 ──────────┘
特征工程就是前两步:从原始数据(文本、图像、行为日志)里清洗出特征和标注。这里又分离线、在线两条道(上一篇讲过):
- 离线(训练):样本采样、样本调权、异常点去除、归一化、特征变换、特征组合……可以反复实验,数据落在 Hadoop 上,容忍失败重跑。
- 在线(预测):只算特征、不要标注;对稳定性和延时要求极高,常把数据建入索引、存进 KV。
实例:美团点击下单率预估
| 维度 | 内容 |
|---|---|
| 业务目标 | 提高团购体验,帮用户更快找到想买的单子 |
| 技术目标 | 预测用户「点击 / 购买」团购单的概率(点击下单率) |
| 度量 | 离线看 AUC;在线用 ABTest 看下单率 / 转化率 |
下面三张清单,都围绕这个任务展开。
1. 第一张清单:特征使用方案(选哪些料)
确定技术目标后,第一步是梳理哪些数据可能和用户行为相关,并评估它们到底能不能用。
1.1 先按业务经验圈候选
和「用户点击 / 下单」可能相关的特征,大致三类:
| 类别 | 例子 |
|---|---|
| 上下文特征 | 用户与商家的距离、当前时段 |
| 用户特征 | 历史行为(点击/购买记录)、实时兴趣、人口属性(年龄、性别) |
| 物品(团购单)特征 | 单子质量、热度(购买人数、评价数) |
1.2 再用三把尺子做「可用性评估」
圈出来不等于能用。每个候选特征过三关:
| 尺子 | 问什么 | 反例 |
|---|---|---|
| 获取难度 | 这数据容易拿到吗? | 用户年龄常常非必填 → 得靠模型预测,引入额外复杂度 |
| 覆盖率 | 能覆盖多少样本? | PC 用户没地理位置;新用户没历史行为 |
| 准确率 | 数据可靠吗? | 用户自填的性别、第三方给的「单子质量」都可能有误差 |
一个特征哪怕「理论上很强」,只要覆盖率太低或准确率太差,也可能弊大于利。可用性评估的本质,是在「预测力」和「可得性 / 可靠性」之间权衡。
2. 第二张清单:特征获取方案(料从哪进)
选好了料,接下来是用什么技术栈把它算出来、存起来、供上线读取。离线和在线的约束完全不同:
| 环境 | 技术要求 | 存储 / 工具 | 场景 |
|---|---|---|---|
| 离线 | 可用海量数据,容忍一定延时 | HDFS、MapReduce、Spark | 批量分析处理 |
| 在线 | 极度注重延时和查找性能 | 索引、KV 存储 | 实时快速取数 |
分层获取:粗排用「基础料」,精排用「高级料」
在线服务为了兼顾延时和效果,普遍采用分层特征方案:
- 粗排阶段:用更基础的特征,数据直接建入索引,保证极低延时——因为要在海量候选上跑。
- 精排阶段:候选已经很少了,才舍得用更个性化的特征(实时兴趣、深度画像)做复杂计算。
这套「贵料只用在少数候选上」的思路,和推荐系统召回 → 排序的漏斗完全同构:越往后,候选越少、单条越贵、特征越精细。
3. 第三张清单:特征监控方案(料坏了报警)
这是最容易被忽略、却最要命的一张清单。同一事物在不同时间的性质可能天差地别(比如「热门」是随时变的),一个上线的特征体系必须天天质检。
3.1 三个关键监控指标
| 指标 | 监控什么 | 出问题的信号 |
|---|---|---|
| 时效性 | 特征是不是最新的 | 同一事物不同时段性质差异大,过期就失真 |
| 覆盖率 | 有该特征的样本占比 | 占比骤降 → 上游数据可能断了,需预警 |
| 异常值 | 特征取值是否异常 | 异常值干扰决策,需及时发现 |
3.2 特征有效性分析:这料到底有没有用
要知道每个特征对模型的贡献,看它的权重:
| 类型 | 描述 | 方法 |
|---|---|---|
| 与模型相关的权重 | 用全部特征训模型后,看各特征在模型里的权重 | 线性模型系数等 |
| 与模型无关的权重 | 直接分析特征与标签(Label)的相关性,和用什么模型无关 | 交叉熵、Information Gain、Odds ratio、互信息、KL 散度 |
「与模型无关」的分析很有用:它能在训练模型之前就告诉你哪些特征值得留,是特征选择里过滤法的基础。
3.3 异常处理:监控 → 降级 → 修复的闭环
监控不是为了看报表,是为了出事能兜住:
- 发现异常:监控界面报出覆盖率、数值异常。
- 及时处理:对服务做降级(比如临时用默认值 / 兜底策略),并联系特征数据提供方。
- 源头解决:督促特征生成过程本身做好监控,从源头修复。
关键特征一旦悄悄出问题又没人管,后果是灾难性的——模型还在跑,但喂进去的是垃圾,线上指标慢慢烂掉却查不出原因。
TL;DR — 三句话
- 一个长期跑的模型,80% 效果由特征带来,所以特征是要「选品 + 进货 + 质检」的持续工程,不是训练前搭一次。
- 三张清单:使用方案(圈候选 + 三把尺子做可用性评估)、获取方案(离线海量 / 在线低延时,分层获取)、监控方案(时效/覆盖/异常 + 有效性分析 + 降级闭环)。
- 贵料只用在少数候选上(粗排基础特征、精排深度特征),和推荐漏斗同构。
下一篇卷起袖子洗菜——数据预处理:数据观察怎么系统地找问题、异常值有哪些检测法(箱线图 / 切比雪夫 / 孤立森林)、缺失值的四种补法。