数据挖掘十大算法中的C4.5 和 CART(分类和回归树)算法都是决策树算法。其他常用的决策树算法有C5.0、Fuzzy C4.5、SLIQ(Mehta 1996)、SPRINT(Shafer 1996)等。
1 决策树算法
· 决策树是一种由节点和有向边组成的层次结构,如下图所示,树中包含三种节点
· 根节点(Root node),没有入边,但有零条或者多条出边
· 内部节点(Internal node),有一条入边和两条或多条出边
· 叶子节点(Leaf node),又叫终止节点(Terminal node),只有一条入边,没有出边
· 在决策树中,每个叶子节点都有一个类标号。非叶子结点(包括根节点和内部节点),包含属性测试条件,用于分开具有不同特性的记录。
· 决策树算法的生成过程包括:树构造(Tree building)、树剪枝(Tree pruning)
(1)树构造阶段,决策树采用自顶向下的递归方式从根节点开始在每个节点上按照给定标准选择测试属性,然后按照相应属性的所有可能取值向下建立分支、划分训练样本,直到一个节点上的所有样本都被划分到同一个类,或者某一个节点中的数量样本低于给定值时为止
(2)树剪枝阶段,构造过程得到的并不是最简单、最紧凑的决策树,因为许多分枝反映的可能是训练数据中的噪声或孤立点。树剪枝过程主要检测和去掉这种分枝,以提高对未知数据集进行分类时的准确性
· 决策树算法应用非常广泛,其独特的优点包括:
(1)是一种非参数方法,不要求任何先验假设,不假定类和其他属性服从一定的概率分布
(2)决策树的训练时间相对较少,即使训练集很大,也可以快速的构建分类模型
(3)决策树的分类模型是树状结构,简单直观,符合人类的理解方式
(4)可以将决策树中到达每个叶结点的路径转换为 if --- then 形式的分类规则,这种形式更有利于理解
(5)对于噪声的干扰具有较好的鲁棒性,训练数据可以包含错误或缺少属性值
· 决策树算法的缺点:
(1)决策树算法属于贪心算法,只能是局部最优
(2)对于何时停止剪枝需要由较准确的把握
· 决策树的应用,是通过对未分类实例的属性与决策树比较,实现对未分类实例的类别判定
· 决策树算法适用于用 属性-键值对 表示的实例
· 决策树是利用信息论原理对大量样本的属性进行分析和归纳产生的
2. 信息论基础知识
(1)信息量
· 若存在n个相同概率的消息,则每个消息的概率 p = 1/n ,一个消息传递的信息量为 -Log2(1/n) (即基数为2的概率的对数)。
· 例如,有32个相同概率的消息,则每个消息传递的信息量为 -Log2(1/32) = 5 ,即每个消息传递的信息量为5,需要用5个比特来表示1个消息
(2)熵
· 若有n个消息,其给定概率分布为 P = ( p1, p2, ... , pn),则由该分布传递的信息量称为 P 的熵,记为(第一行少了一个负号)
(3)分类集合信息量
· 若一个记录集合T根据类别属性的值被分为互相独立的类C1,C2,...,Ck,则识别T的一个元素属于哪个类所需要的信息量为 Info(T) = I(P),其中 P 为C1,C2,...Ck的概率分布,即
· 若现根据非属性类别 X 的值将 T 分成集合T1,T2,...Tk,则在已得到的属性X的之后确定T中一个元素类的信息量(也称期望熵)为:
(4)信息增益度
· 信息增益度是两个信息量之间的差值,其中之一是要确定T中元素类别的信息量,另一个信息量是在已得到的属性X的值后需确定的T中元素类别的信息量,信息增益度公式为
3. ID3算法(Iterative Dichotomic version3)
· ID3 算法采用信息增益度作为属性划分的衡量标准,从而实现对数据的归纳分类。其中,训练集中的记录可表示为(V1,V2,...,Vn;C),其中 Vi 表示属性值,C 表示类标签
· ID3 算法计算每个属性的信息增益度,并总是选取具有最高增益度的属性作为给定集合的测试属性。对被选取的测试属性创建一个节点,并以该节点的属性标记,对该属性的每个值创建一个分支,据此划分样本
· ID3 算法过程如下:
· 输入:样本集合S,属性集合A
· 输出:ID3决策树
· (1)若所有种类的属性都处理完毕,返回;否则,执行(2)
· (2)计算出信息增益最大属性a,把该属性作为一个节点。
· (3)对属性a的每个可能的取值v,执行下一步操作
· i. 将所有属性a的值为v的样本作为S的一个子集Sv;
· ii. 生成属性集合 AT = A - {a};
· iii. 以样本集合Sv和属性集合AT为输入,递归执行ID3算法
下面以上图为例说明算法过程。
在给出的样本数据中,“Play Ball”属性包含 9 个yes和 5 个no,则对应于该属性的期望信息(熵)为:
再根据OutLook的信息,分别计算
· 此时,具有最高的信息增益度的属性为Outlook属性,以该属性为节点进行分支。Outlook属性中有3个取值,分别为Sunny,Overcast,Rain,分别分别对应3个分支,将数据集划分为3个子集,S(sunny), S(overcast), S(rain)
· 在Sunny分支下,递归调用(S(sunny),R - Outlook,C)分别计算得到Temperature属性的信息增益度为0.57,Humidity属性的信息增益度为0.97,Wind属性的信息增益度为0.02.因此,在此分支下再以Humidity属性对子集S(sunny)进行划分,得到子集SS(high)和SS(normal),这两个子集的所有样本都属于同一类别,因此停止树的分裂,添加两个叶子节点,并写上子集的类别即可。最终的决策树如下图
· 在生成决策树以后,可以方便的提取决策树描述的知识,并表示成 if - then 形式的分类规则。沿着根节点到叶子节点每一条路径对应一条决策规则。如 if { Outlook = Sunny , Humidity = High } , then { Play ball = No }.
· 在生成决策树的过程中,除了要选择测试属性还要判断是否停止树的分裂,如在得到子集SS(high)和SS(normal)后停止了树的分支构造。停止树的分裂的条件如下所示,只要满足以下三个条件中的1条,即可停止树的分支构造。
· i. 子集中的所有记录属于同一类树时
· ii. 所有的记录具有相同的属性值
· iii. 提前终止树的分裂
· ID3算法在实际应用中存在一些问题。如在选择根节点和内部节点中的分支属性时采用信息增益度作为评价标准。信息增益度的缺点是倾向于选择取值较多的属性,但在有些情况下这类属性可能不会提供太多有价值的信息。另外,ID3算法只能对离散型属性的数据集构造决策树。而在ID3的基础上Quinlan提出了C4.5算法(泛指基本的C4.5、C4.5-nopruning以及拥有多重特性的C4.5-rules等诸多变体的一套算法)
4. C4.5算法
· 继承了ID3算法,并在以下几个方面对ID3算法进行了改进
(1)用信息增益率来选择最佳分裂属性,弥补了用信息增益选择属性时偏向选择取值多的属性的不足;
(2)在树构造过程中进行剪枝;
(3)能够完成对连续属性的离散化处理;
(4)能够对不完整数据进行处理。
①。信息增益率
C4.5算法并不是直接选择增益率最大的,而是使用了一种启发式的方法:先从候选划分属性中找出信息增益高于平均水平的,再从其中选择增益率最高的
②。处理连续属性值
· ID3算法把属性值假设为离散型,但是实际生活中很多属性是连续值。C4.5算法对连续属性的处理有两种办法,一种是基于信息增益度的,另一种则是基于最小描述长度原理。
· 基于信息增益的连续属性离散化处理过程如下:
(1)对属性的取值进行排序
(2)两个属性取值之间的中点作为可能的分裂点,将数据集分为两部分,计算每个可能的分裂点的信息增益度(InfoGain)
(3)选择修正后信息增益度最大的分裂点作为该熟悉的最佳分裂点
· 与离散属性不同,若当前节点划分的属性为连续属性,该属性还可以作为其后代节点的划分属性。
③。处理缺省不完整数据
· 在某些情况下,可供使用的数据可能缺少某些属性的值。例如< x , c(x) >是样本集T中的一个训练实例,但是其属性R的值R(x)未知
· 处理缺少属性值的测量包括:
(1)忽略不完整的数据;
(2)赋给它训练实例中该属性的最常见值;
(3)一种更复杂的策略是为R的每个可能值赋予一个概率。
· 例如,给定一个布尔属性R,如果节点 N 包含 6 个已知 R=1 和 R=0 的实例,那么 R(x)=1 的概率是 0.6,而R(x)=0 的概率是0.4。于是,实例 x 的 60%被分配到 R=1 的分支,40%被分配到另一个分支
· 以下图为例,介绍用C4.5建立决策树的方法
训练集有4个属性,即属性集合 A = {天气,温度,适度,风速};而类属性有 2 个,即类标签集合 C={ 进行,取消 },分别表示适合户外运动和不适合户外运动
数据集 D 包含 14 个训练样本,其中属于类别“进行”的有9个,属于类别“取消”的有5个,则其信息熵为:
Info(T) = - 9/14 * log2 (9/14) -5/14 * log2 (5/14) = 0.940
对属性集中每个属性分别计算信息熵,如下所示:
Info(天气,T) = 5/14 *[-2/5 *log2 (2/5) - 3/5 *log2 (3/5) ] + 4/14 *[ -4/4 * log2 (4/4) ] + 5/14 * [ -3/5 * log2 (3/5) - 2/5 * log2 (2/5) ] = 0.694
Info(温度,T) = 4/14 * [ -2/4 *log2 (2/4) - 2/4 *log2 (2/4) ] + 6/14 * [ -4/6 *log2 (4/6) - 2/6 * log2(2/6) ] +4/14 * [-3/4 * log2(3/4) - 1/4 * log2(1/4) ] = 0.911
同理可计算 Info(湿度,T) = 0.789 , Info(风速,T) = 0.892
信息增益率的计算:
SplitInfo(天气,T)= -5/14 *log2(5/14) - 5/14 *log2(5/14) - 4/14 *log2(4/14) = 1.577406
SplitInfo(温度,T)= -4/14 *log2(4/14) - 6/14 *log2(6/14) - 4/14 *log2(4/14) = 1.556656
同理可计算 SplitInfo(湿度,T)= 1.0 , SplitInfo(风速,T)= 0.985
计算信息增益度:
Gain(天气,T)= Info(T)- info(天气,T)= 0.94-0.694 = 0.246
Gain(温度,T)= Info(T)- info(温度,T)= 0.94-0.911 = 0.029
同理可计算 Gain(湿度,T)=0.151,Gain(风速,T)=0.04
计算信息增益率:
GainRatio(天气,T)= Gain(天气,T)/ SplitInfo(天气,T)= 0.246 / 1.577 = 0.155952
GainRatio(温度,T)= Gain(温度,T)/ SplitInfo(温度,T)= 0.029 / 1.557 = 0.018629
同理,GainRatio(湿度,T) = 0.151,GainRatio(风速,T) = 0.04871968
根据计算得到的信息增益率进行选择属性集中的天气属性作为决策树节点,对该节点进行分裂,如图所示:
· 目前有很多可用的C4.5软件实现,如Weka(Waikato Environment for Knowledge Analysis),是一款免费的、非商业化的、基于Java环境下开源的机器学习(Machine learning)以及数据挖掘(Data minning)软件。Weka中对C4.5的Java实现被命名为J48
④。剪枝
· 基本策略:预剪枝 、 后剪枝
预剪枝是在决策树生成过程中,如果这个节点进行划分,不能带来泛化性能的提升,则停止划分并将该节点设置为叶子节点。
后剪枝则是先训练好一棵树,然后自底向上对非叶子结点进行考察,如果该节点对应的子树替换为叶节点后能带来泛化性能的提升,则将该子树替换为叶结点。
· 预剪枝在每次决定用一个特征去划分数据集的时候,都用验证集的数据去判断这次划分能否提高验证集的精度
优点:预剪枝使得决策树很多分支都没有“展开”,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销
缺点:虽然某次划分可能并不能带来性能上的提升,但是后序的划分可能会带来性能上的提升。预剪枝给决策树带来欠拟合的风险
· 后剪枝就是从某个节点后续划分去掉,将该节点设置为叶结点时,如果性能得到提升则进行剪枝操作
从性能上来讲,后剪枝一般比预剪枝的性能要好,但是其时间开销会更大。
剪枝举例: (线上为训练集,线下为验证集)
未剪枝: