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

loc*_*off 7 classification machine-learning

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

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

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

Pet*_*fer 15

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

在我的用例中,预测时间通常取决于特征提取的成本.我强烈建议分析以确定开销的来源(如果你使用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]陈敏敏,徐志祥,Kilian Weinberger,Olivier Chapelle,Dor Kedem,最小化特征评估成本的分类器级联,JMLR W&CP 22:218-226,2012.