决策树是一种简洁实用的数据挖掘方法。在R中通常可以用rpart包和party包来实现两种算法的决策树。最近著名的C4.5决策树算法的升级版本C5.0已经可以在官网下载到。对于这三种决策树算法,本文来做一个预测效果的简单对比。
对比用的数据集是C50包中自带的churn数据,它是用来预测顾客流失的数据集,其中样本量为3333个,变量数为20个。为不平衡数据,没有缺失值存在。对比基本步骤是用10重交叉检验,将数据随机分为10份,用9份训练决策树,用1份来检验结果。循环后求出10个预测准确度的均值。然后在外面再套一个100次大循环,产生三个决策树算法各100个准确率。最后绘制为提琴图,从图中可以观察到C5.0的表现最好,而party次之,rpart的效果最差。在本例实验中最大的差距虽然不过0.02,但如果放在kaggle的数据挖掘比赛中,就相当于是一百位名次的差距了。
生成代码如下:
library(C50)
library(rpart)
library(party)
library(reshape2)
library(ggplot2)
data(churn)
rate.c <- rate.r <-rate.p<- rep(0,100)
for(j in1:100){
num <- sample(1:10,nrow(churnTrain),replace=T)
res.c <- res.r <-res.p<- array(0,dim=c(2,2,10))
for( i in1:10){
train <- churnTrain[num!=i,]
test <- churnTrain[num==i,]
model.c <- C5.0(churn~.,data=train)
pre <- predict(model.c,test[,-20])
res.c[,,i]<- as.matrix(table(pre,test[,20]))
model.p <-ctree(churn~.,data=train)
pre <- predict(model.p,test[,-20])
res.p[,,i]<- as.matrix(table(pre,test[,20]))
model.r <- rpart(churn~.,data=train)
pre <- predict(model.r,test[,-20],type='class')
res.r[,,i]<- as.matrix(table(pre,test[,20]))
}
table.c <- apply(res.c,MARGIN=c(1,2),sum)
rate.c[j]<- sum(diag(table.c))/sum(table.c)
table.p <- apply(res.p,MARGIN=c(1,2),sum)
rate.p[j]<- sum(diag(table.p))/sum(table.p)
table.r <- apply(res.r,MARGIN=c(1,2),sum)
rate.r[j]<- sum(diag(table.r))/sum(table.r)
}
data<- data.frame(c50=rate.c,rpart=rate.r,party=rate.p)
data.melt <- melt(data)
p <- ggplot(data.melt,aes(variable,value,color=variable))
p + geom_point(position='jitter')+
geom_violin(alpha=0.4)
C5.0算法相对于C4.5有如下几点改进:
- 速度显著加快
- 内存使用减少
- 生成树模型更为简洁
- 支持boosting方法
- 支持加权和成本矩阵
- 支持变量筛选