orbital 0.5.0 发布:数据库内直接运行 tidymodels 预测
我们非常高兴地宣布 orbital 0.5.0 正式发布。orbital 让你能够直接在数据库中使用 tidymodels workflow 进行预测,底层通过 tidypredict 把训练好的模型转换为表达式。本文还会介绍 tidypredict 1.1.0 的一些更新内容。
本文主要介绍 R 包 orbital,不过它还有一个 Python 版本,支持 scikit-learn 模型。
两个包都可以从 CRAN 安装:
install.packages(c("orbital", "tidypredict"))本文将介绍本次更新的亮点:支持更多模型、性能提升,以及新增了更多 vignettes。
完整变更列表见 orbital 发布说明 和 tidypredict 发布说明。
新支持的模型
我们新增了对若干模型的支持,也为已支持的模型扩展了更多预测类型。
新支持的模型有:
decision_tree(engine = "rpart")boost_tree(engine = "lightgbm")boost_tree(engine = "catboost")(后面还会详细介绍)
它们都支持回归、分类和概率估计。
以下模型在原有的回归之外,现在也支持分类和概率估计:
mars(engine = "earth")multinom_reg(engine = "glmnet")rand_forest(engine = "randomForest")rand_forest(engine = "ranger")
如果你特别需要某种模型类型,欢迎告诉我们,我们会优先考虑添加。
支持嵌套 case_when()
此前所有基于树的模型都被实现为扁平的 case_when() 语句。也就是说,一棵只有 3 个叶子节点的小树会是这样:
case_when(
x <= 5 & y <= 3 ~ "low",
x <= 5 & y > 3 ~ "med",
x > 5 ~ "high"
)
虽然这样能跑通,但有不少问题。上例中 x <= 5 需要被计算多次。对于这棵小树来说问题不大,但随着树越深,开销会迅速累积。
信息利用也不够充分。决策树是穷举式的,其他分支都已排除,最后一个条件本不该再算。基于以上考虑,我们已将所有树改为嵌套的 case_when() 表达式。
case_when(
x <= 5 ~ case_when(
y <= 3 ~ "low",
.default = "med"
),
.default = "high"
)
嵌套的 case_when() 与之前的扁平写法计算结果完全一致。虽然可读性稍降,但性能提升显著。每个条件至多求值一次,这对计算速度影响很大。
这也意味着 R 版 orbital 与 Python 版 orbital 在构建树时的行为现已一致。
新增 separate_trees 参数
集成树模型等可以表示为多个小模型的组合,通常表现为一个巨大的单一表达式:
.pred = "(tree1) + (tree2) + (tree3) + ... + (tree100)"
这会带来两个主要问题。第一,树太多或太深时,在数据库中执行会触及表达式嵌套深度限制。第二,数据库无法识别这些树可以并行计算后再合并。
新的 separate_trees 参数正是为此设计的。在 orbital() 中设置 separate_trees = TRUE 后,orbital 对象的内部表示不再使用一个巨大的 .pred 表达式,而是拆分为多个表达式,形如:
.pred_tree_001 = "case_when(...)"
.pred_tree_002 = "case_when(...)"
.pred_tree_003 = "case_when(...)"
...
.pred = ".pred_tree_001 + .pred_tree_002 + .pred_tree_003 + ..."
这种表示方式让数据库查询优化器有可能并行求值各棵树,因为每个中间列彼此独立。
separate_trees 参数适用于以下引擎。
- xgboost
- lightgbm
- catboost
- ranger
- randomForest
仅凭这一改动,我们就能够处理此前 orbital 无法支持的模型类型。配合嵌套树的支持,现在可以将一些最主流的机器学习模型直接部署到生产环境。
splines support
Spline 变换常用于预处理阶段,捕捉预测变量与目标变量之间的非线性关系。
本版本中,orbital 新增了对 recipes 包中 step_spline_b()、step_spline_convex()、step_spline_monotone()、step_spline_natural() 和 step_spline_nonnegative() 的支持。底层实现上,spline 会被转换为分段多项式表达式,可直接在 SQL 中求值。
More vignettes
本版本还新增了几个 vignette。
SQL 表达式大小:介绍不同模型超参数如何影响 SQL 大小。这一点在处理 boosting 树模型时尤为实用,因为存在大量超参数组合,它们在不同 SQL 表达式大小下都能取得相近的预测效果。稍加调整,就能选出一个运行速度快 10 到 100 倍、预测性能几乎无损的模型。
数据库中的并行树求值:更深入地解析
separate_trees参数的工作机制,并说明在什么场景下值得使用它。数据库部署:展示如何利用表(table)和视图(view)部署 orbital 模型的实例。
分割边界处的浮点精度:xgboost 和 Cubist 等模型使用的是 32 位浮点数,而 R 中默认是 64 位。这可能导致预测结果不完全一致。如果你正在使用这类模型,建议阅读这篇 vignette,判断该问题是否会影响你的使用。
致谢
特别感谢 Emily Riederer,她帮助打磨并测试了这些新特性。