R语言基于R语言的数据挖掘之决策树

Posted 三数学院

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R语言基于R语言的数据挖掘之决策树相关的知识,希望对你有一定的参考价值。

分类回归树(CART)包括分类树和回归树,当决策树的因变量为二类或多类变量时,用到的是分类树;当决策树的因变量为连续变量时,用到的是回归树。


决策树包括两个过程,即树的生长过程和树的剪枝过程。下面就生成过程和剪枝过程做一个简单的介绍。


分类回归树的生长过程包括两个核心问题一个是如何在众多的自变量中选取最佳的分组变量(可以理解为根节点选择哪个变量作为分组变量,接下来的中间节点又该选择哪些变量作为分组变量);另一个是如何从最佳分组变量中找出一个最佳的分割点(可以理解为分组变量中哪个数值作为二叉树的临界点)。


对于第一个问题,R中的rpart函数默认依据基尼系数的算法计算出最佳的分组变量,使得在该变量下的两组输出变量值异质性最低"纯度"最高。当然也可以使用信息增益率作为最佳变量的选择。基尼系数主要针对分类树,信息增益率主要针对回归树。这里关于基尼系数和信息增益率的理论知识就不普及了,有兴趣的可以参考《Clementine数据挖掘方法及应用》第6章。


对于第二个问题,如果最佳分组变量为连续变量,则对记录的值从小到大进行排序,计算每一个值作为临界值时的异质性统计量,最终选择异质性最低的值作为临界值。如果最佳分组变量为分类变量,由于CART算法只能是二叉树,只能对所有可能组合建立“超类”(所有分类水平合并为两个类别),然后对这些组合一一计算异质性统计量,仍然需要找到异质性最低的组合为最佳分割点。


分类回归树的剪枝过程又分预修剪和后修剪:

预修剪主要是控制树的充分生长,主要通过修改树的最大深度(树的层数)和树节点所包含的最少样本量来控制树的生长。

后修剪主要是考虑到决策树存在过拟合而进行的修剪动作,修剪掉那些不具有代表性的叶节点和子树。

CART算法采用的后修剪技术为最小代价复杂度剪枝法,这种方法同时考虑树的复杂度和误差率,最终使树的预测精度得到保障且还是一棵精简的树。


讲了这么多关于决策树的理论知识,接下来将通过具体的例子实现决策树的应用。所采用的数据为C50包中的客户流失数据(churn数据集)。


#首先下载并加载分类回归树rpart包、rpart.plot包和C50包

if(!suppressWarnings(require('rpart'))){

install.packages('rpart')

require('rpart')

}


if(!suppressWarnings(require('rpart.plot'))){

install.packages('rpart.plot')

require('rpart.plot')

}


if(!suppressWarnings(require('C50'))){

install.packages('C50')

require('C50')

}


#加载数据

data('churn', package = 'C50')

#训练数据集和测试数据集分别采用自带的churnTrain和churnTest,该数据集包含了19个自变量和一个分类因变量

train <- churnTrain

test <- churnTest


在决策树的建模过程中主要用到rpart函数,剪枝过程中主要用到prune函数。简单介绍一下rpart函数的语法和参数含义:


rpart(formula, data, weights, subset, na.action = na.rpart,

method,model = FALSE, x = FALSE, y = TRUE, parms,

control, cost, ...)


formula是一个公式,类似于y~x,左边为因变量,右边为自变量;

data为用于建模的数据集;

weights可以指定一个权重变量(一般用于已汇总的数据集);

subset用于选择数据的子集参与建模;

na.action对应变量存在缺失的处理办法,默认情况下删除因变量为缺失的观测;

method指定建模的方法,因变量为连续型时,默认使用"anova"方法;因变量为分类变量时,默认使用"class"方法;因变量为生存分析的对象时,默认使用"exp"方法;因变量由两列数据组成时,默认使用"poisson"方法;

parms为一个列表,指定分类变量的先验概率(默认使用分类变量水平的数量最为先验概率)、损失矩阵(默认损失矩阵的对角线为0,非对角线为1,即不考虑误判的损失)和选择最佳分类变量的方法(默认使用GINI系数);

control用来指定分类算法的更详细参数,可见下面的rpart.control函数的参数设置:


rpart.control(minsplit = 20, minbucket = round(minsplit/3),

cp = 0.01, maxcompete = 4, maxsurrogate = 5,

usesurrogate = 2, xval = 10,surrogatestyle = 0,

maxdepth = 30, ...)


minsplit指定父节点和子节点中所包含的最少样本量;

minbucket指定叶节点中包含的最少样本量;

cp复杂性参数,用于控制树的复杂度,值越低,复杂度越高,默认为0.01;

maxsurrogatr指定最多的代理变量个数(代理变量:如果某个样本在最佳分组变量中存在缺失值,此时将选择最佳分组变量的替代变量,将样本分配到所属的组中);

xval指定交叉验证的次数;

maxdepth指定树的深度(层数)。


应用:

这里决策树建模函数rpart全部使用默认参数,由于版面原因,这里只显示决策树规则的一部分:

【R语言】基于R语言的数据挖掘之决策树(一)


决策树图和决策树模型的预测准确率如下:

【R语言】基于R语言的数据挖掘之决策树(一)

可见该模型的预测准确率还是非常高的,达到了93%的预测准确率。但是我们发现树图还是有点复杂(节点非常多),接下来看看通过剪枝,是否即能保证决策树的预测精度,又能使树精简一些。


CART算法对树的剪枝使用最小代价复杂度剪枝法,即要保证预测精度又要保证树的精简性,需要选择适当的cp值。一般cp值的选择依据为xerror(交叉验证的估计误差)最小xerror+xstd(标准误差)最小。


下面看一下模型的交叉验证表结果:

【R语言】基于R语言的数据挖掘之决策树(一)

根据交叉验证表中的xerror(交叉验证的估计误差)和xstd(标准误差),选择cp=0.024。


下面看一下剪枝后的模型的树图和预测准确度:


发现,经过剪枝后决策树的预测精度有所提高(93.3%),而且树的复杂程度(树的节点数减少)也降低,这更适合测试数据集的一般性。


在决策树的实际应用中,也许没有这么简单,要考虑到其中参数的设置,需要根据实际的业务情况和分析师的经验不断尝试修改模型中的参数,如树的深度、节点的样本数量、cp值、先验概率、损失矩阵、交叉验证的次数等等。


最后总结一下文中提到的R包和函数:

rpart包

rpart()

predict()

prune()

rpart.plot包

rpart.plot()

C50包

图文制作:sim



长按下面二维码图片,点"识别图中二维码"然后再点关注,每天都会收到有趣有用的数据分析教程,让你晋升为"数据分析达人"。



以上是关于R语言基于R语言的数据挖掘之决策树的主要内容,如果未能解决你的问题,请参考以下文章

数据分析之美 决策树R语言实现

R语言基于Bagging分类的逻辑回归(Logistic Regression)决策树森林分析心脏病患者

R语言实战应用精讲50篇(三十一)-R语言实现决策树(附R语言代码)

R语言基于树的方法:决策树,随机森林,套袋Bagging,增强树

数据挖掘常用算法之决策树算法

R语言专题,如何使用party包构建决策树?