决策树模型(R语言)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/X_dmword/article/details/83926162

R语言中最常用于实现决策树的有两个包,分别是rpart包和party包,其区别如下:

rpart包的处理方式:首先对所有自变量和所有分割点进行评估,最佳的选择是使分割后组内的数据更为“一致”(pure)。这里的“一致”是指组内数据的因变量取值变异较小。rpart包对这种“一致”性的默认度量是Gini值。确定停止划分的参数有很多(参见rpart.control),确定这些参数是非常重要而微妙的,因为划分越细,模型越复杂,越容易出现过度拟合的情况,而划分过粗,又会出现拟合不足。处理这个问题通常是使用“剪枝”(prune)方法。即先建立一个划分较细较为复杂的树模型,再根据交叉检验(Cross-Validation)的方法来估计不同“剪枝”条件下,各模型的误差,选择误差最小的树模型。

party包的处理方式:它的背景理论是“条件推断决策树”(conditional inference trees):它根据统计检验来确定自变量和分割点的选择。即先假设所有自变量与因变量均独立。再对它们进行卡方独立检验,检验P值小于阀值的自变量加入模型,相关性最强的自变量作为第一次分割的自变量。自变量选择好后,用置换检验来选择分割点。用party包建立的决策树不需要剪枝,因为阀值就决定了模型的复杂程度。所以如何决定阀值参数是非常重要的(参见ctree_control)。较为流行的做法是取不同的参数值进行交叉检验,选择误差最小的模型参数。

R语言中有许多包都要自己安装:

install.packages("包名”)

library(包名) #可以检测是否安装成功并且调用

下面以数据集kyphosis为例进行决策树建模,kyphosis数据集是rpart自带的数据集,kyphosis是描述儿童纠正脊柱手术数据集,一共有4个变量。根据变量的英文名称,可以了解到这是以驼背、年龄、编号、开始时间为变量的数据集,一共有81行数据。

先来了解rpart包中的函数rpart:

rpart(formula, data, weights, subset, na.action = na.rpart, method, model = FALSE, x = FALSE, y = TRUE, parms, control, cost, ...)

formula 模型公式,类似回归中y~x1+x2+x3
data 数据框形式的数据集
weights, 选择权重
subset 选择数据集中的指定行
na.action 缺失值处理方式,默认删除y丢失的所有观察值,而那些缺少一个或多个自变量的观测值则保留
method 默认自动选择最佳的方法。主要方法有: 连续性"anova", 泊松型"poisson", 类别"class"和 指数型"exp",程序会根据因变量的类型自动选择方法,但一般情况下最好还是指明本参数
model 是否在结果中保留模型数据框
x 结果中是否显示自变量
y 结果中是否显示因变量
parms 用来设置三个参数:先验概率 (component prior),损失矩阵 (component loss) 和分裂指数 (component split)
control

对树进行设置的一些参数,包括

最小分支节点数(minsplit);叶节点的最少观测数(minbucket);树的深度(maxdepth);交叉验证的次数(xval);

扫描二维码关注公众号,回复: 5588683 查看本文章

复杂度参数(cp),用来修剪树的,当复杂度超过一定程度后,随着复杂度的提高,测试集的分类精度会降低,因此建立的决策树不宜太复杂,需进行剪枝。该剪枝算法依赖于cp,cp随树复杂度的增加而减小,当增加一个节点引起的分类精确度变化量小于树复杂度变化的cp倍时,则需剪去该节点

cost 成本矩阵

查看数据集某些行:

data()                       #列出已载入的包中的数据集

head(kyphosis)         # 前6行
head(kyphosis,n=5)  # 前5行
kyphosis[1:3,]            # 前3行
tail(kyphosis)             # 后6行

library(rpart)
library(rpart.plot)
library(rattle)
#数据
data(kyphosis)
head(kyphosis)
#参数
control <- rpart.control(minsplit=10,minbucket=5,xval=10,cp=0.1) 
#最小分支数,叶节点最小观测数,交叉验证数,复杂度参数(complexity parameter)
#决策树模型
model<- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis,
              method="class",control=control,  
              parms = list(prior = c(0.6,0.4), split = "information"))
#查看模型结果
summary(model) #查看模型的详细过程,见图1
asRules(model) #asRules(model, compact=FALSE, ... )  列出对应规则,是否紧凑型输出,见图2
#给出2种绘制决策树图,可以从图中看到每一类的观测数及占总数的比例
rpartplot(model)         #见图3
fancyRpartPlot(model)    #见图4,更美观

model$cptable    #查看交叉验证结果,见图5
plotcp(model)    #查看交叉验证结果图,见图6
grid()           #加网格线,在这里不执行

#根据交叉验证结果,找出估计误差最小时的cp值,并重新建立模型。
xerr <-model$cptable[,"xerror"]
minxerr <- which.min(xerr)
mincp <-model$cptable[minxerr, "CP"] #选择交叉验证的估计误差最小时对应的cp
#新模型
model.prune <- prune(model,cp=mincp) 
fancyRpartPlot(model.prune)   #见图7

图1:#查看模型的详细过程,只显示部分

图2:列出对应规则

图3:作出决策树图

图4:更美观的决策树图

图5:交叉验证结果,可看到 交叉验证的估计误差(“xerror”),以及标准误差(“xstd”),平均相对误差=xerror±xstd 

图6:交叉验证结果图

图7:剪枝后的新模型(没有变化啊??)

猜你喜欢

转载自blog.csdn.net/X_dmword/article/details/83926162
今日推荐