决策树是一种机器学习的方法。决策树的生成算法有ID3, C4.5和C5.0等。决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。决策树是一种十分常用的分类方法,需要监管学习(有教师的Supervised Learning),监管学习就是给出一堆样本,每个样本都有一组属性和一个分类结果,也就是分类结果已知,那么通过学习这些样本得到一个决策树,这个决策树能够对新的数据给出正确的分类。
然后我们简单的来画一下决策树的过程,(来源于周志华老师的西瓜书)
以上就是来决策一个瓜是好瓜还是坏瓜的一个过程,就好像相亲一样(工资高的,年纪和我差不多的,还没结过婚的,长得高的)这样的女生才会见面,以上过程也是一个决策的过程。我们可以通过这样的一个过程来决策出一个结果。以上图为例(纹理清晰,根蒂稍蜷,色泽乌黑,触感硬滑)那就是好瓜。那么问题来了,我们要怎样去构建这一棵树呢?
对于上图而言,每一个矩形框代表着特征,每一个椭圆框代表着标签。
对于如何构建这一棵树而言:
我们要先拿到特征然后根据特征的不用属性值去划分,然后又以这个属性值为根节点直到划分到子节点为标签节点。
这时候有的机灵的朋友要开始提问了,我要是第一次就以触感来划分呢?因为我买瓜的时候就是先去看触感的,也有其他人先是看色泽的。你这个划分原则是什么?一千个哈姆雷特就----------。
其实这样都可以,但是对于算法而言,我们追求的是最优解。这里我们先说一下基本的分裂原则,我们是想把根节点分裂的所有的子集尽可能地“纯”,何为“纯”呢?就是尽量让我们的每个节点内部都属于同一类别。所有在后面就引进了ID3,C4.5,CART这三种不同的算法。
ok,我们先来度量一下:如何来确定这个"纯"?这里我们就引入了一个新东西:熵(entropy)这里也叫信息熵。
信息论之父 C. E. Shannon 在 1948 年发表的论文“通信的数学理论( A Mathematical Theory of Communication )”中指出,任何信息都存在冗余,冗余大小与信息中每个符号(数字、字母或单词)的出现概率或者说不确定性有关。
Shannon 借鉴了热力学的概念,把信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式。(来源于百度百科)。
这里,信息熵就可以来计算出样本的“纯”度。
我们先来看看信息熵的公式:这里pi表示每个特征在样本里的比例。
这个H(U)值越小代表着这个纯度越高:
好我们来假设一个样本:一个班级有20个人,10个女生,10个男生。
让我们来算一个这个班级的信息熵:
H(U)=-[(10/20)log 10/20)+(10/20)log 10/20)]这个不太好看我用软件写一下。
H(U)=−(1020log21020+1020log21020)=1
这个值一般是处于[0,1]之前的 可见在这个样本里他的信息熵为1,前面说了信息熵越小就代表着越纯,那么这个样本就是不“纯”的样本。比如说你在闭眼随机挑一个同学去猜他的性别,你只有50的记录猜对。
那么我们把样本换一下,来到一个女子大学,一个班级20人全是女生。
那么他的信息熵为:
H(U)=-[((0)log 0)+(20/20)log 20/20)]
H(U)=−(0log20+1log21)=0 这个样本就是很“纯”的一个样本。
那么我们再来猜一次 我们肯定是猜一个同学的性别,那么我们肯定是猜女生。
ok,我们了解了信息熵后;我们开始看这些算法;
ID3
ID3 算法的核心思想就是以信息增益来度量特征选择,选择信息增益最大的特征进行分裂。算法采用自顶向下的贪婪搜索遍历可能的决策树空间(C4.5 也是贪婪搜索)。其大致步骤为:
a.初始化特征集合和数据集合;
计算数据集合信息熵和所有特征的条件熵,选择信息增益最大的特征作为当前决策节点;
更新数据集合和特征集合(删除上一步使用的特征,并按照特征值来划分不同分支的数据集合);
b.重复 2,3 两步,若子集值包含单一特征,则为分支叶子节点
数据集的信息熵:
其中 表示集合 D 中属于第 k 类样本的样本子集。
针对某个特征 A,对于数据集 D 的条件熵 为:
其中 表示 D 中特征 A 取第 i 个值的样本子集, 表示 中属于第 k 类的样本子集。
信息增益 = 信息熵 - 条件熵:
OK 我们再来计算一次公式:首先我们先假设样本:
这里有17个样本(来源于周志华老师的西瓜书)
正例(好瓜)占 8/17,反例占 9/17 ,根结点的信息熵为
计算当前属性集合{色泽,根蒂,敲声,纹理,脐部,触感}中每个属性的信息增益
色泽有3个可能的取值:{青绿,乌黑,浅白}
D1(色泽=青绿) = {1, 4, 6, 10, 13, 17},正例 3/6,反例 3/6
D2(色泽=乌黑) = {2, 3, 7, 8, 9, 15},正例 4/6,反例 2/6
D3(色泽=浅白) = {5, 11, 12, 14, 16},正例 1/5,反例 4/5
3 个分支结点的信息熵
D1(色泽=青绿) = {1, 4, 6, 10, 13, 17},正例 3/6,反例 3/6
D2(色泽=乌黑) = {2, 3, 7, 8, 9, 15},正例 4/6,反例 2/6
D3(色泽=浅白) = {5, 11, 12, 14, 16},正例 1/5,反例 4/5
那么我们可以知道属性色泽的信息增益是:
同理,我们可以求出其它属性的信息增益,分别如下:
于是我们找到了信息增益最大的属性纹理,它的Gain(D,纹理) = 0.381最大。
于是我们选择的划分属性为“纹理”
如下:
OK后面就一直遍历这个节点直到根节点是"纯"的。
到这里我们知道了一棵树的构建过程,(ID3算法)。
前面所说了很多算法(ID3,C4.5,CART),既然有这么多的算法,那么这个迭代过程肯定是解决了什么问题。
对于ID3来讲,他的缺点是什么呢?他的主要是以下几个方面:
1.ID3 没有剪枝策略,容易过拟合;
2.信息增益准则对可取值数目较多的特征有所偏好,类似“编号”的特征其信息增益接近于 1;
3.只能用于处理离散分布的特征;
4.没有考虑缺失值。
对于第一点而言:没有剪枝策略,容易过拟合。比如我们在训练的时候,有一个异常数据,比如说一个触感是极其平滑,这个瓜是坏瓜。这样训练的结果会导致以后所有的触感是极其平滑是坏瓜,这样就造成了过拟合现象。
对于第二点而言:信息增益准则对可取值数目较多的特征有所偏好,类似“编号”的特征其信息增益接近于 1;比如有一个特征是人的身份证号,或者是编号。当计算这个特征的时候,特征其信息增益接近于 1。
对于第三点而言:离散型特征,就是直接用数据表示的特征。除此之外还有类别特征不能胜任。
对于第四点而言:如果有缺失值ID3算法就不能胜任。