趋近智
许多机器学习模型,特别是处理序列或时间序列数据的模型,从特定时间间隔内聚合的特征中获得显著的预测能力。例如,欺诈检测(过去一小时内用户交易频率)、推荐系统(上一会话中查看的商品)或物联网分析(过去5分钟内的平均传感器读数)等应用。高效、准确地实现这些时间窗口聚合,尤其是在处理大量数据和低延迟需求时,会带来巨大的工程挑战。本节主要讨论在特征存储背景下计算这些特征的可扩展技术。
时间窗口聚合根据时间对数据进行分组,并对每个窗口内的元素应用聚合函数(例如,计数、求和、平均值、最大值、最小值)。主要的窗口类型包括:
[0:00-1:00)、[1:00-2:00)、[2:00-3:00) 等。每个事件都恰好属于一个窗口。[0:00-1:00)、[0:15-1:15)、[0:30-1:30) 等窗口。事件可以属于多个窗口。用于聚合的不同类型时间窗口。滚动窗口是离散的,而滑动窗口则重叠。
时间窗口聚合中一个基本要点,特别是在处理流数据时,是区分:
"依赖处理时间更简单,但如果数据到达或处理存在延迟,可能导致结果不准确。对于大多数旨在捕获行为的机器学习特征,事件时间处理是必要的。然而,这带来了处理迟到数据的复杂性:即在相应时间窗口理论上关闭后才到达的事件。"
水印是流处理中管理迟到数据的一种常用技术。水印是一种启发式阈值,表示系统预期不再有早于特定时间 T 的事件。在 T 之前结束的窗口可以被认为是完整的,并最终用于聚合。水印通常根据观察到的事件时间推进,允许对迟到数据有一定的容忍度。
大规模计算时间窗口聚合通常涉及对历史数据进行批处理或进行实时流处理。
模型训练或周期性批处理预测所需的聚合通常可以使用Apache Spark或Apache Flink等批处理框架在批处理模式下计算。这通常涉及从离线特征存储(例如,S3、GCS、ADLS等数据湖,或BigQuery、Snowflake、Redshift等数据仓库)读取大量历史数据。
处理流程:
user_id、device_id)进行。示例 (Spark SQL):
SELECT
user_id,
window.end AS feature_timestamp,
AVG(transaction_amount) AS avg_txn_amount_7d
FROM
transactions
GROUP BY
user_id,
-- 根据事件时间定义一个7天滚动窗口
window(event_timestamp, "7天")
优点:
缺点:
对于需要低延迟(例如,用于实时预测)的特征,流处理不可或缺。Apache Flink、Spark Streaming或Kafka Streams等引擎可以在事件到达时计算聚合。
处理流程:
示例 (Flink DataStream API):
// 简化的Flink示例
DataStream<Transaction> transactions = env.addSource(...);
DataStream<AggregatedFeature> aggregatedFeatures = transactions
.keyBy(transaction -> transaction.getUserId())
.window(TumblingEventTimeWindows.of(Time.days(7)))
.aggregate(new AverageTransactionAmount()); // 自定义聚合函数
// 将特征写入在线/离线存储
aggregatedFeatures.addSink(...);
状态管理: 聚合的流处理本质上是有状态的。系统必须为每个键和活动窗口维护中间结果(例如,用于计算平均值的当前总和和计数)。大规模可靠、高效地管理此状态非常重要。
优点:
缺点:
Lambda或Kappa等架构有时会被采用。一种常见模式是使用流处理为在线存储提供低延迟特征,并使用单独的、可能更复杂或经过修正的批处理流程为离线存储和模型训练生成特征。确保这些路径之间的一致性需要仔细设计和验证(将在第3章进一步讨论)。
无论采用何种方法(批处理或流处理),有几个因素会影响可扩展性:
大规模实现准确的时间窗口聚合需要细致的工作:
entity_id。entity_id和feature_timestamp(通常是窗口结束时间)作为键,确保训练集生成的时间点正确性。正确且高效地实现时间窗口聚合是成熟特征工程系统的特点。通过仔细选择计算策略(批处理、流处理或混合)、有效管理状态以及侧重于事件时间准确性,您可以直接从特征存储基础设施为您的机器学习模型提供功能强大且及时的特征。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造