R語言基于樹的方法:決策樹,隨機(jī)森林,Bagging,增強(qiáng)樹
原文鏈接:http://tecdat.cn/?p=9859
?
概觀
本文是有關(guān)??基于樹的??回歸和分類方法的。
樹方法簡單易懂,但對于解釋卻非常有用,但就預(yù)測準(zhǔn)確性而言,它們通常無法與最佳監(jiān)督學(xué)習(xí)方法競爭。因此,我們還介紹了Bagging(自助法),隨機(jī)森林和增強(qiáng)樹。這些示例中的每一個都涉及產(chǎn)生多個樹,然后將其合并以產(chǎn)生單個共識預(yù)測。我們看到,合并大量的樹可以大大提高預(yù)測準(zhǔn)確性,但代價是損失解釋能力。
決策樹可以應(yīng)用于回歸和分類問題。我們將首先考慮回歸。
決策樹基礎(chǔ):回歸
我們從一個簡單的例子開始:
我們預(yù)測棒球運(yùn)動員的??Salary
?。
結(jié)果將是一系列分裂規(guī)則。第一個分支會將數(shù)據(jù)分割??Years < 4.5
?為左側(cè)的分支,其余的為右側(cè)。如果我們對此模型進(jìn)行編碼,我們會發(fā)現(xiàn)關(guān)系最終變得稍微復(fù)雜一些。
library(tree)
library(ISLR)
attach(Hitters)
# 刪除NA數(shù)據(jù)
Hitters<- na.omit(Hitters)
# log轉(zhuǎn)換Salary使其更正態(tài)分布
hist(Hitters$Salary)

Hitters$Salary <- log(Hitters$Salary)
hist(Hitters$Salary)

summary(tree.fit)
##
## Regression tree:
## tree(formula = Salary ~ Hits + Years, data = Hitters)
## Number of terminal nodes: ?8
## Residual mean deviance: ?0.271 = 69.1 / 255
## Distribution of residuals:
## ? ?Min. 1st Qu. ?Median ? ?Mean 3rd Qu. ? ?Max.
## -2.2400 -0.2980 -0.0365 ?0.0000 ?0.3230 ?2.1500

現(xiàn)在,我們討論通過對特征空間進(jìn)行分層來構(gòu)建預(yù)測樹。通常,有兩個步驟。
找到最能分隔因變量的變量/拆分,從而產(chǎn)生最低的RSS。
將數(shù)據(jù)分為兩個在第一個標(biāo)識的節(jié)點(diǎn)上的葉子。
在每片葉子中,找到分隔結(jié)果的最佳變量/分割。
目標(biāo)是找到最小化RSS的區(qū)域數(shù)。但是,考慮將每個可能的分區(qū)劃分為J個區(qū)域在計算上是不可行的? 。為此,我們采取了??自上而下的貪婪??的方法。它是自頂向下的,因為我們從所有觀測值都屬于一個區(qū)域的點(diǎn)開始。貪婪是因為在樹構(gòu)建過程的每個步驟中,都會在該特定步驟中選擇最佳拆分,而不是向前看會在將來的某個步驟中生成更好樹的拆分。
一旦創(chuàng)建了所有區(qū)域,我們將使用每個區(qū)域中訓(xùn)練觀察的平均值預(yù)測給定測試觀察的因變量。
剪枝
盡管上面的模型可以對訓(xùn)練數(shù)據(jù)產(chǎn)生良好的預(yù)測,但是基本的樹方法可能會過度擬合數(shù)據(jù),從而導(dǎo)致測試性能不佳。這是因為生成的樹往往過于復(fù)雜。具有較少拆分的較小樹通常以較小的偏差為代價,從而導(dǎo)致方差較低,易于解釋且測試錯誤較低。實現(xiàn)此目的的一種可能方法是僅在每次拆分導(dǎo)致的RSS減少量超過某個(高)閾值時,才構(gòu)建一棵樹。
因此,更好的策略是生成一棵樹,然后??修剪??回去以獲得更好的子樹。
成本復(fù)雜度剪枝算法-也稱為最弱鏈接修剪為我們提供了解決此問題的方法。而不是考慮每個可能的子樹,我們考慮由非負(fù)調(diào)整參數(shù)索引的樹序列??alpha
。
?
trees <- tree(Salary~., train)
plot(trees)
text(trees, pretty=0)

plot(cv.trees)

似乎第7棵樹的偏差最小。然后我們可以剪枝樹。但是,這并不能真正剪枝模型,因此我們可以選擇較小的樹來改善偏差狀態(tài)。這大約是在第四個分支。
prune.trees <- prune.tree(trees, best=4)
plot(prune.trees)
text(prune.trees, pretty=0)

使用剪枝的樹對測試集進(jìn)行預(yù)測。

mean((yhat - test$Salary)^2)
## [1] 0.3531
分類樹
分類樹與回歸樹非常相似,不同之處在于分類樹用于預(yù)測定性而不是定量。
為了增長分類樹,我們使用相同的遞歸二進(jìn)制拆分,但是現(xiàn)在RSS不能用作拆分標(biāo)準(zhǔn)。替代方法是使用??分類錯誤率。雖然很直觀,但事實證明,此方法對于樹木生長不夠敏感。
實際上,另外兩種方法是可取的,盡管它們在數(shù)值上非常相似:
Gini index_是K個??類之間總方差的度量? 。
如果給定類別中的訓(xùn)練觀測值的比例都接近零或一,則__cross-entropy_的值將接近零。
修剪樹時,首選這兩種方法,但如果以最終修剪模型的預(yù)測精度為目標(biāo),則規(guī)則分類錯誤率是優(yōu)選的。
為了證明這一點(diǎn),我們將使用??Heart
?數(shù)據(jù)集。這些數(shù)據(jù)包含AHD
?303名胸痛患者的二進(jìn)制結(jié)果變量? 。結(jié)果被編碼為??Yes
?或??No
?存在心臟病。

dim(Heart)
[1] 303 15
?

到目前為止,這是一棵非常復(fù)雜的樹。讓我們確定是否可以通過使用分類評分方法的交叉驗證來使用修剪后的版本改善擬合度。

cv.trees
## $size
## [1] 16 ?9 ?5 ?3 ?2 ?1
##
## $dev
## [1] 44 45 42 41 41 81
##
## $k
## [1] -Inf ?0.0 ?1.0 ?2.5 ?5.0 37.0
##
## $method
## [1] "misclass"
##
## attr(,"class")
## [1] "prune" ? ? ? ? "tree.sequence"
看起來4棵分裂樹的偏差最小。讓我們看看這棵樹是什么樣子。同樣,我們使用??prune.misclass
?分類設(shè)置。
prune.trees <- prune.misclass(trees, best=4)
plot(prune.trees)
text(prune.trees, pretty=0)

## Confusion Matrix and Statistics
##
## ? ? ? ? ? Reference
## Prediction No Yes
## ? ? ? ?No ?72 ?24
## ? ? ? ?Yes 10 ?45
##
## ? ? ? ? ? ? ? ?Accuracy : 0.775
## ? ? ? ? ? ? ? ? ?95% CI : (0.7, 0.839)
## ? ? No Information Rate : 0.543
## ? ? P-Value [Acc > NIR] : 2.86e-09
##
## ? ? ? ? ? ? ? ? ? Kappa : 0.539
## ?Mcnemar's Test P-Value : 0.0258
##
## ? ? ? ? ? ? Sensitivity : 0.878
## ? ? ? ? ? ? Specificity : 0.652
## ? ? ? ? ?Pos Pred Value : 0.750
## ? ? ? ? ?Neg Pred Value : 0.818
## ? ? ? ? ? ? ?Prevalence : 0.543
## ? ? ? ? ?Detection Rate : 0.477
## ? ?Detection Prevalence : 0.636
## ? ? ? Balanced Accuracy : 0.765
##
## ? ? ? ?'Positive' Class : No
##
在這里,我們獲得了約76%的精度。
那么為什么要進(jìn)行拆分呢?拆分導(dǎo)致節(jié)點(diǎn)純度提高? ,這可能會在使用測試數(shù)據(jù)時有更好的預(yù)測。
樹與線性模型
最好的模型始終取決于當(dāng)前的問題。如果可以通過線性模型近似該關(guān)系,則線性回歸將很可能占主導(dǎo)地位。相反,如果我們在特征和y之間具有復(fù)雜的,高度非線性的關(guān)系,則決策樹可能會勝過傳統(tǒng)方法。
優(yōu)點(diǎn)/缺點(diǎn)
優(yōu)點(diǎn):
樹比線性回歸更容易解釋。
更能反映了人類的決策。
易于以圖形方式顯示。
可以處理沒有偽變量的定性預(yù)測變量。
缺點(diǎn):
樹木通常不具有與傳統(tǒng)方法相同的預(yù)測準(zhǔn)確性,但是,諸如??Bagging,隨機(jī)森林和增強(qiáng)等方法??可以提高性能。
其他例子
?

樹結(jié)構(gòu)中實際使用的變量:“價格”、“ CompPrice”、“年齡”、“收入”、“?ShelveLoc”、“廣告”,終端節(jié)點(diǎn)數(shù):19,殘差平均偏差:0.414 = 92/222,錯誤分類錯誤率:0.0996 = 24/241
在這里,我們看到訓(xùn)練誤差約為9%。我們??plot()
?用來顯示樹結(jié)構(gòu)和??text()
?顯示節(jié)點(diǎn)標(biāo)簽。
plot(sales.tree)
text(sales.tree, pretty=0)

讓我們看看完整的樹如何處理測試數(shù)據(jù)。
## Confusion Matrix and Statistics
##
## ? ? ? ? ? Reference
## Prediction High Low
## ? ? ? High ? 56 ?12
## ? ? ? Low ? ?23 ?68
##
## ? ? ? ? ? ? ? ?Accuracy : 0.78
## ? ? ? ? ? ? ? ? ?95% CI : (0.707, 0.842)
## ? ? No Information Rate : 0.503
## ? ? P-Value [Acc > NIR] : 6.28e-13
##
## ? ? ? ? ? ? ? ? ? Kappa : 0.559
## ?Mcnemar's Test P-Value : 0.091
##
## ? ? ? ? ? ? Sensitivity : 0.709
## ? ? ? ? ? ? Specificity : 0.850
## ? ? ? ? ?Pos Pred Value : 0.824
## ? ? ? ? ?Neg Pred Value : 0.747
## ? ? ? ? ? ? ?Prevalence : 0.497
## ? ? ? ? ?Detection Rate : 0.352
## ? ?Detection Prevalence : 0.428
## ? ? ? Balanced Accuracy : 0.779
##
## ? ? ? ?'Positive' Class : High
##
約74%的測試錯誤率相當(dāng)不錯,但是我們可以通過交叉驗證來改善它。

在這里,我們看到最低的錯誤分類錯誤是模型4的?,F(xiàn)在我們可以將樹修剪為4模型。

## Confusion Matrix and Statistics
##
## ? ? ? ? ? Reference
## Prediction High Low
## ? ? ? High ? 52 ?20
## ? ? ? Low ? ?27 ?60
##
## ? ? ? ? ? ? ? ?Accuracy : 0.704
## ? ? ? ? ? ? ? ? ?95% CI : (0.627, 0.774)
## ? ? No Information Rate : 0.503
## ? ? P-Value [Acc > NIR] : 2.02e-07
##
## ? ? ? ? ? ? ? ? ? Kappa : 0.408
## ?Mcnemar's Test P-Value : 0.381
##
## ? ? ? ? ? ? Sensitivity : 0.658
## ? ? ? ? ? ? Specificity : 0.750
## ? ? ? ? ?Pos Pred Value : 0.722
## ? ? ? ? ?Neg Pred Value : 0.690
## ? ? ? ? ? ? ?Prevalence : 0.497
## ? ? ? ? ?Detection Rate : 0.327
## ? ?Detection Prevalence : 0.453
## ? ? ? Balanced Accuracy : 0.704
##
## ? ? ? ?'Positive' Class : High
##
這并不能真正改善我們的分類,但是我們大大簡化了模型。
## CART
##
## 241 samples
## ?10 predictors
## ? 2 classes: 'High', 'Low'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
##
## Summary of sample sizes: 217, 217, 216, 217, 217, 217, ...
##
## Resampling results across tuning parameters:
##
## ? cp ? ?ROC ?Sens ?Spec ?ROC SD ?Sens SD ?Spec SD
## ? 0.06 ?0.7 ?0.7 ? 0.7 ? 0.1 ? ? 0.2 ? ? ?0.1
## ? 0.1 ? 0.6 ?0.7 ? 0.6 ? 0.2 ? ? 0.2 ? ? ?0.2
## ? 0.4 ? 0.5 ?0.3 ? 0.8 ? 0.09 ? ?0.3 ? ? ?0.3
##
## ROC was used to select the optimal model using ?the largest value.
## The final value used for the model was cp = 0.06.

## Confusion Matrix and Statistics
##
## ? ? ? ? ? Reference
## Prediction High Low
## ? ? ? High ? 56 ?21
## ? ? ? Low ? ?23 ?59
##
## ? ? ? ? ? ? ? ?Accuracy : 0.723
## ? ? ? ? ? ? ? ? ?95% CI : (0.647, 0.791)
## ? ? No Information Rate : 0.503
## ? ? P-Value [Acc > NIR] : 1.3e-08
##
## ? ? ? ? ? ? ? ? ? Kappa : 0.446
## ?Mcnemar's Test P-Value : 0.88
##
## ? ? ? ? ? ? Sensitivity : 0.709
## ? ? ? ? ? ? Specificity : 0.738
## ? ? ? ? ?Pos Pred Value : 0.727
## ? ? ? ? ?Neg Pred Value : 0.720
## ? ? ? ? ? ? ?Prevalence : 0.497
## ? ? ? ? ?Detection Rate : 0.352
## ? ?Detection Prevalence : 0.484
## ? ? ? Balanced Accuracy : 0.723
##
## ? ? ? ?'Positive' Class : High
##
選擇了更簡單的樹,預(yù)測精度有所降低。

最受歡迎的見解
1.從決策樹模型看員工為什么離職
2.R語言基于樹的方法:決策樹,隨機(jī)森林
3.python中使用scikit-learn和pandas決策樹
4.機(jī)器學(xué)習(xí):在SAS中運(yùn)行隨機(jī)森林?jǐn)?shù)據(jù)分析報告
5.R語言用隨機(jī)森林和文本挖掘提高航空公司客戶滿意度
6.機(jī)器學(xué)習(xí)助推快時尚精準(zhǔn)銷售時間序列
7.用機(jī)器學(xué)習(xí)識別不斷變化的股市狀況——隱馬爾可夫模型的應(yīng)用
8.python機(jī)器學(xué)習(xí):推薦系統(tǒng)實現(xiàn)(以矩陣分解來協(xié)同過濾)
9.python中用pytorch機(jī)器學(xué)習(xí)分類預(yù)測銀行客戶流失