1. 程式人生 > >spark機器學習庫指南[Spark 1.3.1版]——決策樹(decision trees)

spark機器學習庫指南[Spark 1.3.1版]——決策樹(decision trees)

fuqingchuan 機器學習 2015-03-22  3,477 次瀏覽 GINIspark決策樹 spark機器學習庫指南[Spark 1.3.1版]——決策樹(decision trees)已關閉評論

下面是章節決策樹的目錄(其他內容參見全文目錄)

決策樹以及決策樹的整合是很受歡迎的機器學習演算法,經常用於解決分類和迴歸任務。決策樹因為下列原因被廣泛使用:

  1. 模型容易解釋。決策樹模型是可閱讀的,從根到葉節點,每一步都可以看出決策依據。
  2. 能夠處理類別型特徵(跟連續特徵相對)。
  3. 能解決多分類問題
  4. 不需要特徵尺度變換(特徵值只參入比較而不參入數值計算)
  5. are able to capture non-linearities and feature interactions[還沒想好這個該怎麼翻譯啊]

像隨機森林和迭代決策樹這樣的整合樹演算法在分類和迴歸任務上也位居前列。

MLlib支援使用決策樹做二分類、多分類和迴歸,既能使用連續特徵又能使用類別特徵。具體實現中按行對資料分割槽,允許對百萬級的例項進行分散式訓練。

整合樹(隨機森林和梯度迭代樹)將會在下一節中介紹。

基礎演算法

決策樹是一個貪心演算法,它遞迴地對特徵空間做分裂處理(不一定是二分,單屬性多個值的時候是多分)。決策樹中每個底層(葉節點)分割槽對應一個相同的標籤。每個分割槽都是通過從可能的分裂中貪心地選擇一個最好的分裂,從而最大化當前節點的資訊增益。也就是說,在每個樹節點上選擇的分裂是從集合argmaxs

IG(D,s)中選出來的,其中IG(D, s)是在資料集D上做s切分的資訊增益。

節點不純度和資訊增益(Node impurity and information gain)

節點不純度是用來衡量通過某節點屬性對樣本做分裂之後每個部分的標籤的一致性的,也就是看每部分中標籤是不是屬於同一個型別(labe)。MLlib當前的實現為分類提供了兩種不純度衡量方法(GINI不純度和熵),為迴歸提供了一種不純度衡量方法(方差)。

Impurity Task Formula Description
Gini 分類 1 fi是某個分割槽內第i個標籤的頻率,C是該分割槽中的類別總數數。GINI不純度度量的是型別被分錯的可能性(型別的概率乘以分錯的概率
分類 2 i是某個分割槽內第i個標籤的頻率,C是該分割槽中的類別總數數
方差 分類 3 yi是某個例項的標籤,N是例項的總數, μ是所有例項的均值:4

基於資訊增益的方法:資訊增益是父節點的不純度和兩個子節點的不純度之差。假設一個分裂s將資料集D(大小為N)分為兩個資料集Dleft(大小為Nleft)和Dright(大小為Nright),那麼資訊增益可以表示為:

gif.latex2

其中Impurity(D)、Impurity(Dleft)、Impurity(Dright)是相應系統的不純度,見上文表格中的三種不純度公式。注意這裡的資訊增益跟資訊理論的專門概率資訊增益是不同的,它是父子節點的不純度之差,而不單指熵差。

注:

使用資訊增益的決策樹演算法實現有ID3、C4.5:ID3使用的是資訊增益,它在分裂時可能傾向於屬性值多的節點;C4.5是ID3的改進版,它使用的是資訊增益率,另外還基於資訊增益對連續型特徵做了離散化處理。

使用GINI不純度的決策樹演算法實現有CART。

分裂候選集(Split candidates)

連續特徵(Continuous features)

在單機版實現中,資料集一般較小,對每個連續特徵分裂出的候選集通常是去重之後的所有特徵值。為了更快的進行樹計算,某些實現中會對特徵值做排序並使用有序的去重值集作為候選集和。

但在大規模分散式資料集上,特徵值排序代價是非常昂貴的。決策樹在大資料上的實現,一般會計算出一個近似的分裂候選集,具體做法是在抽樣的部分資料集上做分位點(quantile)計算[分位點是將有序資料集分成N等分的分界點,例如:2分位點是中值或者說中位數],這個其實就是連續特徵離散化。有序分裂產生了“區段”(bins),區段的最大數量可以通過maxBins引數設定。

注意:區段的數量不可能超過當前的例項數量。如果不滿足這個條件,演算法會自動調整區段引數值(maxBins的最大值是32)。

類別型特徵(Categorical features)

對於類別型特徵,如果該特徵有M個可能的值(類別),那麼我們可以得到高達2M-1-1個候選分裂集和。在二分類(0/1)和迴歸中,我們可以按照平均標籤對類別特徵值排序(參見《Elements of Statistical Machine Learning》章節9.2.4),進而將分裂候選集減少到M-1。例如,在一個二分類問題中,一個類別型特徵有三種類型A、B和C,對應的標籤(二分類中label 1)分別佔比0.2、0.6和0.4,那麼該類別型特徵值可以排序為A、C、B。兩種分裂候選集是<A|C,B>和<A,C|B>,其中”|”表示分裂。

In multiclass classification, all 2M11 possible splits are used whenever possible. When 2M11 is greater than the maxBins parameter, we use a (heuristic) method similar to the method used for binary classification and regression. The M categorical feature values are ordered by impurity, and the resulting M1 split candidates are considered.(對這一段的理解不足,後續再翻譯)

停止規則(Stopping rule)

遞迴樹的構建在節點滿足下列條件時停止:

  1. 節點深度等於maxDepth這個訓練引數。
  2. 沒有分裂候選集能產生比minInfoGain更大的資訊增益。
  3. 沒有分裂候選集產生的子節點都至少對應minInstancesPerNode個訓練樣本。

使用建議(Usage tips)

為了更好地使用決策樹,在下文中我們會討論各種引數的用法。下面列舉的引數大致按重要程度排序。新手應該主要關注“問題規格引數”這一節以及“最大深度”這個引數。

問題規格引數(Problem specification parameters)

問題規格引數描述了要解決的問題和資料集。這些引數只需要指定即可不需要調優。

  • algoClassification 或者 Regression
  • numClasses: 分類的型別數量Number of classes (只用於Classification)
  • categoricalFeaturesInfo: 指明哪些特徵是類別型的以及每個類別型特徵對應值(類別)的數量。通過map來指定,map的key是特徵索引,value是特徵值數量。不在這個map中的特徵預設是連續型的。
    • 例如:Map(0 -> 2, 4->10)表示特徵0有兩個特徵值(0和1),特徵4有10個特徵值{0,1,2,3,…,9}。注意特徵索引是從0開始的,0和4表示第1和第5個特徵。
    • 注意可以不指定引數categoricalFeaturesInfo。演算法這個時候仍然會正常執行。但是類別型特徵顯示說明的話應該會訓練出更好的模型。

停止條件(Stopping criteria)

這些引數決定了何時停止構建樹(新增新節點)。當調整這些引數的時候,要謹慎使用測試集做校驗防止過擬合。

  • maxDepth: 樹的最大深度。越深的樹表達能力越強(潛在允許更高的準確率),但是訓練的代價也越大並更容易過擬合。
  • minInstancesPerNode: 如果一個節點需要分裂的話,它的每個子節點必須至少有minInstancesPerNode個訓練樣本。這個通常在隨機森林中用到,因為隨機森林比獨立樹有更大的訓練深度。
  • minInfoGain: 如果一個節點需要分裂的話,必須最少有minInfoGain的資訊增益。

可調引數(Tunable parameters)

這些引數可用於調優。調優時要在測試集上小心測試以免過擬合。

  • maxBins: 連續特徵離散化時用到的最大區段(bins)數。
    • 增加maxBins的值,可以讓演算法考察跟多的分裂候選集,從而做耕細粒度的分裂。但是,這會增加計算量和通訊開銷。
    • 對於類別型特徵,maxBins引數必須至少是特徵值(類的數量M)的數量。
  • maxMemoryInMB:  儲存統計資訊的記憶體大小。
    • 預設值保守地設定為256MB,這個大小在絕大多數應用場景下夠用。增加maxMemoryInMB(如果增加的記憶體可用的話)允許更少的資料遍歷,可以提升訓練速度。但是,這也可能降低彙報,因為當maxMemoryInMB增長時,每次體的帶的通訊開銷也會成比例增長。
    • 實現上的細節:為了處理更好,決策樹演算法會收集一組需要分裂節點的統計資訊(而不是一次一個節點)。一個組中能夠處理的節點數量取決於記憶體需求(不同的特徵差異大)。MaxMemoryInMB引數指定了每個worker上用於統計的記憶體限制(單位是MB)。
  • subsamplingRate: 用於學習決策樹的訓練樣本比例。這個引數跟樹的整合(隨機森林,梯度提升樹)最相關,用於從原始資料中抽取子樣本。對於單個決策樹,這個引數用途不大,因為訓練樣本的數量通常不是主要約束。
  • impurity: 用於選擇候選分裂的不純度度量標準。這個引數需要跟algo引數匹配。它的取值在上文表格中有討論。

快取和檢查點(Caching and checkpointing)

MLlib 1.2添加了幾個特性用來擴充套件到更大的樹以及數的整合。當maxDepth設定得比較大,開啟節點ID快取和檢查點就比較有用了。這些引數在numThrees設定得比較大的隨機森林演算法中也比較有用。

  • useNodeIdCache:當這個引數設定為true,演算法會避免在每次迭代中將當前模型傳給spark執行器(excutors)。
    • 這對深度大的樹(加速計算)和大的隨機森林(減少每次迭代的通訊開銷)比較有用。
    • 實現上的細節:預設情況下,演算法向執行器傳達當前模型的資訊以便執行器匹配訓練樣本和樹節點。如果這個設定開啟,模型資訊直接快取而不需要傳送。

節點ID快取產生了一個RDD序列(每次迭代1個)。這個長序列會導致效能問題,但是為RDD設定檢查點(checkpoitng)可以緩解這個問題。注意檢查點只在useNodeIdCache開啟時可用。

  • checkpointDir: 設定檢查點的儲存目錄
  • checkpointInterval: 設定檢查點的頻率。過高會導致大量叢集寫操作。過低的話,如果執行器失敗,RDD需要重新計算。

擴充套件性(Scaling)

在計算方面,擴充套件能力跟訓練樣本數、特徵數量、maxBins引數有著近似線性的關係。在通訊方面,擴充套件能力跟特徵數量以及maxBins有著近似線性的關係。

The implemented algorithm reads both sparse and dense data. However, it is not optimized for sparse input.

實現的演算法既可以讀取稀疏資料又可以讀取密集型資料。但是,目前沒有為稀疏輸入做優化。

示例

分類(Classification)

下面的例子說明了怎樣匯入LIBSVM 資料檔案,解析成RDD[LabeledPoint],然後使用決策樹進行分類。GINI不純度作為不純度衡量標準並且樹的最大深度設定為5。最後計算了測試錯誤率從而評估演算法的準確性。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 from pyspark.mllib.regression import LabeledPoint from pyspark.mllib.tree import DecisionTree,DecisionTreeModel from pyspark.mllib.util import MLUtils # Load and parse the data file into an RDD of LabeledPoint. data=MLUtils.loadLibSVMFile(sc,'data/mllib/sample_libsvm_data.txt') # Split the data into training and test sets (30% held out for testing) (trainingData,testData)=data.randomSplit([0.7,0.3]) # Train a DecisionTree model. #  Empty categoricalFeaturesInfo indicates all features are continuous. model=DecisionTree.trainClassifier(trainingData,numClasses=2,categoricalFeaturesInfo={}, impurity='gini',maxDepth=5,maxBins=32) # Evaluate model on test instances and compute test error predictions=model.predict(testData.map(lambdax:x.features))

相關推薦

spark機器學習指南[Spark 1.3.1]——決策(decision trees)

fuqingchuan 機器學習 2015-03-22  3,477 次瀏覽 GINI, spark, 決策樹, 熵 spark機器學習庫指南[Spark 1.3.1版]——決策樹(decision trees)已關閉評論 下面是章節決策

掌握Spark機器學習-01

c++ scala 強化學習 聚類 分享圖片 ron info 初識 分享 第1章 初識機器學習 在本章中將帶領大家概要了解什麽是機器學習、機器學習在當前有哪些典型應用、機器學習的核心思想、常用的框架有哪些,該如何進行選型等相關問題。 1-1 導學 1-2 機器學習概述

掌握Spark機器學習-02-mllib數據格式

style inf 向量 ima img 技術 spark 特點 特征 MLlib 1.MLlib介紹 1)MLlib特點 2)哪些算法 3)閱讀官方文檔 MLlib提供了哪些: 算法 特征工程 管道 持久化 2.MLlib數據格式 1)本地向量 2)標簽數據 3)

掌握Spark機器學習-07.6-線性回歸實現房價預測

linear 線性 ack transform regress build count random () 數據集 house.csv 數據概覽 代碼 package org.apache.spark.examples.examplesforml import org

掌握Spark機器學習 大資料開發技能更進一步

掌握Spark機器學習庫 大資料開發技能更進一步 第1章 初識機器學習 在本章中將帶領大家概要了解什麼是機器學習、機器學習在當前有哪些典型應用、機器學習的核心思想、常用的框架有哪些,該如何進行選型等相關問題。 1-1 導學 1-2 機器學習概述 1-

掌握Spark機器學習-06-基礎統計部分

說明 本章主要講解基礎統計部分,包括基本統計、假設檢驗、相關係數等 資料集 資料集有兩個檔案,分別是: beijing.txt 北京歷年降水量,不帶年份 beijing2.txt 北京歷年降水量,帶年份 原始碼 原始碼比較少,故在此給出: 基礎統計 val t

Spark機器學習》筆記——Spark分類模型(線性迴歸、樸素貝葉斯、決策、支援向量機)

一、分類模型的種類 1.1、線性模型 1.1.1、邏輯迴歸 1.2.3、線性支援向量機 1.2、樸素貝葉斯模型 1.3、決策樹模型 二、從資料中抽取合適的特徵 MLlib中的分類模型通過LabeledPoint(label: Double, features

Spark機器學習》筆記——Spark Streaming 在實時機器學習中的應用

此前我們一直討論的是批量資料處理,也就是我們所有的分析、特徵提取和模型訓練都被應用於一組固定不變的資料。這很好地適用於Spark對RDD的核心抽象,即不可變的分散式資料集。儘管可以使用Spark的轉換函式和行動運算元從原始的RDD建立新RDD,但是RDD一旦建立,其中包含的

李巨集毅老師機器學習課程筆記_ML Lecture 3-1: Gradient Descent

####引言: 這個系列的筆記是臺大李巨集毅老師機器學習的課程筆記 視訊連結(bilibili):[李巨集毅機器學習(2017)](https://www.bilibili.com/video/av10590361?from=search&seid=4930602846193099298) 另外已經有

python實現西瓜書《機器學習》習題4.4基尼指數決策,預剪枝及後剪枝

大神程式碼:https://blog.csdn.net/Snoopy_Yuan/article/details/69223240 昨天畫不出樹有點煩躁,隨便找了百度了一點點,還是畫不出來。 今天這道題,其實就是把資訊增益換成基尼指數,本質上的構造樹邏輯是一致的。 不過原始碼有個小錯誤,在上面

Python3實現機器學習經典演算法(四)C4.5決策

一、C4.5決策樹概述   C4.5決策樹是ID3決策樹的改進演算法,它解決了ID3決策樹無法處理連續型資料的問題以及ID3決策樹在使用資訊增益劃分資料集的時候傾向於選擇屬性分支更多的屬性的問題。它的大部分流程和ID3決策樹是相同的或者相似的,可以參考我的上一篇部落格:https://www.cnblogs.

機器學習演算法之:決策 (decision trees)

> By joey周琦 概述 線性模型一般variance小,bias大;而樹模型一般variance大,bias小 決策樹的優點:具有可讀性,分類速度快 一般包含三個步驟: 特徵選擇 決策樹生成 剪枝

機器學習》讀書筆記,第三章決策學習

決策樹學習是應用最廣泛的歸納推理演算法之一。 它是一種逼近離散值函式的方法,對噪聲資料有很好的健壯性且能夠學習析取表示式 本章描述了一系列決策樹學習演算法,包括如ID3、ASSISTANT和C4.5 這些決策樹學習方法搜尋一個完整表示的假設空間,從而避免了受限假設空間的不足

機器學習經典演算法詳解及Python實現--決策Decision Tree)

(一)認識決策樹 1,決策樹分類原理 決策樹是通過一系列規則對資料進行分類的過程。它提供一種在什麼條件下會得到什麼值的類似規則的方法。決策樹分為分類樹和迴歸樹兩種,分類樹對離散變數做決策樹,迴歸樹對連續變數做決策樹。 近來的調查表明決策樹也是最經常使用的資料探勘演算法,它

機器學習--手寫數字識別(KNN、決策

KNN 及決策樹演算法為監督學習中的兩種簡單演算法。 KNN KNN演算法(鄰近演算法)的核心思想是如果一個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。 歐式距離的計算公式: 假設每個樣本有兩個特徵值,如 A

(參評)機器學習筆記——鳶尾花資料集(KNN、決策、樸素貝葉斯分析)

最開始選取鳶尾花資料集來了解決策樹模型時,筆者是按照學習報告的形式來寫得,在這裡將以原形式上傳。格式較為繁複,希望讀者可以耐心看完,謝謝大家。目錄 6.總結 7.問題 1、問題描述  iris是鳶尾植物,這裡儲存了其萼片和花瓣的長寬,共4個屬性,鳶尾

機器學習回顧篇(8):CART決策演算法

注:本系列所有部落格將持續更新併發布在github和gitee上,您可以通過github、gitee下載本系列所有文章筆記檔案。 1 引言 上一篇部落格中介紹了ID3和C4.5兩種決策樹演算法,這兩種決策樹都只能用於分類問題,而本文要說的CART(classification and regression

機器學習——十大資料探勘之一的決策CART演算法

本文始發於個人公眾號:TechFlow,原創不易,求個關注 今天是**機器學習專題**的第23篇文章,我們今天分享的內容是十大資料探勘演算法之一的CART演算法。 CART演算法全稱是**Classification and regression tree**,也就是分類迴歸樹的意思。和之前介紹

3 Spark機器學習 spark MLlib 矩陣向量、矩陣運算Breeze-1

機器學習裡矩陣是必不可少的,無論Python、Java能做機器學習的語言,都會提供比較優質的矩陣庫。 spark mllib中提供的矩陣庫是Breeze,可以簡單看看Breeze庫的情況。 ScalaNLP是一套機器學習和數值計算的庫,主要是關於科學計算、機器學習和自

Spark 官方文件》機器學習(MLlib)指南

我們推薦您使用spark.ml,因為基於DataFrames的API更加的通用而且靈活。不過我們也會繼續支援spark.mllib包。使用者可以放心使用,spark.mllib還會持續地增加新的功能。不過開發者需要注意,如果新的演算法能夠適用於機器學習管道的概念,就應該將其放到spark.ml包中,如:特