一、概述

决策树算法是一种被广泛使用的分类算法,它借助于树的分支结构实现分类(可以是二叉树或非二叉树),树中的每一个节点表示对象属性的判断条件,其分支表示符合节点条件的对象,叶子节点表示对象所属的预测结果。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

二、决策树ID3算法

(一)特征选择方法

信息论中的熵,度量了事物的不确定性,熵值越大,表明事物越不确定。随机变量X的熵的表达式为:



R语言对iris决策树分类 基于r语言决策树的分析_r语言 C4.5 剪枝是用什么算法

其中n代表X的n种不同的离散取值,代表X取值为i的概率,log为以2或者e为底的对数。例如,X有2个可能的取值,且这两个取值的概率都为1/2,则X的熵值为:



R语言对iris决策树分类 基于r语言决策树的分析_R语言对iris决策树分类_02

变量X和Y的联合熵表达式为:



R语言对iris决策树分类 基于r语言决策树的分析_R语言对iris决策树分类_03

条件熵的表达式为:



R语言对iris决策树分类 基于r语言决策树的分析_输入广义表表示建立二叉树的算法c++_04

含义为在X已知的情况下,Y的不确定性的减少程度,在决策树的ID3算法中被称作信息增益,ID3算法就是用信息增益来判断节点应该用什么特征来构建决策树,信息增益越大,表明该特征越适合用来分类。

(二)不足之处

(1)ID3算法没有考虑连续特征;

(2)ID3算法采用信息增益大的特征优先建立决策树的节点;在相同条件下,取值比较多的特征比取值少的特征信息增益大,在这种情况下,易出现错误建立节点的情况;

(3)ID3算法没有考虑有缺失值的情况;

(4)ID3算法没有考虑过拟合的问题。

三、决策树C4.5算法的改进

对于ID3算法不能处理连续特征的问题,C4.5的思路是将连续的特征离散化。比如m个样本的连续特征A有m个,将其从小到大进行排列,C4.5取相邻两样本值的平均数,一共取得m-1个划分点,对于这m-1个点,分别计算以该点作为二元分类点时的信息增益。选择信息增益最大的点作为该连续特征的二元离散分类点。

对于第二个问题——将信息增益作为选择节点的标准偏向于取值较多的特征。引入了一个变量,叫做信息增益比,它是信息增益和特征熵的比值,表达式为:



R语言对iris决策树分类 基于r语言决策树的分析_输入广义表表示建立二叉树的算法c++_05

D为样本特征输出的集合,A为样本特征,对于特征熵,表达式为:



R语言对iris决策树分类 基于r语言决策树的分析_R语言对iris决策树分类_06

其中,n为特征A的类别数,Di为特征A的第i个取值对应的样本个数,|D|为样本个数。

特证数越多的特征对应的特征熵越大,将它放在分母的位置,可以校正信息增益容易偏向于取值较多的特征的问题。

对于第三个缺失值处理的问题,主要需要解决两个子问题,一是在样本某些特征缺失的情况下选择划分的属性,二是选定了划分属性,对于在该属性下缺失特征的样本的处理。

对于第一个子问题,对于某一个有缺失特征值的特征A。C4.5的思路如下:首先,对每个样本设置一个权重,将数据划分成两部分,一部分是有特征A的数据集D1,另一部分是没有特征A的数据集D2;然后,数据集D1和对应特征A的各个特征值一起计算加权后的信息增益比;最后,再乘上系数,该系数是无特征A缺失的样本加权后所占加权总样本的比例。

对于第二个子问题,按各个子节点样本的数量比例将缺失特征的样本分配到所有的子节点。

四、CART分类树算法的简单介绍

(一)CART分类树算法的最优特征选择方法

ID3算法和C4.5算法都是基于信息论的熵模型,涉及了大量的对数运算和排序问题,模型复杂,运算强度大。CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,不纯度越低,特征越好,这与信息增益以及信息增益比是相反的。

具体的,在分类问题中,假设有K个类别,第k个类别的概率为Pk, 则基尼系数的表达式为:



R语言对iris决策树分类 基于r语言决策树的分析_r语言 C4.5 剪枝是用什么算法_07

特别的,对于样本D,如果根据特征A的某个值a,把D分成D1和D2两部分,则在特征A的条件下,D的基尼系数表达式为:



R语言对iris决策树分类 基于r语言决策树的分析_r语言 C4.5 剪枝是用什么算法_08

对于二类分类,基尼系数和熵之半的曲线如图1:



R语言对iris决策树分类 基于r语言决策树的分析_r语言 C4.5 剪枝是用什么算法_09

图1   基尼系数和熵之半的曲线

从图1可以看出,基尼系数和熵之半的曲线非常接近,仅仅在45度角附近误差稍大。因此,基尼系数可以做为熵模型的一个近似替代,而CART分类树算法就是使用的基尼系数来选择决策树的特征。同时,为了进一步简化,CART分类树算法每次仅仅对某个特征的值进行二分,而不是多分,这样CART分类树算法建立起来的是二叉树,而不是多叉树。这样不仅可以进一步简化基尼系数的计算,还可以建立一个更加优美的二叉树模型。

五、ID3、C4.5和CART的比较总结

表1    ID3、C4.5和CART的对比总结


R语言对iris决策树分类 基于r语言决策树的分析_信息增益_10

六、实证分析

使用CART分类树算法对数据进行处理

R语言代码(仅供参考)setwd("C:\\Users\\宋迎晓\\Desktop")rm(list=ls())accepts"accepts.csv")str(accepts)accepts$bad_indas.factor(accepts$bad_ind)names(accepts)accepts=accepts[,c(3,7:24)]set.seed(10)select1:nrow(accepts),length(accepts$bad_ind)*train=accepts[select,]#将数据分为训练集test=accepts[-select,]#将数据分为测试集summary(train$bad_ind)trainlibrary(rpart)tc 20,minbucket=rpart.mod=rpart(bad_ind ~.,data=train,ethod="class",                parms = list(prior = c(0.65,0.35),split = "gini"),                control=tc)summary(rpart.mod)rpart.mod$variable.importance#看变量重要性rpart.mod$cp#cp是每次分割对应的复杂度系数plotcp(rpart.mod)library(rpart.plot)rpart.plot(rpart.mod,branch=1, extra=106, under=TRUE, faclen=0,           cex=0.8, main="决策树")#画树状图rpart.mod.pru"xerror"]),rpart.plot(rpart.mod.pru,branch=1, extra=106, under=TRUE, faclen=0,           cex=0.8, main="决策树")#绘制剪枝后的树状图 rpart.pred#预测pre2]>