趋近智
生产环境中模型默默退化的主要原因是训练-服务偏差。训练和推理环境之间数据处理的这种差异,造成了模型在实验室环境中的表现与在提供实时预测时的实际效果之间的差距。特征存储是一个专门的数据系统,旨在通过创建一个集中式、带版本管理且支持双向访问的机器学习特征库来弥合这一差距。
特征存储不仅仅是一个数据库。它是一种架构模式,系统地将特征工程与模型训练和模型服务分离。它为特征定义和特征值提供了单一真实来源,确保用于生成训练数据集特征的精确相同转换逻辑,也应用于在线推理时的低延迟查找。这严格执行了以下原则:用于训练的特征向量 f(x训练) 与服务时使用的特征向量 f(x服务) 生成方式完全一致。
生产级特征存储由多个相互关联的组件构成,每个组件在特征生命周期中都有其明确的用途。理解这种架构是实施或选择适合您MLOps平台解决方案的基础。
特征存储架构中的数据流。原始数据由转换作业处理,这些作业向用于训练的离线存储和用于服务的在线存储填充数据。特征注册表管理定义,确保所有消费者的数据一致性。
让我们详细分析每个组件:
创建训练数据的一个重要难题是数据泄露,即来自未来的信息无意中影响了训练样本。例如,如果您正在构建预测客户流失的模型,则不得使用在该客户流失状态记录日期之后生成的特征。
特征存储通过促成时间点连接来解决此问题。当您请求训练数据集时,您提供实体列表(例如,customer_id)以及每个观察值对应的时间戳。特征存储的检索逻辑查询离线存储,以查找在每个指定时间戳或之前有效的最新特征值。
例如,要在2023-01-15为customer_123生成训练行,系统将检索avg_monthly_spend在该日期时的值,忽略在2023-01-16或之后发生的任何更新。这阻止模型从未来信息中学习,并确保训练环境准确地模拟预测时刻可用的数据。
集成特征存储时,您面临经典的“自建”还是“购买”的决策。
Feast中一个简单的特征定义可能如下所示:
# feature_repo/ 目录中的特征视图
from feast import Entity, FeatureView, Field, FileSource
from feast.types import Float32, Int64
from datetime import timedelta
# 定义一个我们要计算特征的实体
driver = Entity(name="driver_id", description="司机的ID")
# 定义我们原始数据的来源
driver_stats_source = FileSource(
path="data/driver_stats.parquet",
timestamp_field="event_timestamp",
created_timestamp_column="created",
)
# 定义特征视图,它将相关特征分组
driver_stats_fv = FeatureView(
name="driver_hourly_stats",
entities=[driver],
ttl=timedelta(days=1),
schema=[
Field(name="conv_rate", dtype=Float32),
Field(name="acc_rate", dtype=Float32),
Field(name="avg_daily_trips", dtype=Int64),
],
online=True,
source=driver_stats_source,
tags={"team": "driver_performance"},
)
这种声明式方法将特征逻辑与应用程序代码分离。应用此定义后,可以使用Feast的CLI或客户端库,将这些特征从 FileSource(离线)实例化到已配置的在线存储中,使其可用于训练集生成和在线服务,并保证一致性。通过集中管理此逻辑,特征存储成为您生产ML平台的数据支柱,提高可靠性并加速模型开发周期。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造