-
決策樹是什么
決策樹是基於樹結構來進行決策,這恰是人類在面臨決策問題時一種很自然的處理機制。例如,我們要對“這是好瓜嗎?”這樣的問題進行決策時,通常會進行一系列的判斷或“子決策”:我們先看“它是什么顏色?”,如果是“青綠色”,則我們再看“它的根蒂是什么形態?”,如果是“蜷縮”,我們再判斷“它敲起來是什么聲音?”,最后我們得出決策:這是一個好瓜。這個決策如圖所示:
-
決策樹能做什么
決策樹能實現對數據的探索,能對數據輪廓進行描述,能進行預測和分類,了解哪些變量最重要
-
決策樹基本流程
-
幾種分列准則
一 信息增益
二 增益率
三 基尼系數
-
停止條件
1.如果節點中所有觀測屬於一類。
2.如果該節點中所有觀測的屬性取值一致。
3.如果樹的深度達到設定的閾值。
4.如果該節點所含觀測值小於設定的父節點應含觀測數的閾值。
5.如果該節點的子節點所含觀測數將小於設定的閾值。
6.如果沒有屬性能滿足設定的分裂准則的閾值。
-
C4.5,對連續屬性的處理
在C4.5中,對連續屬性的處理如下:
1. 對特征的取值進行升序排序
2. 兩個特征取值之間的中點作為可能的分裂點,將數據集分成兩部分,計算每個可能的分裂點的信息增益(InforGain)。優化算法就是只計算分類屬性發生改變的那些特征取值。
3. 選擇修正后信息增益(InforGain)最大的分裂點作為該特征的最佳分裂點
4. 計算最佳分裂點的信息增益率(Gain Ratio)作為特征的Gain Ratio。注意,此處需對最佳分裂點的信息增益進行修正:減去log2(N-1)/|D|(N是連續特征的取值個數,D是訓練數據數目,此修正的原因在於:當離散屬性和連續屬性並存時,C4.5算法傾向於選擇連續特征做最佳樹分裂點)
-
R代碼實現(C5.0)
一.導入數據集,把目標變量轉為因子
setwd("D:\\R_edu\\data") rm(list=ls()) accepts<-read.csv("accepts.csv") str(accepts) accepts$bad_ind<-as.factor(accepts$bad_ind) names(accepts) accepts=accepts[,c(3,7:24)]
根據業務理解生成更有意義的衍生變量,不過這些變量都是臨時的,因為沒有經過數據清洗,此處僅作一個示例
二.將數據分為訓練集和測試集
set.seed(10) select<-sample(1:nrow(accepts),length(accepts$bad_ind)*0.7) train=accepts[select,] test=accepts[-select,] summary(train$bad_ind)
三.運行C50算法建模
train<-na.omit(train) library(C50) ls('package:C50') tc<-C5.0Control(subset =F,CF=0.25,winnow=F,noGlobalPruning=F,minCases =20) model <- C5.0(bad_ind ~.,data=train,rules=F,control =tc) summary( model )
四.圖形展示
plot(model)
C5imp(model)
五.生成規則
rule<- C5.0(bad_ind ~.,data=train,rules=T,control =tc) summary( rule )
-
CRAT算法處理離散型變量
- 記m為樣本T中該屬性取值的種類數
- 窮舉將m種取值分為兩類的划分
- 對上述所有划分計算GINI系數
-
R代碼實現CART算法
rpart包中有針對CART決策樹算法提供的函數,比如rpart函數
以及用於剪枝的prune函數
rpart函數的基本形式:rpart(formula,data,subset,na.action=na.rpart,method.parms,control,...)
一.設置向前剪枝的條件
tc <- rpart.control(minsplit=20,minbucket=20,maxdepth=10,xval=5,cp=0.005)
rpart.control對樹進行一些設置
minsplit是最小分支節點數,這里指大於等於20,那么該節點會繼續分划下去,否則停止
minbucket:樹中葉節點包含的最小樣本數
maxdepth:決策樹最大深度
xval:交叉驗證的次數
cp全稱為complexity parameter,指某個點的復雜度,對每一步拆分,模型的擬合優度必須提高的程度
二.建模
rpart.mod=rpart(bad_ind ~.,data=train,method="class", parms = list(prior = c(0.65,0.35), split = "gini"), control=tc) summary(rpart.mod) #1.3看變量重要性 rpart.mod$variable.importance #cp是每次分割對應的復雜度系數 rpart.mod$cp plotcp(rpart.mod)
三.畫樹圖
library(rpart.plot) rpart.plot(rpart.mod,branch=1, extra=106, under=TRUE, faclen=0, cex=0.8, main="決策樹")
四.CART剪枝
prune函數可以實現最小代價復雜度剪枝法,對於CART的結果,每個節點均輸出一個對應的cp
prune函數通過設置cp參數來對決策樹進行修剪,cp為復雜度系數
我們可以用下面的辦法選擇具有最小xerror的cp的辦法:
rpart.mod.pru<-prune(rpart.mod, cp= rpart.mod$cptable[which.min(rpart.mod$cptable[,"xerror"]),"CP"]) rpart.mod.pru$cp
五.繪制剪枝后的樹狀圖
library(rpart.plot) rpart.plot(rpart.mod.pru,branch=1, extra=106, under=TRUE, faclen=0, cex=0.8, main="決策樹")
六.CART預測
- 使用模型對測試集進行預測使用模型進行預測
- 使用模型進行預測
rpart.pred<-predict(rpart.mod.pru,test)
可以看到,rpart.pred的結果有兩列,第一列是為0的概率,第二列是為1的概率
通過設定閥值,得到預測分類
pre<-ifelse(rpart.pred[,2]>0.5,1,0)