3. 流式学习基础概念

在进入 River 的代码实战之前,我们必须先把几个高频术语的边界划清楚。很多初学者会把“在线学习”“增量学习”“实时预测”混为一谈,结果在模型选型、数据管道设计和评估方式上连续踩坑。本节的目标不是背定义,而是建立一张能指导工程决策的概念地图:什么场景该用哪种学习范式,批处理与流式处理的本质差异在哪里,以及概念漂移为什么是流式学习绕不开的核心挑战。

一、核心原理:四种范式的本质差异

在线学习(Online Learning)强调模型按样本到达顺序逐条更新,每来一个样本就做一次“预测—损失计算—参数更新”的闭环。它的关键特征是:模型始终可用、内存占用与历史数据量无关、能持续适应新数据。在线学习不要求数据分布稳定,因此天然适合非平稳环境。

增量学习(Incremental Learning)更强调“在已有模型基础上扩展能力”,典型场景是新增类别、新增特征或新增任务时,不遗忘旧知识。它关注的是知识累积,而在线学习关注的是逐样本适应。两者常一起出现,但目标不同:在线学习可以完全遗忘旧分布,增量学习则要尽量保留旧能力。

概念漂移(Concept Drift)指输入与输出之间的映射关系随时间发生变化。比如“用户点击广告的概率”会因季节、促销、竞品动作而改变。漂移分为突变型、渐变型、周期型和重复型。流式学习系统必须具备检测或适应漂移的能力,否则模型会悄悄失效。

实时预测与批处理的区别不在模型本身,而在数据到达方式与决策时限。批处理是“先攒数据、再训练、再批量打分”,实时预测是“数据一到就打分,模型可同步更新”。前者追求吞吐与全局最优,后者追求低延迟与持续适应。

流式学习核心概念关系图 在线学习 逐样本更新 内存恒定 持续可用 增量学习 知识累积 抗遗忘 扩展新类/新特征 概念漂移 突变/渐变/周期 映射关系变化 需检测与适应 实时预测 低延迟 边到边打分 模型可同步更新 批处理 先攒数据 → 再训练 → 批量打分 追求吞吐与全局最优 模型更新周期长 流式处理 数据一到 → 立即打分 → 同步更新 追求低延迟与持续适应 模型始终在线

二、方法流程:从数据到决策的闭环

一个典型的流式学习闭环包含五个环节,理解这个流程有助于你在 River 中定位每个 API 的职责:

  1. 数据接入:从 Kafka、WebSocket 或文件流中逐条读取样本,形成 (x, y) 序列。
  2. 预测:用当前模型对 x 输出预测 y_hat,此时模型尚未看到真实标签。
  3. 损失计算:真实标签 y 到达后,计算损失,如对数损失或均方误差。
  4. 模型更新:调用 learn_one(x, y) 更新参数,完成一次在线学习。
  5. 漂移监控:持续统计误差、数据分布或特征重要性,触发告警或重置策略。

在 River 中,这个闭环被抽象为极简的 API:

from river import linear_model, metrics

model = linear_model.LogisticRegression()
metric = metrics.Accuracy()

for x, y in stream:
    y_pred = model.predict_one(x)      # 预测
    metric.update(y, y_pred)           # 评估
    model.learn_one(x, y)              # 更新

注意顺序:先预测、再评估、后更新。如果先更新再预测,就会造成“用未来信息预测过去”的数据泄漏,评估结果会虚高。

三、案例/场景:电商点击率预测

假设你在做一个电商首页的点击率预测系统。用户每次刷新页面产生一条曝光记录,包含用户特征、商品特征和上下文特征。业务要求:曝光后 50 毫秒内给出点击概率,用于决定是否展示该商品。

  • 批处理方案:每天凌晨用前一天全量数据训练模型,白天用固定模型打分。问题是:上午爆款商品下午可能已过时,模型无法感知。
  • 在线学习方案:用户点击后立即用这条样本更新模型,模型随流量实时演化。50 毫秒内完成预测,更新异步进行。
  • 概念漂移应对:监控最近 1000 次预测的准确率,若连续下降超过阈值,则提高学习率或切换至滑动窗口训练。
在真实系统中,预测与更新往往解耦:预测走低延迟在线服务,更新走异步流处理管道。River 的 learn_one 足够轻量,但生产环境仍需考虑并发与状态一致性。

四、误区/复盘:常见认知陷阱

误区 正确理解
在线学习等于实时预测 在线学习描述模型更新方式,实时预测描述决策时限,两者可独立存在。
增量学习一定不会遗忘 朴素增量更新仍可能灾难性遗忘,需配合回放、正则或架构隔离。
概念漂移只发生在突变场景 渐变漂移更隐蔽,模型性能缓慢下降,往往比突变更难发现。
流式评估可以用留出集 流式场景必须用前向评估(prequential),否则会引入未来信息。
最常见的工程错误是:用批处理的评估思维去衡量流式模型。比如先在全量数据上训练,再在测试集上评估,这完全掩盖了模型在时间维度上的适应能力。正确的做法是让模型按时间顺序逐条预测并更新,累计计算指标。