公司动态
【机器学习】(38)—— 特征变换的时机与训练
文章目录1. 原始数据还要先变成特征2. 训练前完成变换3. 训练过程中完成变换4. 训练—服务偏差的典型表现5. Z-score 与按批变换6. 汽车场景下的一致做法7. 核对清单与最小示例8. 能力边界与常见误区9. 术语与延伸阅读10. 小结与下一主题摘要原始数据进入模型前几乎总要做特征变换。变换可以发生在训练前也可以嵌在训练 / 服务路径里两种做法各有利弊。本文说明两种时机的取舍重点解释训练—服务偏差training-serving skew并用汽车重量标准化、品牌词表与工单文本清洗给出可复现的一致做法与核对清单。适合读完生产系统入门、准备上线特征管道的读者。1. 原始数据还要先变成特征第 37 篇把生产系统拆成数据采集、特征、模型、服务与监控。特征这一环的核心问题是变换写在哪里训练与推理是否走同一套逻辑。时机大致做法训练前变换离线管道把原始数据变成特征表 / 文件模型直接读入已变换结果训练中变换变换代码成为模型输入路径的一部分训练与推理共用同一段逻辑贯穿示例仍是汽车车重千克做标准化、品牌 ID 查 Embedding 词表、工单文本做清洗再编码。这些步骤在笔记本里很容易「先fit再训练」一旦训练脚本与在线服务拆成两套仓库就容易出现训练时看过的输入与线上真实喂给模型的输入不一致。前文见 【机器学习】37—— 生产环境中的机器学习系统。本篇把「特征能否与训练时一致」展开成可检查的工程选择题。2. 训练前完成变换训练前变换通常分两步先写管道或工具把原始数据变换好再把结果存到模型能读取的位置。优点说明变换可只做一次全量刷特征后多次实验可复用同一份特征表便于看全量统计均值、分位数、稀有类别占比可以基于更大窗口估计代价说明推理必须复现同变换服务侧要使用同一套均值、词表、清洗规则路径易分裂尤其是动态推理离线特征作业与在线预处理常常是两套代码静态推理有时能缓解一些问题若批量打标与训练共用同一管道生成特征再把预测写入缓存训练与「生成预测」两侧更容易对齐。但缓存刷新、特征版本升级时仍要把版本配对写清楚。汽车例子离线任务把全库车型的weight_kg标准化后写入特征表油耗模型只读标准化列。上线若有人「临时」用原始千克去调在线接口分数会整体错位——这不是模型突然变笨而是输入协议被改了。训练前变换还有一个隐蔽坑特征表很久不更新模型却按「当前业务语义」理解列名。例如列名仍叫weight_norm口径已从「按训练集 μ/σ」改成「按滚动 30 天 μ/σ」。文件还在含义已变偏差同样成立。因此物化特征时建议在元数据里写明统计窗口、生成时间与代码提交号。3. 训练过程中完成变换训练中变换把预处理嵌进模型输入图模型吃原始或近原始字段内部完成缩放、查表等步骤。优点说明训练与推理更易一致同一段变换代码随模型一起导出 / 部署改变换不必重刷全表仍可保留原始数据文件换逻辑后重训即可代价说明可能抬高推理延迟复杂清洗、多段查表都算在请求路径上每个 batch 都要变换吞吐与实现复杂度上升特别要注意依赖全局统计的变换不能只按当前 batch 现算。例如 Z-score 需要特征的均值与标准差若每个 batch 各自估计batch 之间数值含义会漂-2.5在 A 批与 B 批可能不是同一尺度。常见做法是在训练集上预先算好均值 / 标准差当作常量写进模型或配置训练与服务都引用同一组常量。这与专栏一贯要求一致缩放器、词表只在训练集上fit验证 / 测试 / 线上只transform。见 【机器学习】28—— 神经网络小结、【机器学习】32—— Embedding 串讲。4. 训练—服务偏差的典型表现**训练—服务偏差training-serving skew**指模型在训练时见到的特征分布或变换逻辑与上线服务时不一致从而导致离线指标好看、线上效果变差。常见分裂点例子单位 / 量纲训练用吨服务用千克统计量来源训练用训练集均值服务用「当天窗口」重算均值词表映射训练有 UNK服务把未见品牌映射成错误 ID 或直接丢弃文本清洗训练去了标点与大小写服务原样送入缺失填充训练填中位数服务填 0特征版本模型是 v3特征表仍是 v2 口径动态推理时风险通常更高训练管道与在线预处理更容易由不同人、不同语言实现。静态推理若全程复用同一离线作业偏差机会更少但「人工改了缓存表字段含义」仍会造成隐性偏差。可以把偏差理解成模型在用一套坐标系做决策线上却把点画到了另一套坐标系里。调学习率解决不了这类问题只能对齐变换与版本。一个可操作的发现办法是从线上抽样原始请求同时跑「训练管道的 transform」与「服务管道的 transform」比较向量差。若某一维长期差一个数量级优先怀疑单位若只有离散 ID 对不上优先怀疑词表若文本向量整体乱优先怀疑清洗与分词版本。5. Z-score 与按批变换数值特征常用 Z-scorez x − μ σ z \frac{x - \mu}{\sigma}zσx−μ符号含义x xx原始特征值例如车重千克μ \muμ参照均值应来自训练集统计σ \sigmaσ参照标准差同样应固定避免除零z zz标准化后的值若在训练循环里对每个 mini-batch 现算μ , σ \mu,\sigmaμ,σbatch 越小、越不稳定同一辆车在不同 batch 里的z zz可能跳变。更稳妥的路径是1. 仅在训练集上估计 μ、σ 2. 把 μ、σ 存进配置或模型附属文件 3. 验证、测试、在线服务都使用同一对 μ、σEmbedding 词表同理只在训练集定词表与 UNK服务不得偷偷扩展「今天新出现的品牌 ID」却不更新模型侧表除非你们明确设计了可在线扩展的流程并做了评估。6. 汽车场景下的一致做法特征更稳妥的一致做法车重 / 马力训练集算 μ、σ训练前写入特征表或训练中用常量缩放品牌 / 车型 ID训练集词表 UNK服务只查表不另写映射工单文本清洗与分词函数做成共享库训练与服务 import 同一版本可预打标字段静态推理离线管道生成特征并打标缓存带特征版本号新工单即时分类动态推理服务路径必须调用与训练相同的变换模块组合建议统计量大、可离线算清的变换可以训练前做但要把「参数文件」当作一等产物版本化。希望强一致、且变换不算太重优先训练中变换或「共享预处理库 两端调用」。无论哪种都要能回答这一版模型配对的是哪一版 μ/σ、词表与清洗规则。实践里也很常见第三种折中训练前物化「重」特征训练中只保留轻量、必须一致的步骤。例如品牌 Embedding 查表放在模型内而耗时的文本归一化结果先离线写好两端仍用同一清洗函数生成那一列避免「离线用 A 清洗、在线又用 B 清洗」。折中的关键仍是单一真相来源统计量、词表与清洗代码有明确版本而不是笔记本里各写一份。7. 核对清单与最小示例1. 标准化均值 / 方差是否只来自训练集并已版本化 2. 词表与 UNK 在服务侧是否同一映射 3. 单位与量纲在训练、服务文档中是否写死 4. 文本清洗 / 分词是否同一代码版本 5. 缺失填充默认值两侧是否一致 6. 模型版本与特征版本是否配对发布 7. 动态推理路径是否与训练预处理做过对照抽样 8. 静态缓存刷新后是否避免旧特征口径混入新模型概念示意用同一套统计量做训练侧与服务侧变换并做一次对照断言。fromdataclassesimportdataclassdataclass(frozenTrue)classStandardize:mean:floatstd:floatdeftransform(self,x:float)-float:denomself.stdifself.std1e-8else1e-8return(x-self.mean)/denom# 只允许来自训练集的统计量weight_scalerStandardize(mean1450.0,std220.0)deftrain_features(raw_weight:float)-float:returnweight_scaler.transform(raw_weight)defserve_features(raw_weight:float)-float:# 服务必须复用同一对象 / 同一配置而不是重新估均值returnweight_scaler.transform(raw_weight)assertabs(train_features(1670.0)-serve_features(1670.0))1e-12print(train/serve 对齐:,round(serve_features(1670.0),4))真正项目里断言应扩展到一批黄金样本同一原始行训练管道与服务管道输出的特征向量逐维比对。发现某一维系统性偏移优先查单位、默认值与词表而不是先加倍模型宽度。若暂时无法共用同一份 Python / C 库至少固定「交换契约」列出字段名、类型、单位、缺失约定与示例向量并在 CI 里用黄金样本对两端输出做数值比对。契约比口头约定「我们都做了标准化」可靠得多。8. 能力边界与常见误区情况说明全表先标准化再切分泄漏μ、σ 被验证 / 测试信息污染服务用「今日均值」重算 Z-score与训练坐标系不一致属于典型偏差以为静态训练就没有偏差推理路径仍可能复现失败以为训练中变换就零延迟代价复杂清洗仍会吃掉在线预算按 batch 现算全局统计尺度漂移优化不稳定特征表升级但模型未重训版本错配表现难解释只对准确率告警、不对特征分布告警偏差可能先表现为输入漂移适用前提团队能把预处理参数与代码纳入版本管理。若变换散落在笔记本单元格、一次性 SQL 与线上临时脚本里偏差几乎必然出现只是发现得早晚不同。也要承认边界有些业务特征本身就依赖「请求时刻」的上下文例如当前库存、当日活动价。这类特征不是靠 μ/σ 对齐能消掉的需要在训练数据里显式构造同时刻可用的字段并在服务侧保证能取到同定义的值否则看起来像变换偏差根因其实是标签与特征的时间对齐问题。9. 术语与延伸阅读术语含义特征变换 / 特征工程把原始字段变成模型可用输入的过程训练前变换先离线生成特征再交给训练训练中变换变换嵌在模型输入路径随推理一起执行训练—服务偏差训练与服务的数据变换或输入分布不一致Z-score 标准化按均值与标准差缩放数值特征特征版本变换口径与统计量的版本标识需与模型配对资源说明【机器学习】37—— 生产环境中的机器学习系统静态 / 动态训练与推理【机器学习】32—— Embedding 串讲词表与 UNK 纪律【机器学习】28—— 神经网络小结划分后 fit、验证纪律【机器学习】35—— 微调、蒸馏与提示离线推理与缓存10. 小结与下一主题特征变换时机可以概括为训练前变换适合全量统计、一次物化必须在服务侧严格复现并版本化参数。训练中变换更易保持训练—服务一致要注意延迟以及全局统计不能按 batch 乱估。训练—服务偏差是上线后「指标骗人」的常见根因对齐变换代码、统计量与特征版本比盲目换更大模型更优先。下一篇会进入部署测试上线前如何验证输入数据、特征工程、新模型质量、服务基础设施以及流水线组件之间的集成是否可靠。汽车例子会从「变换是否一致」扩展到「新版本能不能安全替掉旧版本」。系列导航上一篇【机器学习】37—— 生产环境中的机器学习系统下一篇预告部署测试如果本篇对你有帮助欢迎点赞、收藏、关注博主机器学习专栏持续更新中下次更新不迷路。