3. 流式学习基础概念
在进入 River 的代码实战之前,我们必须先把几个高频术语的边界划清楚。很多初学者会把“在线学习”“增量学习”“实时预测”混为一谈,结果在模型选型、数据管道设计和评估方式上连续踩坑。本节的目标不是背定义,而是建立一张能指导工程决策的概念地图:什么场景该用哪种学习范式,批处理与流式处理的本质差异在哪里,以及概念漂移为什么是流式学习绕不开的核心挑战。
一、核心原理:四种范式的本质差异
在线学习(Online Learning)强调模型按样本到达顺序逐条更新,每来一个样本就做一次“预测—损失计算—参数更新”的闭环。它的关键特征是:模型始终可用、内存占用与历史数据量无关、能持续适应新数据。在线学习不要求数据分布稳定,因此天然适合非平稳环境。
增量学习(Incremental Learning)更强调“在已有模型基础上扩展能力”,典型场景是新增类别、新增特征或新增任务时,不遗忘旧知识。它关注的是知识累积,而在线学习关注的是逐样本适应。两者常一起出现,但目标不同:在线学习可以完全遗忘旧分布,增量学习则要尽量保留旧能力。
概念漂移(Concept Drift)指输入与输出之间的映射关系随时间发生变化。比如“用户点击广告的概率”会因季节、促销、竞品动作而改变。漂移分为突变型、渐变型、周期型和重复型。流式学习系统必须具备检测或适应漂移的能力,否则模型会悄悄失效。
实时预测与批处理的区别不在模型本身,而在数据到达方式与决策时限。批处理是“先攒数据、再训练、再批量打分”,实时预测是“数据一到就打分,模型可同步更新”。前者追求吞吐与全局最优,后者追求低延迟与持续适应。
二、方法流程:从数据到决策的闭环
一个典型的流式学习闭环包含五个环节,理解这个流程有助于你在 River 中定位每个 API 的职责:
- 数据接入:从 Kafka、WebSocket 或文件流中逐条读取样本,形成
(x, y)序列。 - 预测:用当前模型对
x输出预测y_hat,此时模型尚未看到真实标签。 - 损失计算:真实标签
y到达后,计算损失,如对数损失或均方误差。 - 模型更新:调用
learn_one(x, y)更新参数,完成一次在线学习。 - 漂移监控:持续统计误差、数据分布或特征重要性,触发告警或重置策略。
在 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 次预测的准确率,若连续下降超过阈值,则提高学习率或切换至滑动窗口训练。
learn_one 足够轻量,但生产环境仍需考虑并发与状态一致性。四、误区/复盘:常见认知陷阱
| 误区 | 正确理解 |
|---|---|
| 在线学习等于实时预测 | 在线学习描述模型更新方式,实时预测描述决策时限,两者可独立存在。 |
| 增量学习一定不会遗忘 | 朴素增量更新仍可能灾难性遗忘,需配合回放、正则或架构隔离。 |
| 概念漂移只发生在突变场景 | 渐变漂移更隐蔽,模型性能缓慢下降,往往比突变更难发现。 |
| 流式评估可以用留出集 | 流式场景必须用前向评估(prequential),否则会引入未来信息。 |