CART算法及案例分析


CART算法的R语言实现

#步骤1 数据预处理,建立训练集和预测集

loc <- "http://archive.ics.uci.edu/ml/machine-learning-databases/"

ds <- "breast-cancer-wisconsin/breast-cancer-wisconsin.data"

url <- paste(loc, ds, sep="")   

data <- read.table(url, sep=",", header=FALSE, na.strings="?")  #na.strings="?" : 数集中缺失的类型用“?”来表示。

head(data) #未命名

 

names(data) <- c("ID", "clumpThickness", "sizeUniformity",      #给数据集属性贴标签

                   "shapeUniformity", "maginalAdhesion",

                   "singleEpithelialCellSize", "bareNuclei",

                   "blandChromatin", "normalNucleoli", "mitosis", "class")

head(data) #命名之后

 

data$class[data$class==2]<- "良性"   #数据预处理,设置class=2的显示"良性"

data$class[data$class==4]<- "恶性"   #数据预处理,设置class=4的显示"恶"

data<-data[-1] #删除第一列(这列是编号,分析过程不考虑)

str(data)

 

set.seed(1234)

train<-sample(nrow(data),0.7*nrow(data))

tdata<-data[train,]

dim(tdata)

 

vdata<-data[-train,]

dim(vdata)

 

#步骤2 rpart函数构建树

library(rpart)

dtree<-rpart(class~.,data=tdata,method="class",parms=list(split="gini"))

printcp(dtree) 

 

#步骤3 prune剪枝,提高模型的泛化能力

dtree$cptable  #剪枝的复杂度

 

tree<-prune(dtree,cp=0.0125)

tree$cptable  #剪枝后的复杂度及分枝数

 

#步骤4 模型可视化

opar<-par(no.readonly = T)

#par(mfrow=c(1,2))  #画面分页

library(rpart.plot)

rpart.plot(dtree,branch=1,type=2,fallen.leaves=T,cex=0.8,sub="剪枝前")

 

rpart.plot(dtree,branch=1,type=4,fallen.leaves=T,cex=0.8,sub="剪枝后")

 

#步骤5 利用预测集检验模型效果

predtree<-predict(tree,newdata=vdata,type="class") #利用预测集进行预测

table(vdata$class,predtree,dnn=c("真实值","预测值")) #输出混淆矩阵

 

CART经典算法案例分析

library(rpart)

data(car.test.frame) #加载数据

head(car.test.frame) #查看数据

car.test.frame$Mileage=100*4.596/(1.6*car.test.frame$Mileage) #Mileage(英里数)的取值换算为油耗指标

names(car.test.frame)<-c("价格","产地","可靠性","油耗","类型","车重","发动机功率","净马力")

head(car.test.frame)

str(car.test.frame)

 

Data_Mileage<-matrix(0,60,1)  #设矩阵Data_Mileage用来存放新变量

Data_Mileage[which(car.test.frame$"油耗">=11.6)]="A"   #油耗11.6~15.8区间的样本Data_Mileage值设置为A

Data_Mileage[which(car.test.frame$"油耗"<=9)]="C"   #油耗7.7~9区间的样本Data_Mileage值设置为C

Data_Mileage[which(Data_Mileage==0)]="B"   #油耗不在AC区间的样本Data_Mileage值设置为B

car.test.frame$"分组油耗"=Data_Mileage   #car.test.frame数据集中添加信变量分组油耗,取值为Data_Mileage

car.test.frame[1:10,c(4,9)]   #查看预处理后car.test.frame数据集中“”油耗及分组油耗变量的前10行数据

 

a<-round(1/4*sum(car.test.frame$"分组油耗"=="A"))   #计算A组中的测试集样本,记为a

b<-round(1/4*sum(car.test.frame$"分组油耗"=="B"))   #计算B组中的测试集样本,记为b

c<-round(1/4*sum(car.test.frame$"分组油耗"=="C"))   #计算C组中的测试集样本,记为c

sub<-strata(car.test.frame,stratanames="分组油耗",size=c(c,b,a),method="srswor")   #car.test.frame中的分组油耗变量进行分层抽样

Car_train<-car.test.frame[-sub$ID_unit,]   #生成训练集Car_train

Car_test<-car.test.frame[sub$ID_unit,]   #生成测试集Car_test

formula_Car_Reg<-油耗~价格+产地+可靠性+类型+车重+发动机功率+净马力

Car_Reg<-rpart(formula_Car_Reg,Car_train,method="anova")  #用除“分组油耗”以外的所有变量来对“油耗”建立决策树,且选择树的类型为回归树,即method="anova"

Car_Reg

 

printcp(Car_Reg)

 

summary(Car_Reg)

 

 

Car_Reg2<-rpart(formula_Car_Reg,Car_train,method="anova",cp=0.5)

Car_Reg2

 

Car_Reg3<-prune.rpart(Car_Reg,cp=0.5) #对决策树Car_Reg按照CP值为0.5进行剪枝,新的回归树记为Car_Reg3

Car_Reg3 #回归树展示

 

#可通过深度参数maxdepth对所生成树进行控制

Car_Reg4<-rpart(formula_Car_Reg,Car_train,method="anova",maxdepth=1) #树的深度maxdepth设为1,新的回归树记为Car_Reg4

Car_Reg4  #导出回归树Car_Reg4的基本信息

 

printcp(Car_Reg4) #导出回归树Car_Reg4CP

 

Car_plot<-rpart(formula_Car_Reg,Car_train,method="anova",minsplit=10)  #用树状图进行观察,选择参数minsplit为10来绘制决策树图形

Car_plot

 

library(rpart.plot)

rpart.plot(Car_plot) #绘制决策树

 

rpart.plot(Car_plot,type=4)

 

相关