低延迟生产环境中的梯度提升预测?

时间:2012-07-02 14:33:17

标签: machine-learning classification

任何人都可以推荐使用梯度增强模型在< 10-15ms范围内进行预测的策略(越快越好)?

我一直在使用R的{​​{1}}包,但是第一次预测需要大约50ms(后续的矢量化预测平均为1ms,所以似乎有开销,可能在调用C ++时图书馆)。作为指导,将有约10-50个输入和~50-500棵树。任务是分类,我需要访问预测的概率。

我知道那里有很多图书馆,但即使在粗略的预测时间内,我也很难找到信息。训练将在线下进行,因此只有预测需要很快 - 而且,预测可能来自一段完全独立于培训的代码/库(只要有一种表示树的通用格式)

1 个答案:

答案 0 :(得分:15)

我是scikit-learn gradient boosting module的作者,这是Python中的Gradient Boosted Regression Trees实现。我花了一些精力来优化预测时间,因为该方法针对的是低延迟环境(特别是排名问题);预测例程是用C语言编写的,由于Python函数调用仍有一些开销。话虽如此:具有约50个特征和约250个树的单个数据点的预测时间应<&lt;&lt; 1毫秒。

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

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

如果这没有帮助,您应该尝试限制树的数量,因为预测的运行时成本基本上是树的数量。 有许多方法可以在不影响模型精度的情况下限制树的数量:

  1. 正确调整学习率;学习率越小,需要的树越多,预测就越慢。

  2. 具有L1正则化的后处理GBM(Lasso);参见Elements of Statistical Learning第16.3.1节 - 使用每棵树的预测作为新特征并通过L1正则化线性模型运行表示 - 移除那些没有任何重量的树。

  3. 完全矫正体重更新;而不是仅针对最近的树进行线搜索/权重更新,更新所有树(参见[Warmuth2006]和[Johnson2012])。更好的融合 - 更少的树木。

  4. 如果上述方法都无法解决级联或提前退出策略(参见[Chen2012])

    参考文献:

    [Warmuth2006] M. Warmuth,J。Liao和G. Ratsch。全面校正增强算法,最大化利润率。在第23届机器学习国际会议论文集中,2006年。

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

    <陈> [Chen2012]陈民敏,徐志祥,Kilian Weinberger,Olivier Chapelle,Dor Kedem,最小化特征评估成本的分类器级联,JMLR W&amp; CP 22:218-226,2012。