【編者按】本文來自Databricks公司網站的一篇博客文章,由Joseph Bradley和Manish Amde撰寫。此外,Databricks是由Apache Spark的創始人建立的,成立於2013年年中,目前團隊人員均是開源圈子內的重量級人物,他們都熱衷於"增值開源軟體":
以下為博文的譯文:
在Spark 1.2中,MLlib引入了Random Forests和Gradient-Boosted Trees(GBTs)。在分類和回歸處理上,這兩個算法久經驗證,同時也是部署最廣泛的兩個方法。Random Forests和GBTs屬於ensemble learning algorithms(集成學習算法),通過組合多個決策樹來建立更為強大的模型。在本篇文章,我們將介紹這兩個模型和他們在MLlib中的分布式實現。同時,我們還會展示一些簡單的例子並建議該從何處上手。
簡言之,集成學習算法(Ensemble Learning Algorithms)是對已有的機器學習算法進行組合。組合後的模型將比原有的任意一個子模型更加的強大和精確。
在MLlib 1.2中,我們使用 Decision Trees(決策樹)作為基礎模型,同時還提供了兩個集成方法: Random Forests與 Gradient-Boosted Trees(GBTs)。兩個算法的主要區別在於各個部件樹(component tree)的訓練順序。
在Random Forests中,各個部件樹會使用數據的隨機樣本進行獨立地訓練。對比只使用單棵決策樹,這種隨機性可以幫助訓練出一個更健壯的模型,同時也能避免造成在訓練數據上的過擬合。
GBTs一次訓練一棵樹,每次加入的新樹用於糾正已訓練的模型誤差。因此,隨著越來越多樹被添加,模型變得越來越有表現力。
總而言之,兩種方法都是多個決策樹的加權集合。集成模型基於多個樹給出的結果進行結合來做出預測。下圖是建立在3個樹之上的一個非常簡單的例子。
在上圖的回歸集成中,每棵樹都會產生一個實數值,隨後這3個值被整合以產生一個最終的結果。這裡使用的是均值計算,當然你也可以根據預測任務來選擇使用不同技術。
在MLlib,不管是Random Forests還是GBTs都通過實例(行)對數據進行分割。其實現依賴於原始Decision Tree代碼,對多個獨立的樹進行分布式訓練,詳情見之前發布的 博文。其中大量的優化方式基於Google的 PLANET項目——分布式環境中做基於樹的集成學習的一個主要項目。
Random Forests:鑑於Random Forests中每棵樹都獨立地進行訓練,因此多個樹的訓練可以並行進行(同時,單個樹上的訓練也可以並行地執行)。MLlib就是這樣做的:可變數量的子樹並行地進行訓練,而具體的數量則在內存限制的基礎上進行迭代優化。
GBTs:鑑於GBTs一次只能訓練一棵樹,只能實現單棵樹級別的並行化。
在這裡,我們看一下MLlib完成的兩個關鍵優化:
更多詳情可查看 Ensembles Section in the MLlib Programming Guide一文。
下面我們將展示如何使用MLlib做集成學習。下面這個Scala示例展示了如何讀入一個數據集,將數據分割到訓練和測試環境,學習一個模型,列印這個模型以及測試精確度。Java和Python實例可以參考MLlib Programming Guide(http://spark.apache.org/docs/latest/mllib-ensembles.html)。需要注意的是,GBTs當下還沒有Python API,GBTs的Python API可能在Spark 1.3版本發布(通過 Github PR 3951)。
Random Forest Example
import org.apache.spark.mllib.tree.RandomForestimport org.apache.spark.mllib.tree.configuration.Strategyimport org.apache.spark.mllib.util.MLUtils// Load and parse the data file.val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")// Split data into training/test setsval splits = data.randomSplit(Array(0.7, 0.3))val (trainingData, testData) = (splits(0), splits(1))// Train a RandomForest model.val treeStrategy = Strategy.defaultStrategy("Classification")val numTrees = 3 // Use more in practice.val featureSubsetStrategy = "auto" // Let the algorithm choose.val model = RandomForest.trainClassifier(trainingData, treeStrategy, numTrees, featureSubsetStrategy, seed = 12345)// Evaluate model on test instances and compute test errorval testErr = testData.map { point => val prediction = model.predict(point.features) if (point.label == prediction) 1.0 else 0.0}.mean()println("Test Error = " + testErr)println("Learned Random Forest:n" + model.toDebugString)Gradient-Boosted Trees Example
import org.apache.spark.mllib.tree.GradientBoostedTreesimport org.apache.spark.mllib.tree.configuration.BoostingStrategyimport org.apache.spark.mllib.util.MLUtils// Load and parse the data file.val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")// Split data into training/test setsval splits = data.randomSplit(Array(0.7, 0.3))val (trainingData, testData) = (splits(0), splits(1))// Train a GradientBoostedTrees model.val boostingStrategy = BoostingStrategy.defaultParams("Classification")boostingStrategy.numIterations = 3 // Note: Use more in practiceval model = GradientBoostedTrees.train(trainingData, boostingStrategy)// Evaluate model on test instances and compute test errorval testErr = testData.map { point => val prediction = model.predict(point.features) if (point.label == prediction) 1.0 else 0.0}.mean()println("Test Error = " + testErr)println("Learned GBT model:n" + model.toDebugString)可擴展性
我們在一個二分類實驗上展示了MLlib Ensembles的可擴展性。下面的每張圖都對比了Gradient-Boosted Trees (「GBT」) 和 Random Forests (「RF」),樹根據最大深度區分。
測試的場景是一個根據音頻特徵集(UCI ML知識庫中的YearPredictionMSD數據集)預測歌曲發布日期的回歸任務,我們使用了EC2 r3.2xlarge主機。另外,除特殊說明,算法參數均選擇默認。
擴展模型體積:訓練時間和測試錯誤
下文兩張圖片展示了在集成中增加樹的數量時的效果。對於兩個方法來說,增加樹需要更多的學習時間,同樣也意味著更好的結果(採用Mean Squared Error (MSE) 進行評估)。
對比兩種方法,Random Forests訓練的速度無疑更快,但是如果想達到同樣的誤差,它們往往需要深度更大的樹。GBTs每次迭代都可以進一步減少誤差,但是如果迭代次數太多,它很可能造成過擬合。
下圖可以幫助對MSE產生一定程度的了解,最左邊的點表示了使用單一決策樹時產生的誤差。
詳情:463715個訓練模型。16個從節點。
縮放訓練數據集的體積:訓練時間和測試誤差。
下面的兩張圖表示了在大型訓練數據集上的效果。使用更多的數據時,兩個方法的訓練時間都有所增長,但是顯然也都得到了一個更好的結果。
詳情:16個工作節點
強擴展性:使用更多的節點做更快速的訓練
下面這張圖體現了使用更大的計算集群來處理同樣的問題。顯然,在使用了更多的從節點後,兩種方法的訓練速度都得到了顯著提升。舉個例子,使用GBTs時,在樹深度為2的情況下,16個工作者節點的速度將是2個工作者節點速度的4.7倍。同時,數據集越大,速度的提升越明顯。
詳情:463715個訓練實例。
下一步
GBTs的Python API將在不久後實現。後續開發的重點是可插拔性:集成可以應用到幾乎所有分類或者回歸算法,不僅僅是決策樹。對於這一點,Spark 1.2中引入的 Pipelines API 支持對集成算法進行擴展,實現真正的可插拔。
原文連結: Random Forests and Boosting in MLlib(譯者/童陽 友情審校/王靜, 浙江大學博士)
OpenCloud 2015將於2015年 4月16-18日在北京召開。大會包含「2015 OpenStack技術大會」、「2015 Spark技術峰會」、「2015 Container技術峰會」三大技術峰會及多場深度行業實戰培訓,主題聚焦技術創新與應用實踐,薈萃國內外真正的雲計算技術的大牛講師。這裡都是一線接地氣的乾貨,紮實的產品、技術、服務和平臺。OpenCloud 2015,懂行的人都在這裡! 更多講師和日程信息請關注OpenCloud 2015介紹和官網。
本文為CSDN編譯整理,未經允許不得轉載,如需轉載請聯繫market#csdn.net(#換成@)