7.3 特征选择与生产一致性:从候选列到可监控接口
同一个特征在线上和离线得到不同数值,模型工坊拒收了这批尚未建立计算契约的数据。
模型在离线回放中通过了验证,部署后却发现“最近七天补给次数”线上少算一批迟到记录,未知装备类型被静默编码成全零。问题不在算法,而在训练和服务没有执行同一份特征契约。
本课讨论两个收口问题:如何在不偷看验证集的前提下选择特征,以及如何让选中的特征在生产环境中可复现、可监控、可回滚。
本课目标
- 区分过滤式、包裹式与嵌入式选择;
- 把特征选择放入交叉验证;
- 检查选择稳定性和真正的增量价值;
- 设计离线/在线一致性测试与监控。
1. 选择目标不是“列越少越好”
特征选择可能服务于不同目标:
- 降低采集、计算和在线延迟成本;
- 减少高维噪声和过拟合;
- 提高可解释性或满足合规约束;
- 消除预测时不可得、不稳定或冗余的输入。
先确定约束,再比较方案。不存在“样本数必须是特征数十倍”的通用法则:可识别性取决于模型、正则化、稀疏性、噪声、相关结构和验证设计。
2. 三类选择方法
过滤式
按缺失率、近零方差、相关性或单变量统计量筛选,计算便宜,但忽略特征组合。任何使用标签的评分都必须在训练折内计算。
包裹式
递归消除、顺序选择等反复训练模型,以验证表现选择子集。能考虑模型交互,但计算昂贵,候选多时容易对验证过程过拟合。
嵌入式
Lasso、树的分裂和某些稀疏模型在拟合时完成选择。结果依赖模型偏好:lasso 在相关特征间可能不稳定,树的重要性也不等于因果作用。
领域审查是第四道门:合法但昂贵、难以解释或可能编码敏感属性的特征,不能只凭分数进入生产。
3. 选择必须在交叉验证内部
先在全数据中挑出“与标签最相关的 20 列”,再做交叉验证,验证折标签已经参与选列。正确做法是把选择器放进 pipeline:
from sklearn.feature_selection import SelectKBest, mutual_info_classif
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
candidate = Pipeline([
("preprocess", preprocess),
("select", SelectKBest(mutual_info_classif, k=20)),
("model", LogisticRegression(max_iter=1000)),
])若还要搜索 k、编码方法和模型超参数,它们都属于内层选择。最终性能应用外层交叉验证或未参与选择的测试集估计。
4. 检查稳定性与增量价值
单次被选中不代表可靠。记录不同时间窗口、bootstrap 样本或交叉验证折中的:
- 入选频率;
- 系数方向和范围;
- permutation importance 的分布;
- 加入/移除后的验证指标变化;
- 对延迟、成本和群体误差的影响。
高度相关的替代特征会互相抢占重要性。可以按语义分组评估,而不是把某一列的偶然胜出解释成唯一机制。
5. 一份可执行的特征定义
生产特征需要的不只是 SQL 片段:
name: team_supply_count_7d
entity: team_id
value_type: int64
event_source: confirmed_supply_events
event_time: confirmed_at
available_time: ingested_at
window: "(cutoff - 7d, cutoff]"
default: 0
freshness_slo: 15m
owner: logistics-data
version: 3定义还应绑定代码版本、依赖数据、权限、废弃计划和允许的使用场景。特征仓库可以帮助注册、物化和复用,但不会自动保证定义正确。
6. 离线与在线为何会偏斜
常见 training-serving skew 包括:
- 训练用批处理 SQL,线上用另一份应用代码;
- 两边时区、窗口边界或舍入规则不同;
- 离线数据已回填,线上当时看到的是迟到前状态;
- 类别词表、填充值和缩放参数版本不同;
- 在线查不到值时使用了未记录的默认值。
优先复用同一转换产物或同一声明式定义。无法共用执行引擎时,至少用固定样本做 parity test:给定实体与 cutoff,两条路径应得到相同结果或在明确容差内一致。
7. 上线前的验证
历史回放
按过去每个预测时点重建当时可见数据,不使用后来回填的真相快照。
阴影运行
新特征在线计算但不参与决策,对比分布、延迟、缺失和可用率。
契约测试
检查类型、范围、唯一性、窗口边界、默认值和未知类别行为。
可回滚发布
特征版本与模型版本绑定;旧版本保留到模型停止使用,不能在原定义上静默改语义。
8. 监控三类变化
数据质量
缺失率、未知类别率、重复实体、延迟、刷新失败和范围违规。
分布与一致性
线上/离线差异、分位数、类别占比、漂移统计和按群体分布。漂移是调查信号,不自动等于模型失效。
模型关联
特征覆盖、预测质量、校准、群体误差以及标签延迟后的真实表现。某特征分布稳定,也可能失去与标签的关系。
告警要绑定负责人、处置步骤和 fallback,例如使用上一个成功快照、降级模型或停止自动决策。
9. 特征评审清单
[ ] 预测时合法且可获得
[ ] 实体、时间与窗口边界明确
[ ] 转换和选择只在训练折拟合
[ ] 验证切分符合上线场景
[ ] 增量收益超过计算与治理成本
[ ] 离线/在线 parity test 通过
[ ] 默认值、未知值和迟到数据策略明确
[ ] 版本、负责人、监控和回滚路径齐全常见误区
- 模型能自动忽略无用特征:无关或泄漏特征仍会增加方差、成本与风险。
- 选择后再交叉验证就客观:选择本身已经用过标签。
- 有了 feature store 就一致:工具不能修复错误窗口和双份实现。
- 分布漂移就是立即重训:先判断数据故障、季节变化还是关系失效。
练习
- 把一个标签相关筛选器移入 pipeline,比较修复前后的交叉验证分数。
- 对 10 次重采样记录特征入选频率,解释不稳定来源。
- 为一个滚动特征写 YAML 定义和五个边界测试。
- 设计训练/服务偏斜监控,并为三类告警规定降级动作。
小结
特征选择是模型选择流程的一部分,不能提前偷看验证答案;生产特征则是一套带时间语义、版本和运维责任的接口。真正可用的特征,不只提升离线分数,还能在预测现场被相同地重建。
下一章转向抽样与因果推断:即使特征和模型都可靠,观察到的样本仍可能无法代表目标总体,相关关系也未必支持行动。