任何人都可以推荐使用梯度增强模型在< 10-15ms范围内进行预测的策略(越快越好)?
我一直在使用R
的{{1}}包,但是第一次预测需要大约50ms(后续的矢量化预测平均为1ms,所以似乎有开销,可能在调用C ++时图书馆)。作为指导,将有约10-50个输入和~50-500棵树。任务是分类,我需要访问预测的概率。
我知道那里有很多图书馆,但即使在粗略的预测时间内,我也很难找到信息。训练将在线下进行,因此只有预测需要很快 - 而且,预测可能来自一段完全独立于培训的代码/库(只要有一种表示树的通用格式)
答案 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矩阵上运行预测。
如果这没有帮助,您应该尝试限制树的数量,因为预测的运行时成本基本上是树的数量。 有许多方法可以在不影响模型精度的情况下限制树的数量:
正确调整学习率;学习率越小,需要的树越多,预测就越慢。
具有L1正则化的后处理GBM(Lasso);参见Elements of Statistical Learning第16.3.1节 - 使用每棵树的预测作为新特征并通过L1正则化线性模型运行表示 - 移除那些没有任何重量的树。
完全矫正体重更新;而不是仅针对最近的树进行线搜索/权重更新,更新所有树(参见[Warmuth2006]和[Johnson2012])。更好的融合 - 更少的树木。
如果上述方法都无法解决级联或提前退出策略(参见[Chen2012])
参考文献:
[Warmuth2006] M. Warmuth,J。Liao和G. Ratsch。全面校正增强算法,最大化利润率。在第23届机器学习国际会议论文集中,2006年。