Spark隨機森林實現學習

2022-04-09 03:46:49 字數 1977 閱讀 9548

前言

最近閱讀了spark mllib(版本:spark 1.3)中random forest的實現,發現在分布式的資料結構上實現迭代演算法時,有些地方與單機環境不一樣。單機上一些直觀的操作(遞迴),在分布式資料上,必須進行優化,否則i/o(網路,磁碟)會消耗大量時間。本文整理spark隨機森林實現中的相關技巧,方便後面回顧。

隨機森林演算法概要

隨機森林演算法的詳細實現和細節,可以參考**breiman 2001。這裡簡單說說大體思路,方便理解**。

結果比較穩定,不容易出現過擬合;

out-of-bag error評估模型效果,無需交叉檢驗;

可得到feature重要性。

當然,為了得到上面的優點,必須付出計算開銷作為代價。在單機時代,使用隨機森林(r或scikit-learn)往往成本很高,但是現在有了spark,使得大規模,分布式迭代計算成為了可能,所以在spark上運用隨機森林是技術發展的必然結果!

spark實現優化

spark在實現隨機森林時,採用了下面幾個優化策略:

切分點抽樣

feature裝箱(bin)

分割槽統計

逐層計算(level-wise)

使用這些策略,原因在於rdd的資料時分布在不同伺服器上,為了避免過多的i/o,必須在原始演算法上做出一些優化,否則執行時間可能難以接受。下面分別詳細討論這三個優化策略。

切分點抽樣

feature裝箱

根據抽樣,得到切分點後,接下來是對feature進行裝箱操作,箱子就是由相鄰的樣本切分點構成。箱子的個數是非常小的,一般實際中採用30個左右。計算每個箱子中不同種類的佔比,可以很快計算出最優切分點。

舉個例子,參考上面的示例資料,第一行是每個切分點的比例統計。基於上面的資料,可能生成3中切分情況,分別有棕,紅和綠色三行表示。如果需要計算棕色的切分情況,只需要按照第一行的組合方式,就可以很快的計算所出來。

分割槽統計

逐層計算

單機版本的決策數生成過程是通過遞迴呼叫(本質上是深度優先)的方式構造樹,在構造樹的同事,需要移動資料,將同乙個子節點的資料移動到一起。此方法在分布式資料結構上無法有效的執行,而且也無法執行,因為資料太大,無法放在一起,所以在分布式儲存。mlib採用的策略是逐層構建樹節點(本質上是廣度優先),這樣遍歷所有資料的次數等於所有樹的最大層數。每次遍歷時,只需要計算每個節點所有feature的裝箱統計引數,遍歷完後,根據節點裝箱統計量,決定是否切分,以及如何切分。

以上就是spark mllib實現的隨機森林的關鍵技巧。當然還有很多實現細節這裡沒有描述,不過如果理解了這些技巧,對閱讀spark mllib隨機森林源**會有很大幫助,希望對讀者有用。

spark random forest實現的不足

截止到spark 1.3,mllib的隨機森林仍然不支援oob error和variable importance的支援,也有一些網友在spark社群諮詢此問題,但是目前沒有得到官方的回應。希望後面,spark可以支援此特性。

應用案例

目前,在網路遊戲流失**的場景下,使用spark隨機森林模型(1000棵樹)和單機c50模型做了對比試驗。試驗中覆蓋5款不同型別的遊戲,共執行608輪,試驗週期跨度為4個月。採用了相同的資料,由於單機資料量計算限制,c50使用了10%的取樣建模,而spark使用了全量資料(計算能力秒殺)。試驗結果是隨機森林的模型效果明顯優於c50。f1值有37%的提公升,而f2(召回率優先)提公升度高達72%。

提公升可能的原因有兩個:

1 隨機森林模型效果確實優於c50

2 隨機森林建模資料量有質的飛躍,導致效能提公升

參考資料

隨機森林作者**

spark源**

spark峰會關於分布式決策樹實現的分享

spark 機器學習 隨機森林 原理 一

1.什麼是隨機森林 顧名思義,是用隨機的方式建立乙個森 森林裡面有很多的決策樹組成,隨機森林的每一棵決 策樹之間是沒有關聯的。在得到森 之後,當有乙個新的輸入樣本進入的時候,就讓森 中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬於哪一類 對於分類演算法 然後看看哪一 類被選擇最多,就 這個樣本...

機器學習 隨機森林

opencv包含隨機森林 random forest 類,隨機森林可以通過收集很多樹的子節點對各個類別的投票,然後選擇獲得最多投票的類別作為判斷結果。通過計算 森林 的所有子節點上的值的平均值來解決回歸問題。隨機森林包含隨機選擇的一些決策樹。隨機森林建立時的基本子系統也是決策樹,在建立決策樹時會一直...

整合學習 隨機森林

隨機森林 random forest,簡稱rf 是bagging的乙個擴充套件變體。bagging在1996年由beriman提出,作為並行式整合學習方法中最著名的代表,利用自助取樣法。可取樣出t個含m個訓練樣本的取樣集,然後基於每個取樣集訓練出乙個基學習器,再將這些基學習器進行結合。這就是bagg...