Feature Store
特征库用于定义、存储和提供机器学习特征,使训练和在线预测使用相同的值,并提供离线和在线存储。
特征存储是一个数据系统,用于定义、计算、存储和提供机器学习模型的输入特征,让模型在训练时看到的特征值与实时预测时看到的特征值相同。一个特征就是一个模型输入,例如某张卡片过去一小时的交易次数、某个产品的平均评分,或图像的嵌入。特征存储会将每个特征的定义及其完整历史记录保存在离线存储中,用于构建训练集;同时将最新值保存在在线存储中,以便预测时快速查询。Uber 在 2017 年介绍米开朗基罗机器学习平台的文章中描述了共享特征存储。此后,Gojek 与 Google Cloud 合作推出了开源特征存储 Feast;Amazon SageMaker、Google Vertex AI、Azure Machine Learning 和 Databricks 也相继推出托管特征存储。
特征存储库的工作原理#
特征最初来自原始事件和数据表,数据管道通过特征工程(例如统计一小时滑动窗口内某张卡片的交易次数)或通过神经网络进行特征提取,将其转换为模型输入。特征存储会将这些工作组织为几个组件:
- 特征注册表:每个特征的名称、实体键(该特征描述的客户、卡片、产品或摄像机)、数据类型、转换代码、负责人和版本都可供搜索,方便团队复用特征,而不是重新构建。
- 离线存储:保存在数据仓库或数据湖中的所有历史值及其事件时间戳,用于构建训练集和运行批量评分。
- 在线存储:以 Redis 或 DynamoDB 等键值数据库保存每个实体的最新值,并在推理时于几毫秒内读取。
- 物化:通过批处理或流式作业计算新值,并将离线存储中最新的值复制到在线存储。
在预测时,欺诈检查等服务会发送卡片 ID,从在线存储中获取该卡片当前的特征,再将特征传递给模型,从而将推理延迟保持在足够低的水平,以支持结账时的实时推理。
时点正确性#
每条训练样本都必须使用其标注事件发生时的特征值。之后计算出的值会携带未来信息,这是一种 数据泄漏,会让模型在线下评估中看起来很准确,却在生产环境中失效。特征存储通过 时点连接 来避免这种情况:针对同一实体,将每个标签与时间戳不晚于该标签时间戳的最新特征值进行匹配。pandas 函数 merge_asof 可执行相同的连接:
import pandas as pd
# 离线存储:随时间记录每张卡过去一小时的交易次数
features = pd.DataFrame(
{
"card_id": ["A", "B", "A", "A"],
"time": pd.to_datetime(["2026-10-01 09:00", "2026-10-01 10:00", "2026-10-01 12:00", "2026-10-01 15:00"]),
"txn_count_1h": [1, 2, 4, 9],
}
)
# 用于训练的标注事件:每笔交易是否为欺诈?
labels = pd.DataFrame(
{
"card_id": ["B", "A"],
"time": pd.to_datetime(["2026-10-01 11:00", "2026-10-01 13:30"]),
"is_fraud": [0, 1],
}
)
# 时点连接:每个标签都会获得其卡片在事件发生时间或之前的最新特征值
training_rows = pd.merge_asof(labels, features, on="time", by="card_id")
print(training_rows)卡 A 在 13:30 的欺诈标签会接收 12:00 记录的计数 4,而交易发生后的 15:00 记录的计数 9 不会进入训练集。卡 B 在 11:00 的标签会接收自己的值 2,因为 by 参数会根据实体键匹配行。
训练与在线服务偏差#
训练与在线服务偏差是指模型训练时使用的特征与模型在生产环境中接收的特征之间存在差异。如果批处理 SQL 作业计算训练特征,而另行编写的应用代码计算在线服务特征,且两者在时区、窗口边界、单位或缺失值填补方式上不同,就会出现这种偏差。Google 的 机器学习规则 专门用一节讨论这种偏差,并建议记录在线服务时使用的特征,以便后续训练能准确使用这些值。特征存储通过根据同一份定义只计算一次特征,供训练和在线服务共同使用,从而消除重复的代码路径;它还会记录每项特征的新鲜度、缺失值和 数据漂移,让 模型监控 能追溯准确率下降是否源于输入异常。
特征存储与相关系统的比较#
- 数据湖: 以任意格式保存原始文件和处理后的文件。许多离线存储位于数据湖中,特征存储则在其基础上增加实体键、时间戳、时点检索和在线服务功能。
- 向量数据库: 查找与查询向量最相似的已存储嵌入。特征存储根据实体 ID 查找值,也可以将嵌入作为一项特征,与计数、平均值和类别等特征一同保存。
- 模型注册表: 对训练好的模型及其元数据进行版本管理,而特征存储则对这些模型使用的输入进行版本管理。
- 模型服务: 通过 API 运行模型,并调用在线存储,为每个请求获取特征。
计算机视觉特征#
视频分析将摄像头画面转化为特征,用于预测、异常检测 和 预测建模:例如商店入口每小时的访客人数、收银台的排队长度,或每条生产线的缺陷率;每项数据都以摄像头或生产线 ID 和时间戳为键。在 零售 场景中,人数统计 为人员配置和需求模型提供数据;在 制造业 场景中,每班次的缺陷数则为维护模型提供数据。Ultralytics YOLO 目标计数 可直接生成这类值:它会跨帧 跟踪 每个检测到的目标,并在目标越过线或区域时返回持续更新的 in_count 和 out_count 总数及各类别计数,可直接作为带时间戳的摄像头数据写入特征存储。










