river
Python 流式机器学习库,用增量学习实现实时数据预测,无需批量训练
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Python 流式机器学习库,用增量学习实现实时数据预测,无需批量训练
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一座 24 小时运转的芯片制造工厂。质检环节不能等到一天结束才"批量复盘"——每一块走下生产线的芯片,都需要立刻被判断是否合格。如果用传统批量学习(batch learning)的思路,模型每天重新训练一次,那么下午 3 点的质检标准,可能和上午 9 点已经悄然漂移的设备状态完全脱节。
River 解决的就是这个问题:让机器学习模型像一条永不干涸的河流一样,持续接收新数据、实时更新自己,始终跟踪最新现实。
River 并非凭空诞生。它的前身是两座"小河"——creme(由 Max Halford 于 2017 年创建)和 scikit-multiflow(来自巴西 UFSC 大学研究团队)。2020 年,两个项目合并,River 正式出道,成为 Python 生态中专注于在线机器学习(Online Machine Learning / Streaming ML)的标杆项目。
项目作者 Max Halford 是一位来自法国的独立开发者,专注于算法工程化。River 的设计哲学深受 scikit-learn 影响——如果你会用 scikit-learn,River 的 API 几乎可以无缝上手,只是核心接口从 fit/predict 变成了 learn_one/predict_one。
目前 River 拥有超过 5800 颗 GitHub Stars、627 个 Fork,是该领域 Star 数最高的 Python 库,被广泛用于金融风控、工业 IoT、在线推荐、网络安全等需要实时决策的场景。
传统机器学习(batch learning)的工作模式是:收集一批数据 → 训练模型 → 部署 → 等待下次重新训练。而在线学习(online learning)的模式是:每来一条数据 → 更新模型 → 立刻产生预测。不需要积累一整批数据,不需要等待重新训练,模型始终是最新的。
这带来了三个关键优势:
River 的设计始终围绕一个核心挑战——概念漂移(Concept Drift)。以信用卡欺诈检测为例:疫情前正常的消费模式,疫情后可能突然失效;某电商平台推出新促销活动后,用户购买行为会系统性改变。River 内置了 ADWIN、Page-Hinkley、DDM 等多种漂移检测器,帮助开发者及时发现模型"过时",触发重新初始化或模型替换。
River 提供了一套完整的在线机器学习工具链,覆盖几乎所有主流 ML 任务:
| 类别 | 主要算法 |
|---|---|
| 分类 | 逻辑回归、朴素贝叶斯、感知机、Hoeffding 树 |
| 回归 | 线性回归、Hoeffding 回归树、KNN 回归 |
| 异常检测 | Half-Space Trees、STORM、OSVM |
| 漂移检测 | ADWIN、Page-Hinkley、DDM、HDDM |
| 聚类 | CluStream、Den-Stream、Stream K-Means |
| 推荐系统 | 协同过滤、矩阵分解 |
| 时间序列 | ARIMA 在线版本、Holt-Winters 指数平滑 |
| 特征工程 | 特征选择、特征提取、在线标准化 |
| 集成方法 | 在线 bagging、boosting、stacking |
代码示例——5 行代码实现实时分类:
from river import compose, linear_model, preprocessing, datasets, metrics
model = compose.Pipeline(
preprocessing.StandardScaler(),
linear_model.LogisticRegression()
)
metric = metrics.Accuracy()
for x, y in datasets.Phishing():
y_pred = model.predict_one(x) # 预测
metric.update(y, y_pred) # 更新指标
model.learn_one(x, y) # 学习(增量更新)
对比 scikit-learn 的等效批量学习写法,你会发现核心差异只在一个"one"字——learn_one 而非 fit。
River 的架构设计充分体现了"在线优先"的理念:
核心接口设计:所有估计器都继承自 base.Estimator,通过 learn_one(x, y) / predict_one(x) 实现增量学习。Transformer 类提供 learn_one / transform_one 进行特征转换。Pipeline 组合器支持 | 操作符链式调用,类似 Unix 管道。
Rust 加速层:对性能敏感的统计计算(如均值、方差、分位数、滚动窗口)使用 Rust 实现,通过 PyO3 绑定暴露给 Python。Cargo.toml 显示项目使用 nightly Rust 工具链,支持 Linux/macOS/Windows 多平台 wheels 自动构建。
两种学习模式:River 聪明地将接口分为无状态的核心在线接口(learn_one/predict_one,纯 Python + Numpy/Scipy,无 pandas 依赖)和可选的 mini-batch 接口(learn_many/predict_many,需要 pandas)。用户只需处理流数据时,不需要引入重量级的 pandas 依赖。
测试框架:river/checks/ 目录下有一套完整的估计器验证框架,新算法必须通过所有检查(克隆、序列化、特征鲁棒性等)才能合入主分支。doctest 直接在 README 中运行,确保文档和代码一致。
River 的安装极度简单——pip install river 即可获得预编译 wheels,支持 Python 3.11+,覆盖 Linux/macOS/Windows。源代码级安装需要 Cython + Rust 环境。
上手路径:
Pipeline + StandardScaler + LogisticRegression 组合完全熟悉局限性:
neural_net 模块),不擅长处理非结构化数据在边缘计算和实时决策需求爆发式增长的今天,River 的价值愈发凸显。IoT 传感器数据、金融市场高频数据、网络安全日志、用户行为流——这些数据的特点是"来得快、来得新、不能等"。传统批量学习的"收集一批再训练"模式,在这些场景下要么延迟太高,要么根本不可行。
River 代表了一种重要的范式转变:从"训练一次,部署到死"到"永不停歇地学习"。它让开发者能够在 Python 生态中,以熟悉的 API 风格,构建真正实时的智能系统。随着 MLOps 理念向边缘侧渗透,River 这类流式学习库的重要性只会持续上升。

图1:River 项目官方 Logo
River 官方文档:https://riverml.xyz | PyPI:https://pypi.org/project/river