2012-07-02 32 views
7

任何人都可以推荐在< 10-15ms范围内使用渐变增强模型进行预测的策略(越快越好)?低延迟生产环境中的梯度提升预测?

我一直在使用Rgbm包,但第一次预测需要约50ms(随后向量化预测的平均值为1ms,所以似乎存在开销,可能在调用C++库时)。作为指导,将会有〜10-50个输入和约50-500棵树。任务是分类,我需要访问预测的概率。

我知道这里有很多图书馆,但即使在粗略的预测时间里,他们也找不到信息。训练将在离线状态下进行,因此只有预测需要快速 - 同样,预测可能来自与训练无关的代码/库(只要有用于表示树的通用格式) 。

回答

14

我是scikit-learngradient boosting module的作者,这是一个Python中的梯度增强回归树实现。由于该方法针对低延迟环境(特别是排名问题),因此我花了一些时间优化预测时间。预测例程用C语言编写,由于Python函数调用仍然存在一些开销。话虽如此:具有〜50个特征和约250棵树的单个数据点的预测时间应该是1ms的< <。

在我的用例中,预测时间通常受特征提取的成本支配。我强烈建议分析指出开销的来源(如果您使用Python,我可以推荐line_profiler)。

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

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

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

  2. 带L1正则化(Lasso)的后处理GBM;请参阅Elements of Statistical Learning第16.3.1节 - 将每棵树的预测用作新特征,并通过L1正则化线性模型运行表示 - 删除那些没有得到任何权重的树。

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

如果以上都不是卓有成效的,你可以调查级联或早期退出战略(见[Chen2012])

参考文献:

[Warmuth2006] M. Warmuth,廖J. ,和G. Ratsch。完全纠正推动算法,最大限度地保证金。在机器学习的第23届国际会议论文集,2006年

[Johnson2012]惠生,张彤,学习使用正则贪婪森林的arXiv非线性函数,2012年

[Chen2012]敏敏陈,徐志翔,Kilian Weinberger,Olivier Chapelle,Dor Kedem,用于最小化特征评估成本的分类器级联,JMLR W & CP 22:218-226,2012.

+0

我曾尝试在7月找到有关scikit-learn预测时间的信息, t,所以我选择使用浅层学习算法(我知道它会满足延迟要求)。我的使用案例是在网络广告中对出价进行排名,所以批量预测会有所帮助,但对每个展示的决策仍需在10ms内完成。 Re:你的建议是减少树木数量,我试过1,刚刚阅读2,并且会考虑3 - 感谢参考/想法。对于一个新项目,我正在考虑Weka和scikit-learn,所以你的回答很有帮助。 – lockedoff

+0

在当前HEAD的sklearn中,有一个关于预测延迟与准确性的基准,以及一个关于该主题的详细文档,其中包括许多分类器/回归器的预测时间。例如,请参阅此脚本:https://github.com/oddskool/scikit-learn/blob/pred_latency/examples/applications/plot_prediction_latency.py – oDDsKooL