我是scikit-learngradient boosting module的作者,这是一个Python中的梯度增强回归树实现。由于该方法针对低延迟环境(特别是排名问题),因此我花了一些时间优化预测时间。预测例程用C语言编写,由于Python函数调用仍然存在一些开销。话虽如此:具有〜50个特征和约250棵树的单个数据点的预测时间应该是1ms的< <。
在我的用例中,预测时间通常受特征提取的成本支配。我强烈建议分析指出开销的来源(如果您使用Python,我可以推荐line_profiler)。
如果开销的来源是预测而不是特征提取,那么可以检查是否可以执行批量预测而不是预测单个数据点,从而限制由于Python函数调用而导致的开销(例如,在您经常需要的排名中对顶部K文档进行评分,因此您可以先进行特征提取,然后在K x n_features矩阵上运行预测。
如果这样做没有帮助,您应该尝试限制树的数量,因为运行时成本对于树木的数量预测基本上是线性的 有许多方法可以在不影响模型精度的情况下限制树木的数量:
正确调整学习率;学习率越低,需要的树就越多,因此预测越慢。
带L1正则化(Lasso)的后处理GBM;请参阅Elements of Statistical Learning第16.3.1节 - 将每棵树的预测用作新特征,并通过L1正则化线性模型运行表示 - 删除那些没有得到任何权重的树。
完全矫正体重更新;而不是仅为最近的树进行行搜索/权重更新,更新所有树(参见[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.
我曾尝试在7月找到有关scikit-learn预测时间的信息, t,所以我选择使用浅层学习算法(我知道它会满足延迟要求)。我的使用案例是在网络广告中对出价进行排名,所以批量预测会有所帮助,但对每个展示的决策仍需在10ms内完成。 Re:你的建议是减少树木数量,我试过1,刚刚阅读2,并且会考虑3 - 感谢参考/想法。对于一个新项目,我正在考虑Weka和scikit-learn,所以你的回答很有帮助。 – lockedoff
在当前HEAD的sklearn中,有一个关于预测延迟与准确性的基准,以及一个关于该主题的详细文档,其中包括许多分类器/回归器的预测时间。例如,请参阅此脚本:https://github.com/oddskool/scikit-learn/blob/pred_latency/examples/applications/plot_prediction_latency.py – oDDsKooL