R語言 RevoScaleR的大規模數據集決策樹模型應用案例

原文:http://tecdat.cn/?p=3703

RevoScaleR中的rxDTree函數使用基於分類的遞歸分區算法來擬合基於樹的模型獲得的模型相似於推薦的ř包rpart包產生的模型支持分類型樹和迴歸型樹。; 與rpart包同樣,差別由響應變量的性質決定:因子響應生成分類樹; 數字響應生成迴歸樹。node

rxDTree算法

決策樹是普遍用於分類和迴歸的有效算法。構建決策樹一般要求對全部連續變量進行排序,以便決定在何處拆分數據。在處理大數據時,此排序步驟變得時間和內存太高。已經提出了各類技術來克服排序障礙,其能夠大體分爲兩組:執行數據預排序或使用數據的近似概要統計雖然預排序技術更接近標準決策樹算法,但它們沒法容納很是大的數據集這些大數據決策樹一般以各類方式並行化,以實現大規模學習:算法

該rxDTree算法是一種具備水平數據並行性的近似決策樹算法,專門用於處理很是大的數據集。它使用直方圖做爲數據的近似緊湊表示,並以廣度優先的方式構建決策樹。該算法能夠在並行設置中執行,例如多核機器或具備主 - 工程體系結構的分佈式環境。每一個工做者只得到數據觀察的一個子集,但能夠查看到目前爲止構建的完整樹。它根據它看到的觀察結果構建直方圖,它基本上將數據壓縮到固定數量的內存。而後將該數據的近似描述發送給具備恆定的低通訊複雜度的主設備,而與數據集的大小無關。主設備集成從每一個工做人員接收的信息,並肯定要拆分的終端樹節點以及如何拆分。因爲直方圖是並行構建的,所以即便對於很是大的數據集也能夠快速構建。併發

使用rxDTree,您能夠經過指定直方圖的最大二進制數來控制時間複雜度和預測精度之間的平衡。該算法在每一個區間中構建具備大體相等數量的觀察的直方圖,而且將區間的邊界做爲終端樹節點的候選分割。因爲僅檢查有限數量的分割位置,所以可能選擇次優分割點使得整個樹與由標準算法構造的樹不一樣。可是,分析代表,並行樹的錯誤率接近串行樹的錯誤率,即便樹不相同您能夠在直方圖中設置箱的數量,以控制準確度和速度之間的權衡:框架

當倉的數量等於或超過觀察數量的整數預測值時,rxDTree算法產生與標準排序算法相同的結果。tcp

一個簡單的分類樹

在以前的文章中,咱們將簡單的邏輯迴歸模型擬合爲rpart包的駝背數據使用rxDTree ,以下所示:分佈式

kyphTree
 
rxDTree(公式=脊柱後凸〜年齡+開始+數字,數據=脊柱後凸,
cp = 0.01)
數據:脊柱後凸
有效觀察數:81
缺失觀察數:0

樹表示:
n = 81

node),split,n,loss,yval,(yprob)
*表示終端節點

1)根81 17缺席(0.79012346 0.20987654)
2)開始> = 8.5 62 6缺席(0.90322581 0.09677419)
4)開始> = 14.5 29 0缺席(1.00000000 0.00000000)*
5)開始<14.5 33 6缺席(0.81818182 0.18181818)
10)年齡<55 12 0缺席(1.00000000 0.00000000)*
11)年齡> = 55 21 6缺席(0.71428571 0.28571429)
22)年齡> = 111 14 2缺席(0.85714286 0.14285714)*
23)年齡<111 7 3(0.42857143 0.57142857)*
3)開始<8.5 19 8如今(0.42105263 0.57894737)*

回想一下咱們以前用rxCube擬合這個模型的結論:術後併發症的機率若是開始是頸椎而且手術中涉及更多的椎骨,則脊柱後凸彷佛更大相似地,彷佛對年齡的依賴是非線性的:它首先隨着年齡而增長,峯值在5-9範圍內,而後再次減少。函數

rxDTree模型彷佛證明了這些早期的結論 - 對於開始<8.5,19名觀察對象中的11名發展爲脊柱後凸,而29名受試者中沒有一名患者開始> = 14.5。對於剩餘的33名受試者,年齡是主要的分裂因素,正如咱們以前觀察到的,5至9歲的患者發生脊柱後凸的機率最高。學習

返回的對象kyphTree是類rxDTree的對象該rxDTree類是密切仿照rpart包包類,所以該類的對象rxDTree有一個最重要的組成部分rpart包包對象:框架,cptable,拆分等默認狀況下,然而, rxDTree對象不從類繼承rpart包包。可是,您可使用rxAddInheritance函數將軟件rpart繼承添加到rxDTree對象。測試

一個簡單的迴歸樹

做爲迴歸樹的一個簡單示例,考慮mtcars數據集,並使用置換(DISP)做爲預測值來擬合汽油里程(MPG):大數據

#一個簡單的迴歸樹

mtcarTree < - rxDTree(mpg~disp,data = mtcars)
mtcarTree
 
rxDTree(公式= mpg~disp,data = mtcars)
數據:mtcars
有效觀察數:32
缺失觀察數:0

樹表示:
n = 32

node),split,n,deviance,yval
*表示終端節點

1)root 32 1126.0470 20.09063
2)disp> = 163.5 18 143.5894 15.99444 *
3)disp <163.5 14 292.1343 25.35714 *

大型汽車(發動機排量大於163.5立方英寸)和小型汽車之間存在明顯的區別。

一個更大的迴歸樹模型

做爲一個更復雜的例子,咱們返回人口普查員工數據咱們使用perwt變量做爲機率權重,建立一個迴歸樹,根據年齡,性別和工做週數預測工資收入:

#一個更大的迴歸樹模型

maxDepth = 3,minBucket = 30000,data = censusWorkers)
incomeTree
 
rxDTree( incwage~年齡+性別+ wkswork1,數據=人口普查工做者,
pweights =「perwt」,minBucket = 30000,maxDepth = 3)
文件:C:\ Program Files \ Microsoft \ MRO-for-RRE \ 8.0 \ R-3.2.2 \ library \ RevoScaleR \ SampleData \ CensusWorkers.xdf
有效觀察數:351121
缺失觀察數:0

樹表示:
n = 351121

node),split,n,deviance,yval
*表示終端節點

1)root 351121 1.177765e + 16 35788.47
2)性別=女161777 2.271425e + 15 26721.09
4)wkswork1 <51.5 56874 5.757587e + 14 19717.74 *
5)wkswork1> = 51.5 104903 1.608813e + 15 30505.87
10)年齡<34.5 31511 2.500078e + 14 25836.32 *
11)年齡> = 34.5 73392 1.338235e + 15 32576.74 *
3)性別=男性189344 9.008506e + 15 43472.71
6)年齡<31.5 48449 6.445334e + 14 27577.80 *
7)年齡> = 31.5 140895 8.010642e + 15 49221.82
14)wkswork1 <51.5 34359 1.550839e + 15 37096.62 *
15)wkswork1> = 51.5 106536 6.326896e + 15 53082.08 *

這裏的主要分裂(鑑於咱們對教程中的數據集的分析:用RevoScaleR分析美國人口普查數據,這並不奇怪)是性別; 女性平均收入大大低於男性額外的分裂也不足爲奇。老年工人的收入高於年輕工人,而那些工做時間更長的人每每比那些工做時間更少的人賺得更多。

 模型擬合

該rxDTree功能有許多用於控制模型的擬合選項.rpart用戶熟悉這些控制參數中的大多數,但在某些狀況下已修改默認值以更好地支持大型數據樹模型。能夠在rxDTree幫助文件中找到這些選項的完整列表,但在咱們的測試中發現如下內容對於控制使用rxDTree擬合模型所需的時間最有用:

  • XVAL:控制用於執行交叉驗證的摺疊數默認值爲2容許進行一些修剪; 一旦你在模型中關閉,你可能想要增長最終擬合和修剪的值。
  • MAXDEPTH:設置樹的任何節點的最大深度隨着深度的增長,計算量變得愈來愈快,所以咱們建議MAXDEPTH爲10到15。
  • maxCompete:指定輸出中保留的「競爭對手拆分」的數量默認狀況下,rxDTree將此值設置爲0,但設置爲3或4可用於診斷目的,以肯定選擇特定拆分的緣由。
  • maxSurrogate:指定輸出中保留的代理拆分數一樣,默認狀況下,rxDTree將此值設置爲0。當該觀察值缺乏主要分割變量時,使用代理分割來分配觀察值。
  • maxNumBins:。控制每一個變量使用的最大紙槽數管理倉的數量對於控制內存使用很是重要默認狀況下,對於小到中等大小的數據集(最多約一百萬個觀測值),使用較大的101和觀測數量的平方根,但對於較大的集合,使用1001個箱。對於具備連續預測變量的小數據集,您可能會發現須要增長maxNumBins以得到相似於rpart包的模型。

對於大型數據集(100000或更多觀測值),您可能須要調整如下參數以得到有意義的模型:

  • CP:。複雜性參數,並設置拆分在被接受以前必須下降複雜程度的標準咱們將默認值設置爲0,並建議使用MAXDEPTH和minBucket來控制樹的大小若是要指定CP值,請從保守值開始,例如rpart包的0.01; 若是你沒有看到足夠數量的分裂,那麼將cp減去10的冪,直到你這樣作爲止。對於咱們的大型航空公司數據,咱們發現有趣的模型以大約1e-4的cp開頭。
  • minSplit,minBucket:肯定在嘗試拆分以前節點中必須有多少觀察值(minSplit)以及終端節點中必須保留多少觀察值(minBucket)。

大數據樹模型

使用rxDTree能夠將決策樹擴展爲很是大的數據集,但應謹慎使用 - 錯誤選擇模型參數很容易致使須要數小時或更長時間才能算算的模型,即便在分佈式計算環境中也是如此。例如,在教程:使用RevoScaleR加載和分析大型航空公司數據集時,咱們使用大型航空公司數據估算線性模型,並使用變量產地做爲多個模型中的預測變量該產地變量是373級的水平,沒有明顯排序的因素變量將此變量合併到rxDTree中執行兩級以上分類的模型很容易消耗數小時的計算時間爲了防止這種意外後果,rxDTree有一個參數maxUnorderedLevels,默認爲32。; 在原產地的狀況下,此參數將標記錯誤。然而,按區域對原產機場進行分組的「區域」因子變量多是一個有用的代理,而且能夠構形成僅具備有限數量的級別。數字和有序因子預測器更容易合併到模型中。

做爲大型數據分類樹的示例,請使用完整航空公司數據的7%子樣本考慮如下簡單模型(使用變量ArrDel15表示到達延遲爲15分鐘或更長時間的航班):

默認的CP爲0會產生大量的分裂; 指定cp = 1e-5會在此模型中生成更易於管理的拆分集:

airlineTree
呼叫:
rxDTree(公式= ArrDel15~CRSDepTime + DayOfWeek,data = sampleAirData,
maxDepth = 5,cp = 1e-05,blocksPerRead = 30)
文件:C:\ MRS \ Data \ AirOnTime7Pct.xdf
有效觀察數:10186272
失蹤觀察次數:213483

樹表示:
n = 10186272

node),split,n,deviance,yval
*表示終端節點

1)root 10186272 1630331.000 0.20008640
2)CRSDepTime <13.1745 4941190 642452.000 0.15361830
4)CRSDepTime <8.3415 1777685 189395.700 0.12123970
8)CRSDepTime> = 0.658 1717573 178594.900 0.11787560
16)CRSDepTime <6.7665 599548 52711.450 0.09740671
32)CRSDepTime> = 1.625 578762 49884.260 0.09526714 *
33)CRSDepTime <1.625 20786 2750.772 0.15698070 *
17)CRSDepTime> = 6.7665 1118025 125497.500 0.12885220
34)DayOfWeek = Sun 134589 11722.540 0.09638975 *
35)DayOfWeek =週一,週二,週三,週四,週五,週六983436 113613.80 0.13329490 *
9)CRSDepTime <0.658 60112 10225.960 0.21736090
18)CRSDepTime> = 0.2415 9777 1429.046 0.17776410 *
19)CRSDepTime <0.2415 50335 8778.609 0.22505220 *
5)CRSDepTime> = 8.3415 3163505 450145.400 0.17181290
10)CRSDepTime <11.3415 1964400 268472.400 0.16335320
20)DayOfWeek = Sun 271900 30839.160 0.13043400
40)CRSDepTime <9.7415 126700 13381.800 0.12002370 *
41)CRSDepTime> = 9.7415 145200 17431.650 0.13951790 *
21)DayOfWeek =週一,週二,週三,週四,週五,週六1692500 237291.300 0.16864170
42)DayOfWeek =星期二,星期三,星期六835355 113384.500 0.16196470 *
43)DayOfWeek =星期一,星期四,星期五857145 123833.200 0.17514890 *
11)CRSDepTime> = 11.3415 1199105 181302.000 0.18567180
22)DayOfWeek =週一,週二,週三,週六,週日852016 124610.900 0.17790390
44)DayOfWeek =週二,週日,太陽342691 48917.520 0.17250230 *
45)DayOfWeek =週一,週三,週六509325 75676.600 0.18153830 *
23)DayOfWeek = Thur,Fri 347089 56513.560 0.20474000 *
3)CRSDepTime> = 13.1745 5245082 967158.500 0.24386220
6)DayOfWeek =週一,週二,週三,週六,週日3708992 651771.300 0.22746990
12)DayOfWeek = Sat 635207 96495.570 0.18681000
24)CRSDepTime> = 20.2745 87013 12025.600 0.16564190 *
25)CRSDepTime <20.2745 548194 84424.790 0.19016990 *
13)DayOfWeek =週一,週二,週三,週日3073785 554008.600 0.23587240
26)CRSDepTime <16.508 1214018 203375.700 0.21281150
52)CRSDepTime <15.1325 709846 114523.300 0.20223400 *
53)CRSDepTime> = 15.1325 504172 88661.120 0.22770400 *
27)CRSDepTime> = 16.508 1859767 349565.800 0.25092610
54)DayOfWeek =週一,週二928523 168050.900 0.23729730 *
55)DayOfWeek = Wed,Sun 931244 181170.600 0.26451500 *
7)DayOfWeek = Thur,Fri 1536090 311984.200 0.28344240
14)CRSDepTime <15.608 445085 82373.020 0.24519140
28)CRSDepTime <14.6825 273682 49360.240 0.23609880 *
29)CRSDepTime> = 14.6825 171403 32954.030 0.25970960 *
15)CRSDepTime> = 15.608 1091005 228694.300 0.29904720
30)CRSDepTime> = 21.9915 64127 11932.930 0.24718140 *
31)CRSDepTime <21.9915 1026878 216578.100 0.30228620
62)CRSDepTime <17.0745 264085 53451.260 0.28182970 *
63)CRSDepTime> = 17.0745 762793 162978.000 0.30936830 *

查看擬合對象cptable組件,咱們能夠看看是否已通過度擬合模型:

airlineTree $ cptable
CP nsplit rel error xerror xstd
1 1.270950e-02 0 1.0000000 1.0000002 0.0004697734
2 2.087342e-03 1 0.9872905 0.9873043 0.0004629111
3 1.785488e-03 2 0.9852032 0.9852215 0.0004625035
4 7.772395e-04 3 0.9834177 0.9834381 0.0004608330
5 6.545095e-04 4 0.9826404 0.9826606 0.0004605065
6 5.623968e-04 5 0.9819859 0.9820200 0.0004602950
7 3.525848e-04 6 0.9814235 0.9814584 0.0004602578
8 2.367018e-04 7 0.9810709 0.9811071 0.0004600062
9 2.274981e-04 8 0.9808342 0.9808700 0.0004597725
10 2.112635e-04 9 0.9806067 0.9806567 0.0004596187
11 2.097651e-04 10 0.9803955 0.9804365 0.0004595150
12 1.173008e-04 11 0.9801857 0.9803311 0.0004594245
13 1.124180e-04 12 0.9800684 0.9800354 0.0004592792
14 1.089414e-04 13 0.9799560 0.9800354 0.0004592792
15 9.890134e-05 14 0.9798471 0.9799851 0.0004592187
16 9.125152e-05 15 0.9797482 0.9798766 0.0004591605
17 4.687397e-05 16 0.9796569 0.9797504 0.0004591074
18 4.510554e-05 17 0.9796100 0.9797292 0.0004590784
19 3.603837e-05 18 0.9795649 0.9796812 0.0004590301
20 2.771093e-05 19 0.9795289 0.9796383 0.0004590247
21 1.577140e-05 20 0.9795012 0.9796013 0.0004590000
22 1.122899e-05 21 0.9794854 0.9795671 0.0004589736
23 1.025944e-05 22 0.9794742 0.9795560 0.0004589678
24 1.000000e-05 23 0.9794639 0.9795455 0.0004589660

隨着分裂數量的增長,咱們看到交叉驗證偏差(xerror)穩步降低,但請注意,在大約nsplit = 11時,變化率會急劇減慢。最佳模型可能很是接近這裏。(經過數據的總數)等於maxDepth + 3的基數加上xVal乘以(maxDepth + 2),其中xVal是交叉驗證的摺疊數,maxDepth是最大樹深度。所以深度10個具備4倍交叉驗證的樹須要13 + 48或61個數據經過)。

要修剪樹,請使用prune.rxDTree函數:

airlineTree4
呼叫:
rxDTree(公式= ArrDel15~CRSDepTime + DayOfWeek,data = sampleAirData,
maxDepth = 5,cp = 1e-05,blocksPerRead = 30)
文件:C:\ MRS \ Data \ AirOnTime7Pct.xdf
有效觀察數:10186272
失蹤觀察次數:213483

樹表示:
n = 10186272

node),split,n,deviance,yval
*表示終端節點

1)root 10186272 1630331.00 0.20008640
2)CRSDepTime <13.1745 4941190 642452.00 0.15361830
4)CRSDepTime <8.3415 1777685 189395.70 0.12123970
8)CRSDepTime> = 0.658 1717573 178594.90 0.11787560
16)CRSDepTime <6.7665 599548 52711.45 0.09740671 *
17)CRSDepTime> = 6.7665 1118025 125497.50 0.12885220 *
9)CRSDepTime <0.658 60112 10225.96 0.21736090 *
5)CRSDepTime> = 8.3415 3163505 450145.40 0.17181290
10)CRSDepTime <11.3415 1964400 268472.40 0.16335320
20)DayOfWeek = Sun 271900 30839.16 0.13043400 *
21)DayOfWeek =週一,週二,週三,週四,週五,週六1692500 237291.30 0.16864170 *
11)CRSDepTime> = 11.3415 1199105 181302.00 0.18567180
22)DayOfWeek =週一,週二,週三,週六,週日852016 124610.90 0.17790390 *
23)DayOfWeek = Thur,Fri 347089 56513.56 0.20474000 *
3)CRSDepTime> = 13.1745 5245082 967158.50 0.24386220
6)DayOfWeek =週一,週二,週三,週六,週日3708992 651771.30 0.22746990
12)DayOfWeek =週六635207 96495.57 0.18681000 *
13)DayOfWeek =週一,週二,週三,週日3073785 554008.60 0.23587240
26)CRSDepTime <16.508 1214018 203375.70 0.21281150
52)CRSDepTime <15.1325 709846 114523.30 0.20223400 *
53)CRSDepTime> = 15.1325 504172 88661.12 0.22770400 *
27)CRSDepTime> = 16.508 1859767 349565.80 0.25092610
54)DayOfWeek =週一,週二928523 168050.90 0.23729730 *
55)DayOfWeek = Wed,Sun 931244 181170.60 0.26451500 *
7)DayOfWeek = Thur,Fri 1536090 311984.20 0.28344240
14)CRSDepTime <15.608 445085 82373.02 0.24519140 *
15)CRSDepTime> = 15.608 1091005 228694.30 0.29904720
30)CRSDepTime> = 21.9915 64127 11932.93 0.24718140 *
31)CRSDepTime <21.9915 1026878 216578.10 0.30228620 *

若是安裝了軟件rpart,則prune.rxDTree充當剪枝函數的方法,所以您能夠更簡單地調用它:

對於符合2倍或更高交叉驗證的模型,使用交叉驗證標準錯誤(cptable組件的一部分)做爲修剪指南頗有用.rpart函數plotcp對此有用:

這產生如下圖:

在此交互式樹中,單擊節點將展開並將節點摺疊到該分支的最後一個視圖。若是使用CTRL +單擊,則樹僅顯示所選節點的子項。若是單擊「ALT +單擊」,樹將顯示所選節點下的全部級別。沒法擴展稱爲葉子或終端節點的方形節點。

要獲取其餘信息,請將鼠標懸停在節點上以顯示節點詳細信息,例如其名稱,下一個拆分變量,其值,N,預測值以及其餘詳細信息(如丟失或誤差)。

若是使用rxAddInheritance函數提供rpart繼承,也能夠將rpart plot和text方法與rxDTree對象一塊兒使用:

提供如下圖表:

有問題歡迎下方留言!

相關文章
相關標籤/搜索