2012-07-02 76 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