2026-08-11
fru 用 Rust 重写 Breiman 随机森林,只保留 ntree、mtry 两档超参,靠多核把 scikit-learn 甩开几倍到几千倍,特征重要性改用一套自研的快速置换算法。
随机森林是表格数据上最稳的工具之一。它在树模型里被 XGBoost 抢走过风头,但样本不大、特征混杂、需要可解释性的场景里它仍是一线选择。问题是主流实现各有别扭:R 的 randomForest 单线程、数据稍大就慢;scikit-learn 的实现在多核上扩展性差,线程一多反而更慢;ranger 很快,但三者的重要性得分口径不一致,跨库对不齐。
Kursa 这名字对用 R 的人不陌生,他是特征选择方法 Boruta 的作者。这篇 SoftwareX 论文介绍他和 Piwoński 做的 fru:一个用 Rust 写、从零搭起来的随机森林。目标不是再加一个 benchmark 第一,而是造一片「稳、对、快、能放大到多核与生产线」的森林。配套的 R 包已经上架 CRAN,Boruta 已经把后端换成它。
fru 的设计哲学是「只暴露原始超参」:只留 trees(树数,默认 500)和 tries(每次分裂试几个特征,即 mtry)两个旋钮,不堆 extra-trees、不堆各种正则。旋钮少即稳,跨版本、跨语言可复现。
几个关键工程选择:
论文给的是相对速度,精确的逐数据集计时表在 ScienceDirect 全文里。机房 IP 被反爬挡住,本次没直接取到正文,下面的量级来自作者自己的项目文档(与论文 benchmark 同源):
| 对比项 | 结论 |
| 相对 scikit-learn | 快几倍到几千倍,核越多差距越大 |
| 处理范围 | 分类、回归、OOB 预测 |
| 特征重要性 | 置换重要性(自研加速),不提供基尼重要性 |
| 生态接入 | R(CRAN,被 Boruta 反向依赖)、Python(fru-arrow) |
关键是趋势:scikit-learn 的随机森林在多线程上扩展性差,fru 在核数增加时还能继续吃满,所以数据越大、核越多,fru 优势越明显。单个数据集到底快多少,以论文正文为准。
对天天用 scikit-learn 或 R 做表格模型的人,fru 是个可以平替、快得多的后端,尤其适合要反复训练的场景:特征选择(Boruta 本质就是反复训练森林)、超参搜索、在生产里做批量打分。Boruta 切到 fru,等于在这个热门特征选择方法里默认拿到了 Rust 的速度。
工程姿态上它也有可学之处:把算法内核抽成 crate、R 和 Python 共用,重要性用一套可复现的并行实现,刻意把 API 收窄到最小。这给「在 Python、R 之外用系统语言重写经典算法」做了个干净范本。随机森林之外,梯度提升、最近邻这类算法老、但性能吃实现的方法,都适用同一套路子。