
当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放
说实话,前面的决策树理论介绍的我自己都累,尤其是第一节各种公式的编辑;当然了,我深知数学理论对一切结论的支撑重要性,数学是这个世界上最美的语言。有了前面的铺垫,这里我们废话不多说,直接进入最终目标,基于R语言的两种经典决策树模型的实现。
这里用的数据集是R自带的应该是专门用来做决策树的训练数据集"Pima.tr"和测试数据集"Pima.te",因为这样可以保证人人都可以做模型实验。我本人觉得在这一点上R语言做的还是比较好的。
先看一下这两份训练与测试集的基本情况:
> head(Pima.tr)
npreg glu bp skin bmi ped age type
1 5 86 68 28 30.2 0.364 24 No
2 7 195 70 33 25.1 0.163 55 Yes
3 5 77 82 41 35.8 0.156 35 No
4 0 165 76 43 47.9 0.259 26 No
5 0 107 60 25 26.4 0.133 23 No
6 5 97 76 27 35.6 0.378 52 Yes
> dim(Pima.tr)
[1] 200 8
> head(Pima.te)
npreg glu bp skin bmi ped age type
1 6 148 72 35 33.6 0.627 50 Yes
2 1 85 66 29 26.6 0.351 31 No
3 1 89 66 23 28.1 0.167 21 No
4 3 78 50 32 31.0 0.248 26 Yes
5 2 197 70 45 30.5 0.158 53 Yes
6 5 166 72 19 25.8 0.587 51 Yes
> dim(Pima.te)
[1] 332 8
这两份数据,确实分别是训练集与测试集,下面分别介绍R语言的几种决策树构建与剪枝、树的可视化与预测过程,并分析其预测准确率!
01
CART
构建模型主要用函数rpart包的基本函数rpart(formula,data = ,control = rpart.control(cp = )),其中formula就是模型表达式,比如type~.,表示type对其它所有变量的决策树,"data ="指定作用的数据集, "control = rpart.control(cp = )"表示是否引入复杂系数进行剪枝。当然,这是几个基本模型参数。
(1)、未剪枝
rm(list = ls())
library(MASS)
library(rpart)
#绑定数据集,便于操作
attach(Pima.tr)
summary(Pima.tr)
#CART决策树分析
cart
summary(cart)
par(xpd = TRUE)
plot(cart,main = '未剪枝')
text(cart)
CART算法未剪枝决策树
(2)剪枝
#剪枝这里cp值为复杂系数
#cp = 0.1叶节点为3,留三个枝
cart1
#cp = 0.03叶节点为5,留五个枝
cart2
par(mfrow = c(1,2),xpd = TRUE)
plot(cart1,main = '留3个叶节点')
text(cart1)
plot(cart2,main = '留5个叶节点')
text(cart2)
剪枝结果决策树
(3)、测试数据集准确率检验
用训练好的模型进行预测的函数是predict(model,data,type = 'class'),第一个参数是训练好的决策树模型,第二个参数是用于测试的数据集,第三个参数type = "class"表示进行分类。
#测试数据集检验
#未剪枝
pre
#建立预测交叉矩阵
m
#预测正确率,diag(m)函数用于求矩阵对角线和,这里用于计算预测准确的数据数量之和。
sum(diag(m))/sum(m)
#叶节点为3
pre1
#建立预测交叉矩阵
m1
#预测正确率
sum(diag(m1))/sum(m1)
#叶节点为5
pre2
#建立预测交叉矩阵
m2
#预测正确率
sum(diag(m2))/sum(m2)
预测交叉矩阵是这样的形状
> m
predict
type No Yes
No 182 41
Yes 48 61
> m1
predict
type No Yes
No 184 39
Yes 51 58
> m2
predict
type No Yes
No 193 30
Yes 51 58
未剪枝、留3个叶节点、留5个叶节点的预测分类正确率分别为
[1] 0.7319277
[1] 0.7289157
[1] 0.7560241
可见,不仅要剪枝,并且留5个叶节点的预测分类正确率是最好的。
02
C5.0
#===C5.0决策树分析===#
#noGlobalPruning值设为T表示不进行修剪
library(C50)
tr5.0
tr5.01
par(xpd = TRUE)
#--种类画图不需要text()--#
plot(tr5.0)
plot(tr5.01)
#预测
pre
pre1
##建立预测交叉矩阵
m
m1
#预测正确率
sum(diag(m))/sum(m)
#预测正确率
sum(diag(m1))/sum(m1)
画出的决策树如下:
未剪枝决策树
剪枝的决策树
预测交叉矩阵是这样的形状
> m
predict
type No Yes
No 193 30
Yes 58 51
> m1
predict
type No Yes
No 195 28
Yes 60 49
C5.0未剪枝、剪枝的预测分类正确率分别为:
[1] 0.7349398
[1] 0.7349398
预测分类正确率是一样的,虽然预测交叉矩阵不一样,因为它们的对角线之和是一样的。
03
两种算法的比较
经过实验我们得出的结果分别是这样的,如下所示:
比较内容
CART
C5.0
训练数据正确率
0.835
0.815
测试数据正确率
0.756
0.735
叶节点数
5
4
深度
3
3
对于实验数据,CART算法正确率好像好一些,但它的叶节点数大一些!总的来看,两种算法效能好像差不多!关于决策树到这里总算落下帷幕了,好不容易!
欢迎留言、提建议、意见,觉得不错,记得【点赞、分享】!
终于等到你了!