R語言 RevoScaleR的大規(guī)模數(shù)據(jù)集決策樹模型應(yīng)用案例
原文:http://tecdat.cn/?p=3703
?

RevoScaleR中的rxDTree函數(shù)使用基于分類的遞歸分區(qū)算法來擬合基于樹的模型得到的模型類似于推薦的?包rpart包產(chǎn)生的模型支持分類型樹和回歸型樹。; 與rpart包一樣,差異由響應(yīng)變量的性質(zhì)決定:因子響應(yīng)生成分類樹; 數(shù)字響應(yīng)生成回歸樹。
rxDTree算法
決策樹是廣泛用于分類和回歸的有效算法。構(gòu)建決策樹通常要求對所有連續(xù)變量進行排序,以便決定在何處拆分數(shù)據(jù)。在處理大數(shù)據(jù)時,此排序步驟變得時間和內(nèi)存過高。已經(jīng)提出了各種技術(shù)來克服排序障礙,其可以大致分為兩組:執(zhí)行數(shù)據(jù)預(yù)排序或使用數(shù)據(jù)的近似概要統(tǒng)計雖然預(yù)排序技術(shù)更接近標準決策樹算法,但它們無法容納非常大的數(shù)據(jù)集這些大數(shù)據(jù)決策樹通常以各種方式并行化,以實現(xiàn)大規(guī)模學習:
該rxDTree算法是一種具有水平數(shù)據(jù)并行性的近似決策樹算法,專門用于處理非常大的數(shù)據(jù)集。它使用直方圖作為數(shù)據(jù)的近似緊湊表示,并以廣度優(yōu)先的方式構(gòu)建決策樹。該算法可以在并行設(shè)置中執(zhí)行,例如多核機器或具有主 - 工程體系結(jié)構(gòu)的分布式環(huán)境。每個工作者只獲得數(shù)據(jù)觀察的一個子集,但可以查看到目前為止構(gòu)建的完整樹。它根據(jù)它看到的觀察結(jié)果構(gòu)建直方圖,它基本上將數(shù)據(jù)壓縮到固定數(shù)量的內(nèi)存。然后將該數(shù)據(jù)的近似描述發(fā)送給具有恒定的低通信復雜度的主設(shè)備,而與數(shù)據(jù)集的大小無關(guān)。主設(shè)備集成從每個工作人員接收的信息,并確定要拆分的終端樹節(jié)點以及如何拆分。由于直方圖是并行構(gòu)建的,因此即使對于非常大的數(shù)據(jù)集也可以快速構(gòu)建。
使用rxDTree,您可以通過指定直方圖的最大二進制數(shù)來控制時間復雜度和預(yù)測精度之間的平衡。該算法在每個區(qū)間中構(gòu)建具有大致相等數(shù)量的觀察的直方圖,并且將區(qū)間的邊界作為終端樹節(jié)點的候選分割。由于僅檢查有限數(shù)量的分割位置,因此可能選擇次優(yōu)分割點使得整個樹與由標準算法構(gòu)造的樹不同。但是,分析表明,并行樹的錯誤率接近串行樹的錯誤率,即使樹不相同您可以在直方圖中設(shè)置箱的數(shù)量,以控制準確度和速度之間的權(quán)衡:
當倉的數(shù)量等于或超過觀察數(shù)量的整數(shù)預(yù)測值時,rxDTree算法產(chǎn)生與標準排序算法相同的結(jié)果。
一個簡單的分類樹
在之前的文章中,我們將簡單的邏輯回歸模型擬合為rpart包的駝背數(shù)據(jù)使用rxDTree ,如下所示:
kyphTree
rxDTree(公式=脊柱后凸?年齡+開始+數(shù)字,數(shù)據(jù)=脊柱后凸,
cp = 0.01)
數(shù)據(jù):脊柱后凸
有效觀察數(shù):81
缺失觀察數(shù):0
樹表示:
n = 81
node),split,n,loss,yval,(yprob)
*表示終端節(jié)點
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現(xiàn)在(0.42105263 0.57894737)*
?
回想一下我們之前用rxCube擬合這個模型的結(jié)論:術(shù)后并發(fā)癥的概率如果開始是頸椎并且手術(shù)中涉及更多的椎骨,則脊柱后凸似乎更大類似地,似乎對年齡的依賴是非線性的:它首先隨著年齡而增加,峰值在5-9范圍內(nèi),然后再次減小。
rxDTree模型似乎證實了這些早期的結(jié)論 - 對于開始<8.5,19名觀察對象中的11名發(fā)展為脊柱后凸,而29名受試者中沒有一名患者開始> = 14.5。對于剩余的33名受試者,年齡是主要的分裂因素,正如我們之前觀察到的,5至9歲的患者發(fā)生脊柱后凸的概率最高。
返回的對象kyphTree是類rxDTree的對象該rxDTree類是密切仿照rpart包包類,因此該類的對象rxDTree有一個最重要的組成部分rpart包包對象:框架,cptable,拆分等默認情況下,然而, rxDTree對象不從類繼承rpart包包。但是,您可以使用rxAddInheritance函數(shù)將軟件rpart繼承添加到rxDTree對象。
一個簡單的回歸樹
作為回歸樹的一個簡單示例,考慮mtcars數(shù)據(jù)集,并使用置換(DISP)作為預(yù)測值來擬合汽油里程(MPG):
?
#一個簡單的回歸樹
mtcarTree < - rxDTree(mpg~disp,data = mtcars)
mtcarTree
rxDTree(公式= mpg~disp,data = mtcars)
數(shù)據(jù):mtcars
有效觀察數(shù):32
缺失觀察數(shù):0
樹表示:
n = 32
node),split,n,deviance,yval
*表示終端節(jié)點
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 *
?
大型汽車(發(fā)動機排量大于163.5立方英寸)和小型汽車之間存在明顯的區(qū)別。
一個更大的回歸樹模型
作為一個更復雜的例子,我們返回人口普查員工數(shù)據(jù)我們使用perwt變量作為概率權(quán)重,創(chuàng)建一個回歸樹,根據(jù)年齡,性別和工作周數(shù)預(yù)測工資收入:
#一個更大的回歸樹模型
maxDepth = 3,minBucket = 30000,data = censusWorkers)
incomeTree
rxDTree( incwage~年齡+性別+ wkswork1,數(shù)據(jù)=人口普查工作者,
pweights =“perwt”,minBucket = 30000,maxDepth = 3)
文件:C:\ Program Files \ Microsoft \ MRO-for-RRE \ 8.0 \ R-3.2.2 \ library \ RevoScaleR \ SampleData \ CensusWorkers.xdf
有效觀察數(shù):351121
缺失觀察數(shù):0
樹表示:
n = 351121
node),split,n,deviance,yval
*表示終端節(jié)點
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 *
?
這里的主要分裂(鑒于我們對教程中的數(shù)據(jù)集的分析:用RevoScaleR分析美國人口普查數(shù)據(jù),這并不奇怪)是性別; 女性平均收入大大低于男性額外的分裂也不足為奇。老年工人的收入高于年輕工人,而那些工作時間更長的人往往比那些工作時間更少的人賺得更多。
?模型擬合
該rxDTree功能有許多用于控制模型的擬合選項.rpart用戶熟悉這些控制參數(shù)中的大多數(shù),但在某些情況下已修改默認值以更好地支持大型數(shù)據(jù)樹模型。可以在rxDTree幫助文件中找到這些選項的完整列表,但在我們的測試中發(fā)現(xiàn)以下內(nèi)容對于控制使用rxDTree擬合模型所需的時間最有用:
XVAL:控制用于執(zhí)行交叉驗證的折疊數(shù)默認值為2允許進行一些修剪; 一旦你在模型中關(guān)閉,你可能想要增加最終擬合和修剪的值。
MAXDEPTH:設(shè)置樹的任何節(jié)點的最大深度隨著深度的增加,計算量變得越來越快,因此我們建議MAXDEPTH為10到15。
maxCompete:指定輸出中保留的“競爭對手拆分”的數(shù)量默認情況下,rxDTree將此值設(shè)置為0,但設(shè)置為3或4可用于診斷目的,以確定選擇特定拆分的原因。
maxSurrogate:指定輸出中保留的代理拆分數(shù)同樣,默認情況下,rxDTree將此值設(shè)置為0。當該觀察值缺少主要分割變量時,使用代理分割來分配觀察值。
maxNumBins:??刂泼總€變量使用的最大紙槽數(shù)管理倉的數(shù)量對于控制內(nèi)存使用非常重要默認情況下,對于小到中等大小的數(shù)據(jù)集(最多約一百萬個觀測值),使用較大的101和觀測數(shù)量的平方根,但對于較大的集合,使用1001個箱。對于具有連續(xù)預(yù)測變量的小數(shù)據(jù)集,您可能會發(fā)現(xiàn)需要增加maxNumBins以獲得類似于rpart包的模型。
對于大型數(shù)據(jù)集(100000或更多觀測值),您可能需要調(diào)整以下參數(shù)以獲得有意義的模型:
CP:。復雜性參數(shù),并設(shè)置拆分在被接受之前必須降低復雜程度的標準我們將默認值設(shè)置為0,并建議使用MAXDEPTH和minBucket來控制樹的大小如果要指定CP值,請從保守值開始,例如rpart包的0.01; 如果你沒有看到足夠數(shù)量的分裂,那么將cp減去10的冪,直到你這樣做為止。對于我們的大型航空公司數(shù)據(jù),我們發(fā)現(xiàn)有趣的模型以大約1e-4的cp開頭。
minSplit,minBucket:確定在嘗試拆分之前節(jié)點中必須有多少觀察值(minSplit)以及終端節(jié)點中必須保留多少觀察值(minBucket)。
大數(shù)據(jù)樹模型
使用rxDTree可以將決策樹擴展為非常大的數(shù)據(jù)集,但應(yīng)謹慎使用 - 錯誤選擇模型參數(shù)很容易導致需要數(shù)小時或更長時間才能算算的模型,即使在分布式計算環(huán)境中也是如此。例如,在教程:使用RevoScaleR加載和分析大型航空公司數(shù)據(jù)集時,我們使用大型航空公司數(shù)據(jù)估算線性模型,并使用變量產(chǎn)地作為多個模型中的預(yù)測變量該產(chǎn)地變量是373級的水平,沒有明顯排序的因素變量將此變量合并到rxDTree中執(zhí)行兩級以上分類的模型很容易消耗數(shù)小時的計算時間為了防止這種意外后果,rxDTree有一個參數(shù)maxUnorderedLevels,默認為32。; 在原產(chǎn)地的情況下,此參數(shù)將標記錯誤。然而,按區(qū)域?qū)υa(chǎn)機場進行分組的“區(qū)域”因子變量可能是一個有用的代理,并且可以構(gòu)造成僅具有有限數(shù)量的級別。數(shù)字和有序因子預(yù)測器更容易合并到模型中。
作為大型數(shù)據(jù)分類樹的示例,請使用完整航空公司數(shù)據(jù)的7%子樣本考慮以下簡單模型(使用變量ArrDel15表示到達延遲為15分鐘或更長時間的航班):
默認的CP為0會產(chǎn)生大量的分裂; 指定cp = 1e-5會在此模型中生成更易于管理的拆分集:
airlineTree
呼叫:
rxDTree(公式= ArrDel15~CRSDepTime + DayOfWeek,data = sampleAirData,
maxDepth = 5,cp = 1e-05,blocksPerRead = 30)
文件:C:\ MRS \ Data \ AirOnTime7Pct.xdf
有效觀察數(shù):10186272
失蹤觀察次數(shù):213483
樹表示:
n = 10186272
node),split,n,deviance,yval
*表示終端節(jié)點
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,F(xiàn)ri 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,F(xiàn)ri 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組件,我們可以看看是否已經(jīng)過度擬合模型:
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
?
隨著分裂數(shù)量的增加,我們看到交叉驗證誤差(xerror)穩(wěn)步下降,但請注意,在大約nsplit = 11時,變化率會急劇減慢。最佳模型可能非常接近這里。(通過數(shù)據(jù)的總數(shù))等于maxDepth + 3的基數(shù)加上xVal乘以(maxDepth + 2),其中xVal是交叉驗證的折疊數(shù),maxDepth是最大樹深度。因此深度10個具有4倍交叉驗證的樹需要13 + 48或61個數(shù)據(jù)通過)。
要修剪樹,請使用prune.rxDTree函數(shù):
airlineTree4
呼叫:
rxDTree(公式= ArrDel15~CRSDepTime + DayOfWeek,data = sampleAirData,
maxDepth = 5,cp = 1e-05,blocksPerRead = 30)
文件:C:\ MRS \ Data \ AirOnTime7Pct.xdf
有效觀察數(shù):10186272
失蹤觀察次數(shù):213483
樹表示:
n = 10186272
node),split,n,deviance,yval
*表示終端節(jié)點
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,F(xiàn)ri 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,F(xiàn)ri 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充當剪枝函數(shù)的方法,因此您可以更簡單地調(diào)用它:
對于符合2倍或更高交叉驗證的模型,使用交叉驗證標準錯誤(cptable組件的一部分)作為修剪指南很有用.rpart函數(shù)plotcp對此有用:
這產(chǎn)生以下圖:


在此交互式樹中,單擊節(jié)點將展開并將節(jié)點折疊到該分支的最后一個視圖。如果使用CTRL +單擊,則樹僅顯示所選節(jié)點的子項。如果單擊“ALT +單擊”,樹將顯示所選節(jié)點下的所有級別。無法擴展稱為葉子或終端節(jié)點的方形節(jié)點。
要獲取其他信息,請將鼠標懸停在節(jié)點上以顯示節(jié)點詳細信息,例如其名稱,下一個拆分變量,其值,N,預(yù)測值以及其他詳細信息(如丟失或偏差)。
如果使用rxAddInheritance函數(shù)提供rpart繼承,也可以將rpart plot和text方法與rxDTree對象一起使用:
提供以下圖表:

有問題歡迎下方留言!