摘要:本文有關 基於樹的回歸和分類方法。樹方法簡單易懂,對於解釋非常有用,但就預測準確性而言,它們通常無法與最佳監督學習方法競爭。因此,我們還介紹了裝袋,隨機森林和增強樹。這些示例中 我們看到,合併大量的樹可以大大提高預測準確性,但代價是損失解釋能力。
一決策樹基礎:回歸
我們預測棒球運動員的Salary。
結果將是一系列拆分規則。第一個分割會將數據分割Years < 4.5為左側的分支,其餘的為右側。如果我們對此模型進行編碼,我們會發現關係最終變得稍微複雜一些。
library(tree)library(ISLR)attach(Hitters)# Remove NA dataHitters<- na.omit(Hitters)# log transform Salary to make it a bit more normally distributedhist(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
現在,我們討論通過對特徵空間進行分層來構建預測樹。通常,有兩個步驟。
找到最能分隔響應變量的變量/拆分,從而產生最低的RSS。
將數據分為兩個在第一個標識的節點上的葉子。
在每片葉子中,找到分隔結果的最佳變量/分割。
目標是找到最小化RSS的區域數。但是,考慮將每個可能的分區劃分為J個區域在計算上是不可行的 。為此,我們採取了 自上而下的, 貪婪 的方法。它是自頂向下的,因為我們從所有觀測值都屬於一個區域的點開始。貪婪是因為在樹構建過程的每個步驟中,都會在該特定步驟中選擇最佳拆分,而不是向前看會在將來的某個步驟中生成更好樹的拆分。
一旦創建了所有區域,我們將使用每個區域中訓練觀察的平均值預測給定測試觀察的響應。
二剪枝
儘管上面的模型可以對訓練數據產生良好的預測,但是基本的樹方法可能會過度擬合數據,從而導致測試性能不佳。這是因為生成的樹往往過於複雜。具有較少拆分的較小樹通常以較小的偏差為代價,從而導致方差較低,易於解釋且測試錯誤較低。實現此目的的一種可能方法是僅在每次拆分導致的RSS減少量超過某個(高)閾值時,才構建一棵樹。
因此,更好的策略是生長一棵大樹,然後 修剪 回去以獲得更好的子樹。
成本複雜性修剪 -也稱為最弱連結修剪為我們提供了解決此問題的方法。而不是考慮每個可能的子樹,我們考慮由非負調整參數索引的樹序列alpha。
trees <- tree(Salary~., train)plot(trees)text(trees, pretty=0)
plot(cv.trees)
似乎第7棵樹的偏差最小。然後我們可以修剪樹。但是,這並不能真正修剪模型,因此我們可以選擇較小的尺寸來改善偏差平穩狀態。這大約是在第四次分裂。
prune.trees <- prune.tree(trees, best=4)plot(prune.trees)text(prune.trees, pretty=0)
使用修剪的樹對測試集進行預測。
mean((yhat - test$Salary)^2)## [1] 0.3531
三分類樹
分類樹與回歸樹非常相似,不同之處在於分類樹用於預測定性而不是定量。
為了增長分類樹,我們使用相同的遞歸二進位拆分,但是現在RSS不能用作拆分標準。替代方法是使用 分類錯誤率。雖然很直觀,但事實證明,此方法對於樹木生長不夠敏感。
實際上,另外兩種方法是可取的,儘管它們在數值上非常相似:
__Gini index_是K個 類之間總方差的度量 。
如果給定類別中的訓練觀測值的比例都接近零或一,則__cross-entropy_的值將接近零。
修剪樹時,首選這兩種方法,但如果以最終修剪模型的預測精度為目標,則規則分類錯誤率是優選的。
為了證明這一點,我們將使用Heart數據集。這些數據包含AHD303名胸痛患者的二進位結果變量 。結果被編碼為Yes或No存在心臟病。
dim(Heart)
[1] 303 15
到目前為止,這是一棵非常複雜的樹。讓我們確定是否可以通過使用錯過分類評分方法的交叉驗證來使用修剪後的版本改善擬合度。
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 分類設置。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%的精度。
那麼為什麼要進行拆分呢?拆分導致節點純度提高 ,這可能會在使用測試數據時有更好的預測。
四樹與線性模型
最好的模型始終取決於當前的問題。如果可以通過線性模型近似該關係,則線性回歸將很可能佔主導地位。相反,如果我們在特徵和y之間具有複雜的,高度非線性的關係,則決策樹可能會勝過傳統方法。
優點/缺點
優點:
樹比線性回歸更容易解釋。
更緊密地反映了人類的決策。
易於以圖形方式顯示。
可以處理沒有偽變量的定性預測變量。
缺點:
樹結構中實際使用的變量:[1]「價格」「 CompPrice」「年齡」「收入」「 ShelveLoc」
[6]「廣告」終端節點數:19殘差平均偏差:0.414 = 92/222錯誤分類錯誤率:0.0996 = 24/241
在這裡,我們看到訓練誤差約為9%。我們plot()用來顯示樹結構和text()顯示節點標籤。
plot(sales.tree)text(sales.tree, pretty=0)
讓我們看看完整的樹如何處理測試數據。
## 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%的測試錯誤率相當不錯!但是我們可以通過交叉驗證來改善它。
在這裡,我們看到最低/最簡單的錯誤分類錯誤是針對4模型的。現在我們可以將樹修剪為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##
選擇了更簡單的樹,預測精度有所降低。
介紹:我們是數據挖掘團隊,分享結合實際業務的理論應用和心得體會。歡迎大家關注我們的微信公眾號,關注數據挖掘文章;您也可以在公眾號中直接發送想說的話,與我們聯繫交流。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.