参考: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")