7

谁能推荐一种使用 <10-15ms 范围内的梯度提升模型进行预测的策略(越快越好)?

我一直在使用R'sgbm包,但第一次预测需要大约 50 毫秒(随后的矢量化预测平均为 1 毫秒,因此似乎存在开销,可能在对 C++ 库的调用中)。作为指导,将有大约 10-50 个输入和大约 50-500 个树。任务是分类,我需要访问预测的概率。

我知道那里有很多图书馆,但我很难找到关于它们粗略预测时间的信息。训练将离线进行,因此只需要快速预测——而且,预测可能来自与训练完全分开的一段代码/库(只要有表示树的通用格式) .

4

1 回答 1

18

我是scikit-learn 梯度提升模块的作者,它是 Python 中的梯度提升回归树实现。由于该方法针对低延迟环境(特别是排名问题),因此我在优化预测时间方面付出了一些努力;预测例程是用 C 编写的,由于 Python 函数调用,仍然存在一些开销。话虽如此:具有约 50 个特征和大约 250 棵树的单个数据点的预测时间应该 << 1 毫秒。

在我的用例中,预测时间通常取决于特征提取的成本。我强烈建议进行分析以查明开销的来源(如果您使用 Python,我可以推荐line_profiler)。

如果开销的来源是预测而不是特征提取,您可以检查是否可以进行批量预测而不是预测单个数据点,从而限制由于 Python 函数调用而产生的开销(例如,在排名中,您通常需要得分最高 - K 个文档,因此您可以先进行特征提取,然后在 K x n_features 矩阵上运行预测。

如果这没有帮助,您应该尝试限制树的数量,因为预测的运行时成本基本上与树的数量成线性关系。在不影响模型准确性的情况下,有多种方法可以限制树的数量:

  1. 适当调整学习率;学习率越小,需要的树越多,因此预测越慢。

  2. 具有 L1 正则化的后处理 GBM(Lasso);请参阅第 16.3.1 节统计学习的元素- 使用每棵树的预测作为新特征并通过 L1 正则化线性模型运行表示 - 删除那些没有得到任何权重的树。

  3. 完全校正权重更新;不要只为最近的树进行线搜索/权重更新,而是更新所有树(参见 [Warmuth2006] 和 [Johnson2012])。更好的收敛 - 更少的树。

如果以上方法都不能解决问题,您可以研究级联或提前退出策略(参见 [Chen2012])

参考:

[Warmuth2006] M. Warmuth、J. Liao 和 G. Ratsch。完全修正的提升算法,最大限度地提高利润。在第 23 届机器学习国际会议论文集上,2006 年。

[Johnson2012] Rie Johnson,Tong Zhang,使用正则化贪心森林学习非线性函数,arxiv,2012。

[Chen2012] Minmin Chen, Zhixiang Xu, Kilian Weinberger, Olivier Chapelle, Dor Kedem, Classifier Cascade for Minimizing Feature Evaluation Cost, JMLR W&CP 22: 218-226, 2012.

于 2012-10-30T10:46:08.057 回答