掌握决策树ID3算法的原理,通过增益熵实现手工推导的过程。
参考案例:https://cuijiahua.com/blog/2017/11/ml_2_decision_tree_1.html
机器学习实战教程(二):决策树基础篇之让我们从相亲说起
决策树 ID3 手工推导
决策树 ID3 简介
ID3作为一种经典的决策树算法,是基于信息熵来选择最佳的测试属性,其选择了当前样本集中具有最大信息增益值的属性作为测试属性
样本集的划分则依据了测试属性的取值进行,测试属性有多少种取值就能划分出多少的子样本集;同时决策树上与该样本集相应的节点长出新的叶子节点
ID3算法根据信息论理论,采用划分后样本集的不确定性作为衡量划分样本子集的好坏程度,用“信息增益值”度量不确定性——信息增益值越大,不确定性就更小,这就促使我们找到一个好的非叶子节点来进行划分
ID3 算法的基本原理以及实例分析
我们假设一个这样的数据样本集 S,其中数据样本集 S 包含了 s 个数据样本,假设类别属性具有 m 个不同的值(判断指标):\(C_i(i=1,2,3,…,m)\)
\(S_i\) 是 \(C_i\) 中的样本数,对于一个样本集
总信息熵为:(这里信息熵的定义与其他课程中的信息熵定义一样)
其中,\(P_i\) 表示任意样本属于 \(C_i\) 的概率,也可以用 \(\frac{s_i}{s}\) 进行估计
我们假设一个属性 A 具有 k 个不同的值 \({a_1,a_2,…,a_k}\), 利用属性 A 将数据样本 S 划分为 k 个子集 \({S_1,S_2,…, S_k}\),其中 \(S_j\) 包含了集合 S 中属性 A 取 \(a_j\) 值的样本。若是选择了属性 A 为测试属性,则这些子集就是从集合 S 的节点生长出来的新的叶子节点
设 \(S_{ij}\) 是子集 \(S_j\) 中类别为 \(C_i\) 的样本数,则根据属性 A 划分样本的信息熵值为:
最后,我们利用属性 A 划分样本集 S 后得到的信息熵增益为:
决策树 ID3 的构建的准备工作
使用决策树做预测的每一步骤都很重要,数据收集不到位,将会导致没有足够的特征让我们构建错误率低的决策树。数据特征充足,但是不知道用哪些特征好,将会导致无法构建出分类效果好的决策树模型。从算法方面看,决策树的构建是我们的核心内容
决策树要如何构建呢?通常,这一过程可以概括为3个步骤:特征选择、决策树的生成和决策树的修剪
这里我们通过实例进行说明
特征选择
特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率,如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的精度影响不大。通常特征选择的标准是信息增益(information gain)或信息增益比,为了简单,本文使用信息增益作为选择特征的标准。那么,什么是信息增益?在讲解信息增益之前,让我们看一组实例,贷款申请样本数据表
希望通过所给的训练数据学习一个贷款申请的决策树,用于对未来的贷款申请进行分类,即当新的客户提出贷款申请时,根据申请人的特征利用决策树决定是否批准贷款申请
特征选择就是决定用哪个特征来划分特征空间。比如,我们通过上述数据表得到两个可能的决策树,分别由两个不同特征的根结点构成
图(a)所示的根结点的特征是年龄,有 3 个取值,对应于不同的取值有不同的子结点。图(b)所示的根节点的特征是工作,有 2 个取值,对应于不同的取值有不同的子结点。两个决策树都可以从此延续下去。问题是:究竟选择哪个特征更好些?这就要求确定选择特征的准则。直观上,如果一个特征具有更好的分类能力,或者说,按照这一特征将训练数据集分割成子集,使得各个子集在当前条件下有最好的分类,那么就更应该选择这个特征。信息增益就能够很好地表示这一直观的准则
什么是信息增益呢?在划分数据集之后信息发生的变化称为信息增益,知道如何计算信息增益,我们就可以计算每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的选择
1、香农熵
在可以评测哪个数据划分方式是最好的数据划分之前,我们必须学习如何计算信息增益。集合信息的度量方式称为香农熵或者简称为熵(entropy),这个名字来源于信息论之父克劳德·香农
如果看不明白什么是信息增益和熵,请不要着急,因为他们自诞生的那一天起,就注定会令世人十分费解。克劳德·香农写完信息论之后,约翰·冯·诺依曼建议使用"熵"这个术语,因为大家都不知道它是什么意思
熵定义为信息的期望值。在信息论与概率统计中,熵是表示随机变量不确定性的度量。如果待分类的事物可能划分在多个分类之中,则符号 \(x_i\) 的信息定义为:
其中 \(p(x_i)\) 是选择该分类的概率。有人可能会问,信息为啥这样定义啊?答曰:前辈得出的结论。这就跟 1+1 等于 2 一样,记住并且会用即可。上述式中的对数以 2 为底,也可以 e 为底(自然对数)
通过上式,我们可以得到所有类别的信息。为了计算熵,我们需要计算所有类别所有可能值包含的信息期望值(数学期望),通过下面的公式得到:
期中 n 是分类的数目。熵越大,随机变量的不确定性就越大
当熵中的概率由数据估计(特别是最大似然估计)得到时,所对应的熵称为经验熵(empirical entropy)。什么叫由数据估计?比如有 10 个数据,一共有两个类别,A 类和 B 类。其中有 7 个数据属于A类,则该 A 类的概率即为十分之七。其中有 3 个数据属于 B 类,则该 B 类的概率即为十分之三。浅显的解释就是,这概率是我们根据数据数出来的。我们定义贷款申请样本数据表中的数据为训练数据集 D ,则训练数据集 D 的经验熵为 H(D),|D| 表示其样本容量,及样本个数。设有 K 个类 \(C_k = 1,2,3,...,K\), \(|C_k|\) 为属于类 \(C_k\) 的样本个数,因此经验熵公式就可以写为 :
根据此公式计算经验熵 H(D),分析贷款申请样本数据表中的数据。最终分类结果只有两类,即放贷和不放贷。根据表中的数据统计可知,在 15 个数据中,9 个数据的结果为放贷,6 个数据的结果为不放贷。所以数据集 D 的经验熵 H(D) 为:
经过计算可知,数据集 D 的经验熵 H(D) 的值为 0.971
2、信息增益
在上面,我们已经说过,如何选择特征,需要看信息增益。也就是说,信息增益是相对于特征而言的,信息增益越大,特征对最终的分类结果影响也就越大,我们就应该选择对最终分类结果影响最大的那个特征作为我们的分类特征
在讲解信息增益定义之前,我们还需要明确一个概念,条件熵
熵我们知道是什么,条件熵又是个什么鬼?条件熵 \(H(\frac{Y}{X})\) 表示在已知随机变量 X 的条件下随机变量 Y 的不确定性,随机变量 X 给定的条件下随机变量 Y 的条件熵(conditional entropy) \(H(\frac{Y}{X})\) ,定义为 X 给定条件下 Y 的条件概率分布的熵对 X 的数学期望:
这里:
同理,当条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的条件熵称为条件经验熵(empirical conditional entropy)
明确了条件熵和经验条件熵的概念。接下来,让我们说说信息增益。前面也提到了,信息增益是相对于特征而言的。所以,特征A对训练数据集D的信息增益 g(D,A) ,定义为集合D的经验熵 H(D) 与特征 A 给定条件下 D 的经验条件熵 \(H(\frac{D}{A})\) 之差,即:
一般地,熵H(D)与条件熵H(D|A)之差称为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息
设特征A有n个不同的取值{a1,a2,···,an},根据特征A的取值将D划分为n个子集{D1,D2,···,Dn},|Di|为Di的样本个数。记子集Di中属于Ck的样本的集合为Dik,即Dik = Di ∩ Ck,|Dik|为Dik的样本个数。于是经验条件熵的公式可以些为:
说了这么多概念性的东西,没有听懂也没有关系,举几个例子,再回来看一下概念,就懂了
以贷款申请样本数据表为例进行说明。看下年龄这一列的数据,也就是特征 \(A_1\),一共有三个类别,分别是:青年、中年和老年。我们只看年龄是青年的数据,年龄是青年的数据一共有5个,所以年龄是青年的数据在训练数据集出现的概率是十五分之五,也就是三分之一。同理,年龄是中年和老年的数据在训练数据集出现的概率也都是三分之一。现在我们只看年龄是青年的数据的最终得到贷款的概率为五分之二,因为在五个数据中,只有两个数据显示拿到了最终的贷款,同理,年龄是中年和老年的数据最终得到贷款的概率分别为五分之三、五分之四。所以计算年龄的信息增益,过程如下:
同理,计算其余特征的信息增益 \(g(D,A_2)、g(D,A_3)\) 和 \(g(D,A_4)\) 。分别为:
最后,比较特征的信息增益,由于特征 \(A_3\) (有自己的房子)的信息增益值最大,所以选择 \(A_3\) 作为最优特征
决策树生成和修剪
我们已经学习了从数据集构造决策树算法所需要的子功能模块,包括经验熵的计算和最优特征的选择,其工作原理如下:得到原始数据集,然后基于最好的属性值划分数据集,由于特征值可能多于两个,因此可能存在大于两个分支的数据集划分。第一次划分之后,数据集被向下传递到树的分支的下一个结点。在这个结点上,我们可以再次划分数据。因此我们可以采用递归的原则处理数据集。
构建决策树的算法有很多,比如 C4.5、ID3 和 CART,这些算法在运行时并不总是在每次划分数据分组时都会消耗特征。由于特征数目并不是每次划分数据分组时都减少,因此这些算法在实际使用时可能引起一定的问题。目前我们并不需要考虑这个问题,只需要在算法开始运行前计算列的数目,查看算法是否使用了所有属性即可
决策树生成算法递归地产生决策树,直到不能继续下去未为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化
实例实战
一天,老师问了个问题,只根据头发和声音怎么判断一位同学的性别。
为了解决这个问题,同学们马上简单的统计了8位同学的相关特征,数据如下:
首先这里有两个属性用来判断性别:头发长短和声音粗细
这里最优特征为 A_2
参考资料
决策树——ID3算法