MLlib中的Random Forests和Boosting

2020-11-26 CSDN技術社區

【編者按】本文來自Databricks公司網站的一篇博客文章,由Joseph Bradley和Manish Amde撰寫。此外,Databricks是由Apache Spark的創始人建立的,成立於2013年年中,目前團隊人員均是開源圈子內的重量級人物,他們都熱衷於"增值開源軟體":

  • 任職CEO的Ion Stoica是UC Berkeley計算機教授、AMPLab聯合創始人,同時也是Conviva公司的聯合創始人。
  • CTO Matei Zaharia是Apache Spark的創作者,同時也是麻省理工學院計算機科學系的助理教授。
  • UC Berkeley計算機科學教授Scott Shenker,同時也是知名SDN公司Nicira的聯合創始人及前CEO。
  • 值得一提的是聯合創始人辛湜先生(英文名Reynold Xin,新浪微博為@hashjoin)還是一名中國人。

以下為博文的譯文:

在Spark 1.2中,MLlib引入了Random Forests和Gradient-Boosted Trees(GBTs)。在分類和回歸處理上,這兩個算法久經驗證,同時也是部署最廣泛的兩個方法。Random Forests和GBTs屬於ensemble learning algorithms(集成學習算法),通過組合多個決策樹來建立更為強大的模型。在本篇文章,我們將介紹這兩個模型和他們在MLlib中的分布式實現。同時,我們還會展示一些簡單的例子並建議該從何處上手。

Ensemble Methods

簡言之,集成學習算法(Ensemble Learning Algorithms)是對已有的機器學習算法進行組合。組合後的模型將比原有的任意一個子模型更加的強大和精確。

在MLlib 1.2中,我們使用 Decision Trees(決策樹)作為基礎模型,同時還提供了兩個集成方法: Random Forests與 Gradient-Boosted Trees(GBTs)。兩個算法的主要區別在於各個部件樹(component tree)的訓練順序。

在Random Forests中,各個部件樹會使用數據的隨機樣本進行獨立地訓練。對比只使用單棵決策樹,這種隨機性可以幫助訓練出一個更健壯的模型,同時也能避免造成在訓練數據上的過擬合。

GBTs一次訓練一棵樹,每次加入的新樹用於糾正已訓練的模型誤差。因此,隨著越來越多樹被添加,模型變得越來越有表現力。

總而言之,兩種方法都是多個決策樹的加權集合。集成模型基於多個樹給出的結果進行結合來做出預測。下圖是建立在3個樹之上的一個非常簡單的例子。

在上圖的回歸集成中,每棵樹都會產生一個實數值,隨後這3個值被整合以產生一個最終的結果。這裡使用的是均值計算,當然你也可以根據預測任務來選擇使用不同技術。

Distributed Learning of Ensembles

在MLlib,不管是Random Forests還是GBTs都通過實例(行)對數據進行分割。其實現依賴於原始Decision Tree代碼,對多個獨立的樹進行分布式訓練,詳情見之前發布的 博文。其中大量的優化方式基於Google的 PLANET項目——分布式環境中做基於樹的集成學習的一個主要項目。

Random Forests:鑑於Random Forests中每棵樹都獨立地進行訓練,因此多個樹的訓練可以並行進行(同時,單個樹上的訓練也可以並行地執行)。MLlib就是這樣做的:可變數量的子樹並行地進行訓練,而具體的數量則在內存限制的基礎上進行迭代優化。

GBTs:鑑於GBTs一次只能訓練一棵樹,只能實現單棵樹級別的並行化。

在這裡,我們看一下MLlib完成的兩個關鍵優化:

  • 內存:Random Forests中每棵樹訓練都使用了數據的不同子樣本。取代顯式複製數據,我們通過使用了一個TreePoint結構來節省內存,TreePoint存放了各個子樣本集中每個實例的副本數量。
  • 通信:Decision Trees在每個決策點上都會從所有的特徵中選擇進行訓練,然而Random Forests通常在每個節點採用有限的隨機選擇的特徵子集。MLlib在實現時採用了這個二次抽樣的特性來減少通信:如果每個節點上訓練的子特徵集只佔所有特徵集的三分之一,那麼通信將會減少到三分之一。

更多詳情可查看 Ensembles Section in the MLlib Programming Guide一文。

使用MLlib Ensembles

下面我們將展示如何使用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(#換成@)

相關焦點

  • 隨機森林(Random Forest)算法原理
    Leo Breiman和Adele Cutler發展出推論出隨機森林的算法。而 "RandomForests" 是他們的商標。這個術語是1995年由貝爾實驗室的Tin Kam Ho所提出的隨機決策森林(random decisionforests)而來的。
  • Python3中常用模塊-random模塊
    rounding; 四捨五入print(random.uniform(10.25,100.25)) 2.4 從序列中隨機獲取元素 import random # 1:# 從非空序列seq中隨機選取一個元素。
  • 高中英語作文:Protecting the Forests(保護森林)
    The areas of forests are getting smaller and smaller. Some scientists say that there will be no vast forests in 20 or 30 years. It is really a terrible thing.
  • 《面試又翻車了》這次竟然和 Random 有關?
    正文Random 是使用最廣泛的隨機數生成工具了,即使連 Math.random() 的底層也是用 Random 實現的 源碼如下:Math.random()Math.random()Random.nextDouble()Random 使用這開始之前,我們先來了解一下 Random 的使用。
  • numpy.random介紹
    #範圍[0,1) 0-1,包含0,不包含1x = np.random.rand(1000)# 通過直方圖查看分布情況及分布區間plt.hist(x)plt.show()random()#random((size=None))  #size = m 表示m個數
  • 為什麼你用不好Numpy的random函數?
    在python數據分析的學習和應用過程中,經常需要用到numpy的隨機函數,由於隨機函數random的功能比較多,經常會混淆或記不住
  • Python語言程序設計筆記——第四周random庫
    random庫是使用隨機數的Python標準庫作用:生成隨機數原理:採用梅森旋轉算法生成的(偽)隨機序列中元素使用方法:import randomrandom庫包括兩類函數,常用共8個基本隨機數函數:seed(), random()擴展隨機數函數:randint(), getrandbits
  • JavaScript用Math.random()生成隨機數
    其實這也不難,只要對Math.random()的結果進行適當的放縮就可以達到這一目的。為了敘述方便,在後面的說明中我們都約定n和m代表正整數且m大於n。首先,假設我們需要隨機生成 [0, n) 之間的所有數,那麼只需將Math.random()的結果乘以n就可以了,正如下面的代碼所做的那樣。
  • 劍指LightGBM和XGboost!斯坦福發表NGBoost算法
    Stanford ML Group 最近在他們的論文中發表了一個新算法,其實現被稱為 NGBoost。該算法利用自然梯度將不確定性估計引入到梯度增強中。本文試圖了解這個新算法,並與其他流行的 boosting 算法 LightGBM 和 XGboost 進行比較,以了解它在實踐中是如何工作的。
  • R語言實現隨機森林randomForest
    1 在R軟體中,用來實現隨機森林的是randomForest軟體包。首先,安裝並加載軟體包。install.packages("randomForest") #安裝軟體包library(randomForest) #加載軟體包gyyz_data=read.csv("gyyz.csv",head=T)gyyz_data$is_rise=as.factor(gyyz_data$is_rise)#將目標變量轉換成分類數據head
  • python隨機函數random分配應用,隨機分配8名老師到3個教室中
    羽憶教程最近遇到一個問題,要隨機分配8名老師到3個辦公室中,這時小編想要了python中的隨機函數random來進行分配工作,感覺小編像個月老一樣。,就需要使用到python隨機函數random。而在這個項目中,我們需要使用到生成數字1到3範圍內的隨機數,即通過導入random模塊後,根據random.randint(1,3)隨機生成一個1到3的整數。下面開始實操。
  • 隨機森林RandomForest挖掘生物標記預測分類
    更多關於此方法在宏基因組學中的應用,請閱讀之前分享的文章:R randomForest包randomForest包主要功能是分類和回歸分析,一共提供了39個函數,最常用的就是randomForest來實現分類(Classification)和時間序列回歸(Regression)今天我們先講最常用的分類方法(用於分組的特徵Features),下周再講解回歸的應用
  • [CompoundSemiconductor]Boosting the activity of GeS...
    It is also used extensively as a solid electrolyte in conductive bridging random access memory (RAM) devices.
  • 隨機森林(Random Forest)
    常見的決策樹算法有C4.5、ID3和CART。3)集成學習 集成學習通過建立幾個模型組合的來解決單一預測問題。它的工作原理是生成多個分類器/模型,各自獨立地學習和作出預測。這些預測最後結合成單預測,因此優於任何一個單分類的做出預測。
  • 【CQF簡筆記】M1L1 The Random Behavior of Assets
    離散時間模型φ : a random variable dran from a Gaussian distributionδt : time step課程花了點功夫推斷µ、σ與δt的關係:µ : growth rate / drift rate,scales with δtσ : standard deviation, scales
  • 從結構到性能,一文概述XGBoost、Light GBM和CatBoost的同與不同
    本文從算法結構差異、每個算法的分類變量時的處理、算法在數據集上的實現等多個方面對 3 種代表性的 boosting 算法 CatBoost、Light GBM 和 XGBoost 進行了對比;雖然本文結論依據於特定的數據集,但通常情況下,XGBoost 都比另外兩個算法慢。
  • R語言 | randomForest包的隨機森林回歸模型以及對重要變量的選擇
    的隨機森林回歸模型以及對重要變量的選擇關於隨機森林(random forest),前文「隨機森林分類以及對重要變量的選擇」中已經對其基本原理作了簡單概括。主要體現在:(1)不同地理區域種植的水稻,隨著水稻生長時期的推移,根際和根內菌群的相似度逐漸增加,並在後期趨於穩定,與種植季節無關:(2)對於水稻根際和根內菌群,地區間獨特OTU的相對豐度均隨時間推移而不斷下降,剩餘的OTU中,兩地區間共有OTU的比重上升。
  • 【預告】量子磁性前沿報告:Frustrated impurities and random-singlet state ...
    This behavior is consistent with a two-dimensional random-singlet state (2,3), the universal properties of which have been recently investigated using a designer Hamiltonian amenable to large-scale quantum
  • 大戰三回合:XGBoost、LightGBM和Catboost一決高低
    Battle 中,根據訓練和預測的時間、預測得分和可解釋性等評測指標,讓三個算法一決高下!XGBoost(eXtreme Gradient Boosting) 特點是計算速度快,模型表現好,可以用於分類和回歸問題中,號稱「比賽奪冠的必備殺器」。