基于决策树的模型

来源:互联网 发布:北京启明星辰知乎 编辑:程序博客网 时间:2024/06/03 03:06
参考:xccd ,肖凯大牛的博客
本文为学习贴

# 几种决策树 效果比较
# 问题描述
数据集是C50包中自带的churn数据,它是用来预测顾客流失的数据集,其中样本量为3333个,变量数为20个,数据不均衡,没有缺失值

因为分类变量churn[yes,no] 不均衡:采用k折交叉验证方法


library(C50)
library(rpart)
library(party)
library(reshape2)
library(ggplot2)

data(churn)
help(package="C50") # 查看churn数据集的详情 包含训练集和测试集
# 设置存放3中分类决策树准确率 100次的均值为0,为了后续存放[数据初始化]
rate.c <- rate.r <- rate.p <- rep(0, 100)

# 100次循环求准确率均值
for (j in 1:100) {
     # 为数据集生成索引的index,10折,范围也就是 1-10
    num <- sample(1:10,nrow(churnTrain),replace=T)
    # 存放100次中的每一次 三种决策树 分类结果的 混淆矩阵
    # res.c 等三个数据为 三维数据
    res.c <- res.r  <-res.p<- array(0,dim=c(2,2,10))
    # 1次 10折交叉验证(外面套上循环,即n次10折交叉验证)
    for ( i in 1:10) {
         # 大约90%的训练集
        train <- churnTrain[num!=i, ]
        # 大约 10%的测试数据
        test <- churnTrain[num==i, ]
           # 使用训练数据train 训练C50的决策树
        model.c <- C5.0(churn~.,data=train)
        # 通过训练后的模型model.c 来预测 测试数据集(仅使用测试数据集的自变量[训练时因churn作为因变量],所以去掉20.即 test[,-20])
        pre <- predict(model.c,test[,-20])
        # 用预测的分类结果pre 与 交叉验证的作为测试集的10%的分类结果,生成混淆矩阵,然后转换成matrix,存放在第i个混淆矩阵中
        res.c[,,i] <- as.matrix(table(pre,test[ ,20]))
          
          # 使用party包中的ctree函数训练训练数据,形成模型
        model.p <-ctree(churn~.,data=train)
        # 用训练后的模型预测
        pre <- predict(model.p,test[,-20])
        # 将ctree训练的分类混淆矩阵结果存放在res.p的第i个混淆矩阵数组中
        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]))
    }
    # apply: MARGIN=c(1,2)表示按行,列求和.即10组2*2的混淆矩阵,对应位置求和
    # x <- array(1:10,dim=c(2,2,2)); apply(x, MARGIN=c(1,2), sum) # 当然参数位置对应,可以不用写MARGIN
    table.c <- apply(res.c,MARGIN=c(1,2),sum)
    # 计算准确率:对角线上数值的和/整个混淆矩阵的和(作为一次准确率的值,共n=100次测试)
    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)
}
# 100条记录
data <- data.frame(c50=rate.c,rpart=rate.r,party=rate.p)
# melt (横表转纵表)
data.melt <- melt(data)

# 绘图
# 其中 数据框 data.melt的两个变量names(data.melt),对应x=variable 分类变量,y=value连续变量,设置颜色col
# 习惯上将数值型数据放在y轴,即y=value,如下方式处理
p <- ggplot(data.melt,aes(variable,value,color=variable))
p + geom_point(position='jitter')+
    geom_violin(alpha=0.4)


从以上案例可以学习到如下内容:
1、k fold cross validation
k <- 10 # k fold
m <- 20 # classification column

# set range of k
index <- sample(1:k, nrow(data), replace = T)

for(i in 1:k) {
     trainsSet <- data[index != i,]
     testSet   <- data[index == i,]
     # 拟合模型, 预测测试数据, 比较预测分类结果与测试数据集的分类结果
     model <- C5.0(churn ~ ., data= trainSet)
     pre   <- predict(model, testSet[,-m])
     # 得到混淆矩阵
     tab <- table(pre, testSet[,m])
     # 如果需要将多次循环,将结果存放在 3维的 array中,需要将tab转换成matrix
}

2、apply函数(处理二维matrix,以及多维的array,按照行列进行计算(sum,mean...),对应位置)

3、100次 k fold 交叉验证的结果
res.c[,,i] <- as.matrix(table(pre, test[,20]))

4、大量的矩阵运算

5、分类算法包以及函数用法
C50::C5.0(churn ~ ., data=xxx, rules= T)
party::ctree(churn ~ ., data = xxx)
rpart::rpart(churn ~ ., data = xxx, type = "class")
原创粉丝点击