在机器学习项目中,算法决定下限,数据和特征决定上限。很多模型效果不佳,并不是因为算法不够先进,而是因为样本定义混乱、标签不稳定、特征质量差、训练和线上口径不一致,或者评估集中混入了未来信息。

特征工程的本质,是把业务世界中的原始信息转化为模型更容易学习的表达;数据治理的本质,是让这些表达可信、可复现、可追踪、可持续维护。二者结合,才是机器学习长期可用的基础。

一、样本构建:先定义一条样本是什么

特征工程之前,必须明确样本粒度。不同粒度会产生完全不同的问题定义。

例如在电商场景中:

  • 用户粒度:预测某个用户是否会流失。
  • 用户-商品粒度:预测某个用户是否会购买某个商品。
  • 订单粒度:预测某笔订单是否存在风险。
  • 会话粒度:预测本次访问是否会转化。
  • 曝光粒度:预测某次推荐曝光是否会点击。

样本粒度决定特征聚合方式、标签定义和评估方法。如果样本粒度不清晰,后续所有处理都会摇摆。

一个样本通常至少包含:

  • 主键:如 user_id、order_id、session_id。
  • 预测时间点:模型在这个时间点做判断。
  • 特征窗口:预测时间点之前可使用的数据范围。
  • 标签窗口:预测时间点之后用于判断结果的数据范围。
  • 标签值:分类、回归或排序目标。

例如“预测用户未来 7 天是否购买”的样本可以定义为:以每天 0 点为预测时间点,使用过去 30 天行为作为特征窗口,使用未来 7 天是否下单作为标签窗口。这样定义后,训练样本才具有一致的时间语义。

二、数据质量:模型不会自动理解脏数据

模型可以容忍一定噪声,但不能替团队理解数据。常见数据质量问题包括:

  • 缺失值:字段为空、采集失败、业务流程未覆盖。
  • 异常值:年龄为 999、金额为负数、访问次数极端大。
  • 重复数据:事件重复上报、订单重复同步。
  • 枚举漂移:设备类型、渠道来源出现新取值。
  • 口径变化:字段含义被业务系统调整。
  • 时间错乱:事件时间和入库时间混用。
  • 标签错误:人工标注错误、规则变化、延迟回流。

数据质量处理不应只靠建模脚本临时修补,而应形成数据校验规则。例如每天检查字段缺失率、唯一值数量、数值范围、分布漂移、主键重复率和标签比例。如果某个关键字段突然缺失 80%,应在训练前失败,而不是默默训练出一个异常模型。

三、缺失值处理:缺失本身也是信息

缺失值处理不能机械地统一填 0。缺失的原因不同,处理方式也不同。

常见策略包括:

  • 删除样本:适合缺失比例极低且缺失随机的情况。
  • 常数填充:如未知类别填 unknown,数值填 0 或 -1。
  • 统计填充:均值、中位数、众数。
  • 分组填充:按城市、品类、用户类型分别填充。
  • 模型填充:用其他字段预测缺失值。
  • 缺失指示变量:额外增加 is_missing 特征。

在很多业务中,缺失本身具有含义。例如用户没有填写生日,可能代表活跃度低;没有历史购买记录,可能是新用户;某个风控字段缺失,可能来自特定渠道。此时增加缺失指示变量比简单填补更有效。

需要注意的是,所有从数据中学习出来的填充值都必须只在训练集上计算,再应用到验证集、测试集和线上数据。不能用全量数据计算均值后再切分,否则会泄漏测试集信息。

四、异常值处理:区分错误和真实极端行为

异常值不一定是错误。一个用户一天购买 100 件商品可能是数据问题,也可能是企业采购。处理异常值时,应该先结合业务语义判断。

常见处理方式包括:

  • 截断:把超过上分位数的值压到阈值。
  • 分箱:将连续数值映射到区间。
  • 对数变换:压缩长尾分布,如金额、访问次数。
  • 鲁棒缩放:使用中位数和四分位距减少极端值影响。
  • 单独标记:为极端值增加指示变量。
  • 回源修复:如果是采集错误,应在数据源修复。

对树模型而言,异常值影响通常小于线性模型;对神经网络和线性模型而言,异常值可能显著影响梯度和权重。因此数据处理要结合模型类型。

五、数值特征:缩放、变换与分箱

数值特征常见处理包括标准化、归一化、对数变换和分箱。

标准化将特征转换为均值 0、标准差 1,适合线性模型、SVM、KNN、神经网络等对尺度敏感的模型。归一化将特征压到固定区间,适合距离度量或神经网络输入。树模型通常不要求标准化,因为它基于阈值切分。

对数变换适合长尾分布。例如收入、消费金额、访问次数常常呈现少数极大值。使用 log1p(x) 可以压缩极端差异,让模型更容易学习。

分箱可以把连续变量转成离散区间。例如年龄分成 18 岁以下、18 到 24、25 到 34 等。分箱的好处是增强非线性表达,降低异常值影响;缺点是损失精细信息。线性模型常通过分箱获得更强表达,树模型则通常可以自动学习切分点。

六、类别特征:编码方式决定可学习性

类别特征不能直接作为字符串交给大多数传统模型,需要编码。

常见编码方法包括:

编码方式 说明 适用场景
One-Hot 每个类别一个二值维度 低基数类别
Ordinal 类别映射为整数 有自然顺序的类别
Count/Frequency 用出现次数或频率表示 高基数类别
Target Encoding 用目标均值编码类别 高基数,需防泄漏
Embedding 学习低维稠密向量 深度模型、大规模类别

One-Hot 简单可靠,但类别数量太多时会导致维度爆炸。Target Encoding 对高基数类别很有效,但最容易产生数据泄漏。正确做法通常是在交叉验证折内计算编码:每个样本的编码不能使用它自己的标签信息。

线上服务还要考虑未知类别。训练时没见过的新城市、新渠道、新商品,如果编码器不能处理,就会导致推理失败。工程上应设置 unknownhandle_unknown 策略。

七、时间窗口特征:让模型理解近期和长期行为

很多业务特征都与时间有关。相比简单累计值,窗口特征更能反映行为变化。

常见时间窗口包括:

  • 近 1 天、7 天、30 天访问次数。
  • 近 7 天消费金额与近 30 天消费金额。
  • 最近一次登录距今天数。
  • 用户注册到当前的生命周期长度。
  • 近 7 天点击率相对近 30 天点击率的变化。
  • 最近 N 次行为的类别分布。

窗口特征的关键是严格以预测时间点为边界。预测时间点之后发生的行为不能进入特征。对于回填历史样本,应模拟当时的线上预测状态,而不是使用当前数据库中的最新字段。

时间特征还可以表达周期性,例如小时、星期、月份、节假日。对周期变量,直接使用整数可能让模型误解距离。例如星期日和星期一在数值上相差 6,但实际相邻。可以用正弦和余弦编码周期:

1
2
3
4
import numpy as np

df["hour_sin"] = np.sin(2 * np.pi * df["hour"] / 24)
df["hour_cos"] = np.cos(2 * np.pi * df["hour"] / 24)

八、数据泄漏:机器学习中最隐蔽的高危问题

数据泄漏指训练过程中使用了预测时不可获得的信息,导致离线评估过于乐观,线上效果显著下降。

常见泄漏类型包括:

  • 未来信息泄漏:使用预测时间之后产生的字段。
  • 标签泄漏:特征中直接或间接包含标签。
  • 预处理泄漏:在切分数据前对全量数据做标准化、特征选择。
  • 重复样本泄漏:同一用户或同一实体同时出现在训练集和测试集。
  • 时间切分错误:随机切分破坏真实时间顺序。
  • 目标编码泄漏:编码时使用了验证或测试样本标签。

防止泄漏的实践原则:

  1. 先切分训练、验证、测试,再拟合任何预处理器。
  2. 所有聚合特征都以预测时间点为上限。
  3. 使用 Pipeline 管理预处理和模型。
  4. 对用户级、设备级、订单级重复样本做分组切分。
  5. 对时间敏感任务优先使用时间切分。
  6. 用错误分析检查“过于完美”的特征。

如果某个模型指标突然异常好,要先怀疑数据泄漏,而不是先庆祝。

九、特征选择:不是特征越多越好

更多特征不一定带来更好模型。冗余、噪声、泄漏和不稳定特征都会伤害泛化。

常见特征选择方法包括:

  • 业务筛选:剔除预测时不可用、含义不稳定、维护成本过高的字段。
  • 缺失率筛选:剔除缺失率过高且无业务意义的字段。
  • 方差筛选:剔除几乎不变化的字段。
  • 相关性筛选:剔除高度重复的特征。
  • 模型重要性:使用树模型、L1 正则等评估贡献。
  • 递归特征消除:逐步移除低价值特征。
  • 置换重要性:打乱某个特征,观察指标下降。

特征选择要放在验证流程内部完成。不能先用全量数据选出“最相关特征”,再切分训练和测试,因为这已经让测试集参与了建模决策。

十、特征平台与数据治理

当机器学习项目增多后,特征会出现重复建设、口径不一致、难以复用的问题。特征平台或特征仓库的目标,是集中管理特征定义、计算、存储、服务和监控。

一个成熟特征体系通常具备:

  • 特征注册:记录名称、含义、负责人、版本。
  • 离线计算:为训练生成历史特征。
  • 在线服务:为实时推理提供低延迟特征。
  • 口径一致:同一特征离线和在线逻辑一致。
  • 数据校验:缺失率、分布、范围、枚举自动检测。
  • 血缘追踪:知道特征来自哪些表和字段。
  • 权限控制:敏感数据可审计、可授权。
  • 复用机制:不同模型共享稳定特征。

特征平台不是大公司才需要的奢侈品。即使是小团队,也可以先从特征文档、统一 SQL、统一 Pipeline、数据质量检查和版本记录开始,逐步提高治理能力。

十一、一套实用检查清单

训练模型前,可以用下面的清单检查特征和数据:

  • 样本粒度是否明确?
  • 标签窗口和特征窗口是否分离?
  • 所有特征在预测时是否可获得?
  • 是否按任务特点选择了随机切分、分组切分或时间切分?
  • 缺失值处理是否只在训练集上拟合?
  • 类别编码是否能处理未知类别?
  • 高基数类别是否避免了目标编码泄漏?
  • 聚合特征是否严格限制在预测时间之前?
  • 是否记录了数据版本和特征版本?
  • 是否对关键字段做了质量校验?
  • 是否检查了特征分布在训练集和测试集之间的差异?
  • 是否删除了明显的标签泄漏字段?

结语

特征工程不是简单地“多造几个字段”,数据治理也不是文档工作。它们共同决定了机器学习系统能否从实验走向生产,能否在业务变化后继续可靠运行。

一个模型如果依赖不稳定、不可解释、不可复现的特征,即使短期指标很好,也很难长期维护。专业的机器学习实践应该把数据和特征当作一等公民:有定义、有版本、有质量检查、有责任人、有监控、有回滚方案。只有这样,模型效果才不是偶然,迭代才有坚实基础。

机器学习专题阅读路径

这篇文章属于 机器学习专题:从算法基础到工程落地。建议按下面的顺序继续阅读:

  1. 机器学习工程全流程:从业务问题到可持续上线的系统方法
  2. 监督学习核心算法详解:从线性模型到集成学习的实践指南
  3. 深度学习基础详解:神经网络、反向传播与优化实践
  4. 特征工程与数据治理:决定机器学习上限的关键能力
  5. 模型评估、可解释性与风险治理:把机器学习做成可信系统

参考资料