決策樹,算法的目標是建立分類預測模型或回歸預測模型,是一種預測模型,按目標不同可以細分為分類樹和回歸樹,因為在展示的時候,類似于一棵倒置的樹而得名。如下圖:
基本概念: 根節點:如上圖中最上方,一棵決策樹只有一個根節點。 中間節點:位于中間的節點,有上有下的節點。 葉節點:沒有后續連續的節點叫葉節點,意味著至此為止。 二叉樹和多叉樹:每個非節點只有兩個分支,叫二叉樹,多個就叫多叉樹,上圖是一個二叉樹。 圖形怎么看: 如上圖,先看根節點,它框內寫的是Middle 88/258,意思為在總觀測數為258個里面,最大的分類是Middle,有88個,下方兩個分支,PEG>=0.34的意思是,左邊的分支是PEG>=0.34,右邊的分支自然是PEG<0.34(有的圖不會顯示出來)。從左邊的分支看下去,把PEG劃分之后,PEG>=0.34的所有觀測有143個,其中仍然是Middle分類最多,有78個,然后再按照分支下的分支方法,PEG>=0.34里面,再把它分為>=0.68和<0.68兩類,于是在>=0.68這類里面,共有53個,其中最大的是High分類,有52個,這個已經沒有必要再分下去了,所以它成為了葉節點。 核心問題 決策樹的生長:決策樹的本質是分類,就是從根節點開始,一步步區分不同的類別,從而達到最后不能再細分的過程,而這個過程就是生長過程,分支的準確,使差異下降顯著,意思即為,假如你有一塊奧得奧,一刀切下去,使得切開的兩塊差異性最大,正確的方法是從夾心層掰開,黑的和黃的兩塊餅干就分開了,不是么? 決策樹的修剪:決策樹生長的太過茂盛,這不是好事,它使訓練集中每一個數都被分開了,這樣就會失去了它的預測意義,這種情況叫過擬合(overfitting)。所以,需要對它進行修剪,把過于精確的部分剪掉,但是,要注意的是,它與錯誤率是相關的,剪得越多,預測的錯誤就越高,所以,需要找到合適的剪枝深度。剪枝有預修剪和后修剪兩種方式。、
CART分類回歸樹: R中建立分類回歸樹的包是rpart包,還有對應的作圖包rpart.plot包兩上,使用前先安裝,另外,到【User Knowledge Modeling Data Set】這里下載數據集。
library(rpart)ibbrary(rpart.plot)#把數據集分為兩個部分,訓練集TD和測試集PD,分別讀入,這里假設已經讀入了這兩個對象。分別為TD和PD#自行設置預修剪等相關參數,這里都是默認值,并建立模型Ctl<-rpart.control(minsplit=2,maxcompete=4,xval=10,maxdepth=10,cp=0.01)Treefit<-rpart(formula = UNS ~ ., data = TD, method = "class", parms = list(split = "gini"),control=Ctl)#使用PRintcp和plotcp查看其復雜參數對模型影響,主要看的是預測誤差的標準誤xstd,從plotcp里面可以看到與虛線最近的點即為誤差最小的點,所以,對應的cp值可以作為修剪的近似值。printcp(Treefit)plotcp(Treefit)#使用prune對樹進行修剪,修剪cp值從圖中近似得出prune(Treefit,0.023) #其實這個數據集使用默認參數時就差不多是最優解了,不需要再進行修剪。#預測訓練集和測試集Pred<-predict(Treefit,TD[,1:5],type="class")Pred2<-predict(Treefit,PD[,1:5],type="class")#對比原樣本分類table(Pred,TD[,6])table(Pred2,PD[,6])研究表明,分類回歸樹模型會隨訓練樣本的變化而劇烈變動,所以,需要提高其穩定性,此時,就需要組合預測模型出馬。 組合預測模型有兩個常見的技術,裝袋和推進。原理我也不是很了解,按我個人的理解說一下,如果錯誤請指正。 裝袋:訓練集中不放回抽樣,得到的數據作為訓練數據,未被抽到的作為測試數據,從而建立多個模型并進行預測,預測結果會有誤差,而這些誤差的大小就作為這些模型的一個權重,當使用整體模型進行預測的時候,其中所有建立的模型均會進行預測,其后由小數服從多數的投票規則選出最終結果。裝袋技術對那些數據樣本小的波動對模型參數有較大影響的改進效果明顯,適用于處理大數據集。 推進:一開始的時候也是不放回隨機抽樣,但抽完第一次之后,會建立一個模型,以此來預測剩下的數據,如果預測準確,則這一堆數據的權重會上升,反之下降,第二次抽樣的時候,就會以權重轉化而來的比例去抽樣,權重高的被抽到的概率就高。預測的時候,其中所有模型都會進行預測,但不是小數服從多數,而是根據權重來進行投票選擇。 這兩個技術的R包一個是ipred包中的bagging函數,另一個是adabag包 中的boosting函數,下面是R程序,同樣使用上面已經建立好的數據,包需要自行安裝
#先是裝袋技術library(ipred)bt<-bagging(UNS~.,data=TD,coob=T,control=Ctl)#預測btp<-predict(bt,PD[,1:5],type="class")table(btp,PD[,6])#然后是推進技術library(adabag)bst<-boosting(formula = UNS ~ ., data = TD, boos = T, mfinal = 25, coeflearn = "Breiman")bstp<-predict(bst,PD[,1:5],type="class")table(bstp,PD[,6])隨機森林 隨機森林模型也是基于裝袋技術,但它會完全隨機建立出N棵樹,然后通過對訓練集中未被抽中的的數據進行預測,并對這N棵樹進行相應的相關分析,把某一方面準確度的樹關聯在一起,有個形象的解釋就是,對某一個變量,這幾棵樹解釋度高,準確率高,是專家,但對另一個變量,則是另外幾棵樹,相當于專家會診! R語言中的包是randomForest包中的randomForest函數
library(randomForest)rFM<-randomForest(formula = UNS ~ ., data = TD, importance = T)rFMPP<-predict(rFM,PD[,-6])table(rFMPP,PD[,6])#另外可以使用important和varImpPlot兩個函數來查看各解釋變量對因變量的重要程度。importance(rFM,type=1)varImpPlot(rFM,sort=T,n.var=nrow(rFM$importance))決策樹除了這些還有C4.5、C5.0等等,后續有時間再學習,并補充吧。
新聞熱點
疑難解答