决策树(Tree Nodels)是一种创建树状模型的方法,它使用‘基尼不纯度’(Gini Impurity)或信息增益(Information Gain)等标准对节点进行递归分割,以创建树状模型。决策树看起来像是以树状形式排列的一系列的if-else语句,易于理解,执行速度快。并且,它能够很好地表现多个特征之间的相互作用,适用于多种数据类型。(树状模型中,随机森林性能表现卓越)

        主要用到的包:rpart、party、randomForest

 

决策树模型   

         决策树算法中,会对数据特征不断提问,然后根据每次回答逐步对数据进行分类。

        节点(Node)的分类:节点分为根节点(Root Node)与叶节点(Leaf Node)。其中根节点位于决策树最顶部,它是分类的起始点,位于最底端且没有子节点的节点成为叶节点。

        在决策树中,对各节点提问题,并根据回答对节点进行分叉,从而实现分类数据的目的。‘不纯度’(impurity)用作评估数据分离程度的标准,将一个节点数据划分为2个子节点时,最好的提问能够使子节点的不纯度降至最低。

        节点中含有的分类越多,不纯度越高。反之,只有一个分类的时候,不纯度最低。

 

分类与回归树

        用于创建决策树的包有很多,此处使用rpart包,它实现了比较有名的分类与回归树(Classification and Regression Trees,CART)

        以下示例中,使用rpart()函数为鸢尾花数据创建决策树:

library(rpart)
m<-rpart(Species~.,data=iris)

查看m

R语言条件推理树 r语言建树_建模

结果中的n=150代表有150个数据。结果底部显示的就是决策树,缩进表示分支,*表示叶节点,loss表示误差数量。

从中可以得到结果:

鸢尾花数据中共有三个品种,各节点后括号里的数据代表了各个品种的比例

1节点为根节点

2节点的分类标准为Petal.Length<2.45,数量50,全是setosa品种

3节点的分类标准为Petal.Length>=2.45,数量100

6和 7节点都是由3节点划分的,标准为Petal.Width与1.75的关系

 

这种结果看起来不够直观,可以用plot()函数绘制决策树:

plot(m,compress=T,margin=0.2)#compress参数指定以更稠密的方式绘制决策树
text(m,cex=1.5)

R语言条件推理树 r语言建树_建模_02

这个图虽然可以很容易地知道决策树的含义,但没有具体的数量关系

利用rpart.plot包中的prp()函数可以很好地解决这个问题:

library(rpart.plot)
prp(m,type=4,extra=2,digits=3)#此处type参数为0~5

R语言条件推理树 r语言建树_决策树_03

从图中可以很清楚地看到分类和数量关系,其中品种下方的分数A/B表示B个数据中有A个属于该类(即上述loss误差)。

 

使用predict()函数可以用创建好的决策树模型对新数据进行预测。

 

条件推断决策树

        条件推断决策树(Conditional Inference Tree)用于解决CART(上述rpart实现的决策树算法)等决策树的两种问题:第一种是不判断统计的显著性,而在分割节点时产生的过度拟合问题;第二种是可分割为多种值得变量比其他变量更受偏爱的问题。

        条件推断决策树中,会根据条件分布(Conditional Distribution)测量变量与响应值(分类)之间的相关关系,选择分割节点中要使用的变量。此外,条件推断决策树中也会充分考虑决策树中重复分割节点时发生的多重假设检验(Multiple Testing)问题,并在适当的时间点停止节点分割。(多重比较问题(Multiple Testing Problem)指的是向多个对象同时统计推论时,置信区间不包含真值或错误否定零假设,这种现象发生的可能性变得很大。比如,为了判断是否分割节点,执行拥有95%置信度的假设检验。使用该检验分割3次节点时,置信度为95%*95%*95%=85.7%。因此,进行多重比较时,若不作适当修正,则置信度就会降低,置信区间与假设检验就不正确。)

        使用rpart因过度拟合而无法得到很好的性能时,使用条件推断决策树能够得到明显的改善。此外,与rpart相比,条件推断决策树提供了更易理解的图形功能。

下面的例子对鸢尾花数据应用ctree()函数,创建Species预测模型:

install.packages('party')
library(party)
m<-ctree(Species~.,data=iris)

查看m

R语言条件推理树 r语言建树_R语言条件推理树_04

结果中显示(第一行):这是一个有四个叶节点(terminal nodes)的条件推断决策树

1节点根据Petal.Length是否大于1.9分类

2节点是Petal.Length<=1.9的分类

3节点是Petal.Length>1.9的分类

在3节点下又根据Petal.Width是否大于1.7进行分类

 

使用plot()函数绘制决策树模型:

plot(m)

R语言条件推理树 r语言建树_建模_05

生成的图像可视化效果比较好,可以看到四个叶节点,但是这四个叶节点各有三个分类,图上只显示setosa一个,另外两个可以手动查看:

levels(iris$Species)

[1] "setosa"     "versicolor" "virginica" 

 

随机森林

        随机森林是一种使用集成学习(Ensemble Learning)技术的模型。集成学习中,先从给定数据学习多个模型,然后在预测时综合使用多个模型的预测结果,从而获得更高的准确度。

        随机森林使用两种方法创建多种决策树。第一种方法是在创建决策树时采用‘放回抽样’抽取一部分数据,然后只根据这些数据创建决策树,即在创建决策树时只使用一部分数据;第二种方法是指从节点数据中确定分割字节点的标准时,并不针对全体变量,而仅以部分变量为对象寻找分叉标准。

        预测新数据时,对多个决策树产生的预测结果采用投票(voting)方式决定最终结果。(比如,5个决策树中,预测为Y的有3个,预测为N的有2个,那么最终结果就确定为Y。)

        随机森林的性能通常都很优秀,它使用多个而非一个决策树进行预测,所以避免了过度拟合问题。

使用随机森林建模

        仍使用鸢尾花数据:

library(randomForest)
m<-randomForest(Species~.,data=iris)

查看m

R语言条件推理树 r语言建树_建模_06

如前所述,随机森林由多个决策树实现(创建500个决策树),每个决策树只使用一部分数据。输出随机森林模型时,使用未在模型训练中用到的数据而得到错误推断值,并显示到OOB estimate of error rate项目。鸢尾花模型中,OOB错误为4%,versicolor被预测为virginica的情形有3个,virginica被预测为versicolor的情形有三个,而setosa则没有错误出现。

可以使用predict()函数对其他数据进行预测

通过直接指定X与Y快速建模

        随机森林创建500个决策树,建模时间会大大增加,数据量也会大幅增长。

        为了避免这种情况,可以使用快速建模方法。

        快速建模的方法有很多,其中一种是不使用公式,直接指定自变量X和因变量Y进行建模。虽然使用公式比较方便,但它比直接指定(X,Y)占用更多的内存,运行速度也比较慢。

        randomForest()等几个建模函数支持通过直接指定变量的方式(不使用公式)进行建模,但并非所有建模函数都支持这种方式。

        以iris为例,直接将Species指定为Y,将其他变量指定为X:

m<-randomForest(iris[,1:4],iris[,5])

 

评估变量的重要性

        randomForest()函数的变量重要性由变量对准确度与阶段不纯度改善的贡献程度进行衡量。这样计算得到的变量重要性可以用于选择要在其他模型(比如线性回归)中使用的变量。

        调用randomForest()函数建模时,必须设置importance=T,才能获得变量的重要性。然后使用importance()、varImpPlot()函数显示结果。

        以iris数据集为例:

m<-randomForest(Species~.,data=iris,importance=T)
importance(m)

R语言条件推理树 r语言建树_数据_07

结果中的MeanDecreaseAccuracy和MeanDecreaseGini分别代表准确度和节点不纯度的改善影响。由于要根据多个决策树评估变量对准确度与不纯度改善的贡献率,所以使用了平均值(Mean)。        

使用varImpPlot()函数绘制可视化图形:

varImpPlot(m)

R语言条件推理树 r语言建树_决策树_08