一、决策树
决策树的方法在分类、预测、规则提取等领域有着广泛的应用。决策树是一种树形结构,它的每一个叶节点对应一个分类,非叶节点对应某个属性上的划分,根据样本在属性上的取值将其划分为若干个子集。对于非纯的叶节点,多数类的标号给出到达这个节点样本所属的类。
例如上图是一颗决策树,首先它根据年龄分成三颗子树,然后再根据其它属性继续分。决策树的好处是它可以从数据中提取规则,这也符合人的逻辑判断习惯。对于一个数据集,我们可以构造很多棵决策树,决策树算法(ID3、C4.5等)就是根据一定的衡量标准来构造一棵最优的决策树,它使得分类效果最好。这里主要介绍ID3算法的原理和步骤。
二、信息熵介绍
1. 熵与条件熵
在信息论中,熵是表示随机变量不确定性的度量,设(X)是一个取有限个值的离散随机变量,其概率分布为:
则随机变量(X)的熵定义为
上式中,通常取对数为以(2)或(e)为低。从上面可知,熵的分布只与(X)的分布有关,而与(X)的取值无关。熵越大,随机变量的不确定性越大,又定义可知
一般的,当(n=2)时,(P(X=x_1)=p,P(X=x_2)=1-p),则(X)的熵为
(H(X))随p的变化图为
当(p=0)或者(p=1)时,(H(p)=0),随机变量完全没有不确定性,当(p=0.5)时,(H(p)=1),熵取值最大,随机变量不确定性最大。
设有随机变量((X,Y)),其联合概率分布为
条件熵(H(Y|X))表示已知随机变量(X)的条件下随机变量(Y)的不确定性,即为随机变量(X)给定的条件下随机变量(Y)的条件熵。它的定义为
如果有0概率,则定义(0log0=0)
2.信息增益
特征(A)对训练数据集(D)的信息增益为(g(D,A)),定义为集合(D)的经验熵(H(D))与特征(A)给定条件下(D)的经验条件熵(H(D|A))之差,即为
决策树的学习应用信息增益准则选择特征,给定训练集数据(D)和特征(A),经验熵(H(D))表示对数据集(D)进行分类的不确定性,而经验条件熵(H(D|A))表示在特征(A)给定的条件下对数据集(D)进行分类的不确定性,那么它们的差就表示信息增益。信息增益大的特征具有更强的分类能力。
3. 一个信息增益的计算例子
一个贷款样本的数据表
ID | 年龄 | 有工作 | 有自己的房子 | 信贷情况 | 类别 |
---|---|---|---|---|---|
1 | 青年 | 否 | 否 | 一般 | 否 |
2 | 青年 | 否 | 否 | 好 | 否 |
3 | 青年 | 是 | 否 | 好 | 是 |
4 | 青年 | 是 | 是 | 一般 | 是 |
5 | 青年 | 否 | 否 | 一般 | 否 |
6 | 中年 | 否 | 否 | 一般 | 否 |
7 | 中年 | 否 | 否 | 好 | 否 |
8 | 中年 | 是 | 是 | 好 | 是 |
9 | 中年 | 否 | 是 | 非常好 | 是 |
10 | 中年 | 否 | 是 | 非常好 | 是 |
11 | 老年 | 否 | 是 | 非常好 | 是 |
12 | 老年 | 否 | 是 | 好 | 是 |
13 | 老年 | 是 | 否 | 好 | 是 |
14 | 老年 | 是 | 否 | 非常好 | 是 |
15 | 老年 | 否 | 否 | 一般 | 否 |
下面我们来在计算每个属性条件下的信息增益,然后选择一个信息增益最大的属性。
首先计算训练数据的熵(H(D))
然后计算各个特征对(D)的信息增益,从表格左到右特征依次记做(A_1,A_2,A_3,A_4) 则
(1)计算(A_1)条件下信息增益
(2)计算(A_2)条件下信息增益
(3)同理计算(A_3)条件下信息增益
(4)同理计算(A_4)条件下信息增益
根据比较可知,特征(A_3)条件下信息增益最大,所以最优划分特征为(A_3)
三、ID3算法原理
ID3算法的思想是在决策树各个节点上应用信息增益准则来选择特征,递归的构建决策树。从根节点开始,对节点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点特征,由该特征的不同取值建立子节点,再对子节点递归的调用以上方法,构建决策树。算法流程如下:
输入:训练数据(D),特征(A),阈值 (varepsilon)
输出:决策树(T)
- 若(D)中所有实例都属于同一类(C_k),则(T)为单节点树,并将类(C_k)作为该节点的标记,返回(T).
- 若(A=emptyset),则(T)为单节点树,并将(D)中实例数最大的类(C_k)作为节点的标记,返回(T).
- 否则计算(A)中各种特征(D)的信息增益,选择信息增益最大的特征(A_g)
- 如果(A_g)的信息增益小于阈值(varepsilon),则(T)为单节点树,并将(D)中实例数最大的类(C_k)做为该节点的标记,返回(T)
- 否则,对(A_g)的每一可能值(a_i),依(A_g=a_i)将(D)分割为若干非空子集(D_i),将(D)i)中实例数最大的类作为标记,构建子节点,由节点及子节点构成树(T),返回(T)
- 对第i个子结点,以(D_i)为训练集,以(A-{A_g})为特征集,递归调用1 - 5步骤得到子树(T_i),返回(T_i)
(算法用C++实现,待续。。。)
决策树存在的问题
决策树生成算法递归的生成决策树,直到不能继续下去为止,这样产生的树往往对训练数据的分类很正确,但是对未知测试数据的分类却每那么准确,即出现过拟合现象,过拟合原因在于学习时过多的考率如何提高对训练数据的正确分类,从而构建过于复杂的决策树,解决这类问题常用的做法就是剪枝,对已生成的决策树进行简化。
(就到这里了,以后再完善。。。)