【机器学习】算法原理详细推导与实现(七):决策树算法

【机器学习】算法原理详细推导与实现(七):决策树算法

在之前的文章中,对于介绍的分类算法有逻辑回归算法朴素贝叶斯算法,这类算法都是二分类的分类器,但是往往只实际问题中(y)不仅仅只有({0,1}),当出现一个新的类别(y=2)时,之前的分类器就不太适用,这里就要介绍一个叫做 决策树的新算法,该算法对于多个目标的离散特征往往有比较好的分类效果,用以解决(x)是离散型的数据,这是判别模型,也是一个生成学习算法。

ID3决策树

假设当前网上有很多机器学习的教程,我想学机器学习,但是不知道哪一个教程比较好;又或者想买一个榴莲,不知道哪一只肉比较厚实,不知道该挑那一只,对于这种不确定性就叫做熵。

当一个事情有多种可能情况时,这件事情对于观察人而言具体是哪种情况的不确定性叫做熵。

信息

当你不知道选择哪一篇教程来学习机器学习时,有人和你说TTyb的机器学习教程很好,这个人对你提供的 TTyb的机器学习教程很好就是信息;又或者在买榴莲的时候,卖榴莲的人和你说这个榴莲的肉肯定很厚实,卖榴莲的人和你说的 这个榴莲的肉肯定很厚实就是信息。当某件事情存在不确定性,能够消除观察人对于某件事情的不确定性,也就是前面说的熵,能够消除不确定性的事物叫做信息。

信息有很多种表现形式,能够调整不确定的概率的事物可以叫做信息

例如卖榴莲的老板说有很大概率这个榴莲的肉可能很厚实;能够排除干扰的事物可以叫做信息,例如卖榴莲的老板说这个榴莲壳厚,肉肯定小不要选择这个;能够确定情况的事物可以叫做信息,卖榴莲的老板说这个榴莲肉肯定很厚实,开了不厚实算我的。

熵和信息数量相等,意义相反,获取信息意味着消除了不确定性熵。

信息熵

假设有4个榴莲只有一个肉是厚实的,老板和你说榴莲A的肉不厚实,给你提供了(0.4bit)的信息,榴莲B的肉不厚实,给你提供了(0.6bit)的信息,榴莲C的肉不厚实,给你提供了(1bit)的信息,最后让你确定了榴莲D肉是厚实的。老板每次都给你提供了一次信息,为什么提供的信息量却是不一样的?信息是如何量化的?回想一下什么东西有单位,质量、温度等物理量,信息也是一个物理量,要测量这个物理量,不妨回想一下我们是怎样测量质量的,”千克”最初又是怎么被定义出来的。

【机器学习】算法原理详细推导与实现(七):决策树算法

其实我们最初并不知道千克的质量,而是选定了一个参照物,把这个物体的质量就称为 千克。当想要测量其他物体的质量时,就看这个物体的质量相当于多少个参照物体的质量,这里的”多少个”便是千克,如果参照物体换成”斤”,那么单位就会变化。

【机器学习】算法原理详细推导与实现(七):决策树算法

测量信息也是一样,既然信息消除的是不确定性,那么就选择另外一个事件的不确定性作为参照事件,当想要测量其他事件的信息时,就看待测事件的不确定性相当于”多少个”参照事件的不确定性,这里的多少个便是信息量。即待测物体质量为(m),参照物体个数(信息量)为(n),参照物体质量(千克)为(x),那么:

[m=n\times x ]

均匀分布的信息熵

当选择的参照物事件是像抛硬币这样,只有两种等概率情况的事件时,测得的信息量的单位就被称为比特(bit),然而测量参照物体个数(信息量)(n)时,我们是用待测物体质量(m)除以参照物体质量(千克)(x),即:

[n=\frac{m}{x} ]

可是测量信息时却不能用除法,因为抛掷3个硬币能够产生的等可能结果并非(3\times 2=6),而是(2^3=8)种,也就是说信息量不是线性关系,而是指数关系:

|正正正|反正正|
|正反正|正正反|
|反反正|反正反|
|正反反|反反反|

所以当知道可能情况的个数(m),想求这些情况相当于多少个(n)参照事件(x)所产生的,用指数运算的反函数,即对数运算计算:

[n=log_xm ]

而这里硬币只有正面和反面,那么这里的参照事件(x=2),公式变换为:

[n=log_2m ]

上面的式子代表,在抛硬币的实验中,假设8个不确定情况就相当于3个硬币抛出来结果(3=log_28),即信息量为(3bit);4个不确定情况就相当于2个硬币抛出来结果(2=log_24),即信息量为(2bit)。

一般分布的信息熵

而上面讲的时抛掷硬币,被测事件的所有可能情况都是等概率事件,但是如果存在如下假设, 这里有4个榴莲,只有一个榴莲的肉是厚实的,其他3个榴莲的肉是不厚实的

【机器学习】算法原理详细推导与实现(七):决策树算法

那么买到肉是厚实榴莲的不确定性(信息熵)为(log_24=2bit),因为这里可能情况的个数(m=4),所以不确定性是(2bit)。但是如果老板和你说最大的那个(最右边圆圈)榴莲有50%概率是肉厚的,那么从概率上来说买最大的那个(最右边圆圈)是肉厚的概率为(\frac{1}{2}),取出不是肉厚的概率是(\frac{1}{3}\times \frac{1}{2}),这里代表剩下3个榴莲要瓜分剩下的(\frac{1}{2})概率,所以剩下3个榴莲每个的概率是(\frac{1}{6}),这时候各个情况的概率不一样了:

【机器学习】算法原理详细推导与实现(七):决策树算法

这时该如何计算总信息量了呢?这时候就要分别测量每种可能情况的信息量后,乘以他们各自发生的概率再相加即可,即这时候买到肉厚的榴莲的不确定性(信息熵)为:

[\frac{1}{6}log_2m_1+\frac{1}{6}log_2m_2+\frac{1}{6}log_2m_3+\frac{1}{2}log_2m_4 ]

不过怎么测量每种情况的信息量(log_2m)呢,怎么知道概率为(\frac{1}{6})的情况的不确定性相当于抛掷多少个硬币所产生的不确定性呢?我们确实没有办法用(log_2m)这个公式了,但是我们知道(1%)会发生的情况,相当于从100个等概率情况中确定实际情况,即(p=1%=frac{1}{100}),概率的倒数等于等概率情况的个数,即(m=\frac{1}{100}=\frac{1}{p}),用概率的倒数(\frac{1}{p})替换等概率情况的个数(m)后,我们就可以计算每种情况的信息量了:

[m_1=\frac{1}{\frac{1}{6}},m_2=\frac{1}{\frac{1}{6}},m_3=\frac{1}{\frac{1}{6}},m_4=\frac{1}{\frac{1}{2}} ]

再用每个情况的信息量乘以对应事件发生的概率,再相加后就能算出总信息量了:

[\frac{1}{6}log_2\frac{1}{\frac{1}{6}}+\frac{1}{6}log_2\frac{1}{\frac{1}{6}}+\frac{1}{6}log_2\frac{1}{\frac{1}{6}}+\frac{1}{2}log_2\frac{1}{\frac{1}{2}}=1.79bit ]

由此可得到,任何随机变量(X)信息熵为:

[H(X)=\sum_{i=1}^n p_ilog_2\frac{1}{p_i} ]

信息增益

既然任何随机变量(X)信息熵为:

[H(X)=\sum_{i=1}^n p_ilog_2\frac{1}{p_i} ]

那么假设(p)是随机变量(X)发生的概率,如果存在多个变量(X)和(Y),则他们的联合熵为:

[H(X,Y)=\sum_{i=1}^n p(x_i,y_i)log_2p(x_i,y_i) ]

其中(p(x_i,y_i))代表事件(X=x)和(Y=y)一起出现的联合概率。有了联合熵,又可以得到条件熵的表达式(H(X|Y)),条件熵类似于条件概率,当事件(Y)发生过后,事件(X)还剩下的不确定性(信息熵):

[\begin{split} H(X|Y)&=\sum_{y} p(y)H(X|Y=y) \ &=-\sum_{y} p(y)\sum_{x}p(x|y)log(p(x|y)) \ &=-\sum_{y}\sum_{x}p(x,y)log(p(x|y)) \ &=-\sum_{x,y}p(x,y)log(p(x|y)) \end{split} ]

其中(H(X|Y)=H(X,Y)−H(Y)),信息熵和信息增益的关系如下图所示:

【机器学习】算法原理详细推导与实现(七):决策树算法

左边的椭圆代表随机变量(X)的信息熵(H(X)),右边的椭圆代表随机变量(Y)的信息熵(H(Y)),中间重合的部分就是信息增益(I(X,Y)), 左边的椭圆去掉重合部分就是(H(X|Y)),右边的椭圆去掉重合部分就是(H(Y|X)),两个椭圆的并就是(H(X,Y)),由此可以得到信息增益的公式为:

[I(X,Y)=H(X)−H(X|Y) ]

回到最初的问题,当4个榴莲中不知道那个是肉厚的榴莲的时候,随机变量(X=肉厚),不确定性(信息熵)的套用公式为:

[\begin{split} H(X)&=\sum_{i=1}^n p_ilog_2\frac{1}{p_i} \ &=\frac{1}{4}log_2\frac{1}{\frac{1}{4}}+\frac{1}{4}log_2\frac{1}{\frac{1}{4}}+\frac{1}{4}log_2\frac{1}{\frac{1}{4}}+\frac{1}{4}log_2\frac{1}{\frac{1}{4}} \ &=2 \end{split} ]

假设每个榴莲从左到右记为随机变量(X1)、(X2)、(X3)、(X4),老板告诉说最大的那个(X4)(最右边圆圈)榴莲有50%概率是肉厚的,即提供了信息(Y),求肉厚的信息熵。这时候先计算的信息熵为条件熵(H(X|Y)):

[\begin{split} H(X|Y)&=H(X1)+H(X2)+H(X3)+H(X4|Y=y) \ &=\frac{1}{6}log_2\frac{1}{\frac{1}{6}}+\frac{1}{6}log_2\frac{1}{\frac{1}{6}}+\frac{1}{6}log_2\frac{1}{\frac{1}{6}}+\frac{1}{2}log_2\frac{1}{\frac{1}{2}} \ &=1.79bit \end{split} ]

最后由总的不确定性(信息熵)减去后面的不确定性(信息熵),得到老板说的话”最大的那个(最右边圆圈)榴莲有50%概率是肉厚的”提供的信息为:

[\begin{split} I(X,Y)&=H(X)−H(X|Y) \ &=2-1.79 \ &=0.21bit \end{split} ]

提供的信息(0.21bit)也叫做 信息增益

ID3决策树算法步骤

输入的是(m)个样本,样本输出集合为(X),每个样本有(n)个离散特征,特征集合即为(Y),输出为决策树(T)。例如存在样本如下所示:

天气 气温 湿度 风力 外出 晴朗 高温 高 无风 否 晴朗 高温 高 有风 否 多云 高温 高 无风 是 下雨 温暖 高 无风 是 下雨 寒冷 正常 无风 是

则样本数量(m=5);输出集合为 是或者 否,即(X_1=是,X_2=否);每个样本的离散特征为(n=4),即 天气气温湿度风力;特征集合为(Y),当离散特征(Y’)是 天气时,特征集合(Y_i)为 {晴朗,多云,下雨}。算法的过程为:

  1. 计算(m)中的各个特征(一共(n)个)对输出(X)的信息增益,选择信息增益最大的特征(Y’),其中(Y’ \in Y)
  2. 按特征(Y’)的不同取值(Y_i)将对应的样本输出(X)分成不同的类别(X_i),其中(i \in n)。每个类别产生一个子节点。对应特征值为(Y_i)。返回增加了节点的数(T)。
  3. 对于所有的子节点,令(X=X_i,m=m−{Y’})递归调用1-2步,得到子树(T_j)并返回。

C4.5决策树

ID3算法虽然提出了新思路,但是还是有如下4点需要改进的地方:

  1. ID3没有考虑连续特征,比如长度、密度都是连续值,无法在ID3运用,这大大限制了ID3的用途。–数据分箱即可解决
  2. ID3采用信息增益大的特征优先建立决策树的节点,但信息增益准则对可取值数目较多的属性有所偏好。
  3. 算法对于缺失值的情况没有做考虑。–特征工程即可解决
  4. 没有考虑过拟合的问题。–预剪枝和后剪枝

对于上面的第2点需要做一下解释。从上面可以知道,ID3信息增益的计算公式为:

[I(X,Y)=H(X)−H(X|Y) ]

信息增益的大小取决于随机变量(Y)信息熵的大小,(H(X|Y))越小则信息增益越大,而什么情况下(H(X|Y))会有极小的信息熵呢?举一个极端的例子,如果上面的例子中,变量天气的特征互不相同变成:

天气 气温 湿度 风力 外出 大晴 高温 高 无风 否 小晴 高温 高 有风 否 多云 高温 高 无风 是 大雨 温暖 高 无风 是 小雨 寒冷 正常 无风 是

那么天气的信息熵会等于0,计算如下,当天气为大晴时,(\frac{1}{1})的概率不外出,(0)的概率外出,那么大晴的信息熵(H(X=外出|Y=大晴))为:

[\begin{split} H(X=外出|Y=大晴)&=\frac{1}{1}log_2\frac{1}{\frac{1}{1}}+0log_20 \ &=0 \end{split} ]

同理天气条件下其他特征的信息熵都是(0),那么天气的信息熵(H(X=外出|Y=天气)=0),得到天气的信息增益就最大了。也就是说决策树给天气这个属性下的离散特征都单独分成了一个子类,也就是说有多少种天气情况就有多少种取值,那么原数据集中有多少个离散特征,就会被划分为多少个子类。虽然这种划分毫无意义,但是从信息增益准则来讲,这就是最好的划分结果。

对于这种结果看似完美划分了随机变量的特征,然而根据 大数定律,只有当样本数足够多的时候,频率才可以准确的近似概率。也就是说, 样本数越少,对概率的估计结果的方差就会越大,结果也就越不准。想象一下做抛硬币实验来近似正面向上的概率,如果只抛两次,那么得到的正面向上的概率可能会非常离谱。而如果抛1万次,不论何时何地几乎总能得到近似0.5的概率。

而C4.5就是为了解决 信息增益准则对可取值数目较多的属性有所偏好这种问题,由此提出了 信息增益比,计算公式为:

[Ir=(X,Y)=\frac{I(X,Y)}{IV(Y)} ]

其中(IV(Y))计算方式为:

[IV(Y)=\sum_yp_ylogp_y ]

(p_y)等于随机变量(Y=y)的概率。当信息熵(H(X|Y))最小时,也就是分类各不相等的时候,(IV(Y))也相对最小,这样就减轻了划分行为本身的影响。

cart决策树

基尼系数

有一个盒子里面放着小球,如果小球的颜色都是绿色,那么代表绿色的概率是(p_绿=1),我们可以称随机变量(X=绿)是纯正的:

【机器学习】算法原理详细推导与实现(七):决策树算法

如果盒子里面的小球包含不同的颜色,不同颜色发生的概率为(p_1,p_2,…),我们可以称随机变量(X)不纯正的:

【机器学习】算法原理详细推导与实现(七):决策树算法

假设某组样本存在多个随机变量(X_1,X_2,…,X_n),他们各自发生的概率是({p_1,p_2,…,p_n}),那么这组样本的纯正程度可以使用基尼系数(Gini)衡量:

[Gini=1-p_1^2-p_2^2-…-p_n^2 ]

假设一个盒子存在3种颜色的小球,他们的概率是:({\frac{1}{3},\frac{1}{3},\frac{1}{3}}),那么基尼系数为:(Gini=1-(\frac{1}{3})^2-(\frac{1}{3})^2-(\frac{1}{3})^2=0.6666)。其他情况的基尼系数计算:

({\frac{1}{10},\frac{2}{10},\frac{7}{10}}),({1,0,0})

计算的基尼系数为:

[Gini=1-(\frac{1}{10})^2-(\frac{2}{10})^2-(\frac{7}{10})^2=0.46 ]

[Gini=1-(1)^2-(0)^2-(0)^2=0 ]

基尼系数越大,代表样本越不纯净;基尼系数越小,代表样本越纯净,最终会找出(Gini)指数最小的来作为最优的划分点

剪枝

决策树算法为了避免过拟合和简化决策树模型,提出了剪枝的方法,剪枝分为预剪枝和后剪枝,剪枝的原理如下:

  • 预剪枝:在构造决策树的同时进行剪枝,也就是在节点划分前进行判断。所有决策树的构建方法,都是在无法进一步降低熵的情况下才会停止创建分支的过程,为了避免过拟合,可以设定一个阈值,熵减小的数量小于这个阈值,即使还可以继续降低熵,也停止继续创建分支。但是这种方法实际中的效果并不好。
  • 后剪枝:在决策树生长完全构造好了过后,对树进行剪枝。剪枝的过程是对拥有同样父节点的一组节点进行检查,判断如果将其合并,熵的增加量是否小于某一阈值。如果确实小,则这一组节点可以合并一个节点。后剪枝是目前最普遍的做法。

【机器学习】算法原理详细推导与实现(七):决策树算法

常见的剪枝有REP(Reduced Error Pruning)、PEP(Pessimistic Error Pruning)、CCP(Cost Complexity Pruning)和MEP(Minimum Error Pruning)算法,以下分别进行说明。

Reduced-Error Pruning(REP,错误率降低剪枝)

REP是最简单粗暴的一种后剪枝方法,其目的减少误差样本数量。该算法是从下往上依次遍历所有的子树,直至没有任何子树可以替换使得在验证集上的表现得以改进时,算法就可以终止。

假设树(T)存在很多结点(t),其中(t \in T),(e(t))表示节点(t)下训练样本误判的数量,则有训练样本误判总数量(f(T))为:

[f(T)=-\sum_{t \in T}e(t) ]

假设树(T)去掉某个节点(t’)变成树(T’),则有训练样本误判总数量(f(T’))为:

[f(T’)=-\sum_{t \in T’}e(t) ]

如果误判的数量降低,即剪枝之后使得误差降低:

[f(T) \leqslant f(T’) ]

那么代表剪枝后能使误差降低,剪枝成功。反复进行上面的操作,从底向上的处理结点,删除那些有害的结点,直到进一步修剪不能减低误差为止。例如:存在如下一棵树:

【机器学习】算法原理详细推导与实现(七):决策树算法

Step 1: 将节点4删掉替换成8和9,测试在验证集上的表现,若表现更好,则将节点4删掉并替换成8和9的并集,若表现不好则保留原树的形状
Step 2: 将节点2删掉替换成8、9和5,测试在验证集上的表现
Step 3: 将节点3删掉替换成6和7,测试在验证集上的表现

【机器学习】算法原理详细推导与实现(七):决策树算法

REP是最简单的后剪枝方法之一,不过由于使用独立的验证集,如果数据量较少(数据要分为训练集、验证集、测试集三份),那么在使用验证集进行剪枝的时候,可能会在验证集出现的稀有实例,却在测试集中没有出现,那么就会存在过度剪枝的情况。 如果数据集较小,通常不考虑采用REP算法。尽管REP有这个缺点,但还是能够解决一定程度的过拟合问题。

Pesimistic-Error Pruning(PEP,悲观错误剪枝)

上文的 REP方法思想简单且易于使用,不过最大的问题在于它需要一个新的验证集来修正我们的决策树在, PEP方法中不需要新的验证集,并且 PEP是自上而下剪枝的。 PEP的剪枝是把一颗子树(具有多个叶子节点)的分类用一个叶子节点来替代,如下所示:

【机器学习】算法原理详细推导与实现(七):决策树算法

原来子树1可以分成(4,5,6,7)多个类,但是剪枝变成只能分成一个类(1)。同样的样本子集,如果用子树分类可以分成多个类,准确率肯定要高一些,而用单颗叶子节点来分的话只能分成一个类,准确肯定要低一些,所以(PEP)的误判率肯定是上升的。训练数据也带来错分误差偏向于训练集,为了解决这一问题,给每个子叶节点加入修正项(\frac{1}{2})。具有(T)个节点的树的错误率为:

[E(T) = \sum_{t \in T}\frac{e(t)+1/2}{N(t)} ]

去掉节点(K)个子叶节点之后T′个节点的树的错误率为:

[E(T’)=\sum_{t \in T, excep K}\frac{e(t)+1/2K}{N(t)} ]

其中(e(t))表示节点(t)下训练样本误判的数量,(N(t))表示节点(t)下训练样本的总数量。

PEP悲观错误剪枝剪枝法定义, 如果 E(剪枝后误判数均值)−E(剪枝前误判数均值)

所以,在剪枝前,其期望的误判数为:

[e(t)=N(t)∗E(t) ]

其误判的标准差为:

[std(t)=\sqrt{N(t)∗E(T)*(1-E(T))} ]

当剪枝后的误判数小于剪枝前的误判数一个标准差之后,就决定剪枝:

[e(t’)-e(t)

例如:存在如下一棵树:

【机器学习】算法原理详细推导与实现(七):决策树算法

对于节点T4而言,剪枝前后的计算过程如下:

已知(E(T7)=0 ;E(T8)=2;E(T9)=1;E(T10)=1;E(T4)=7;N(t)=20),所以,剪枝前的误判概率为:

[E(T)=\frac{(0+2+1+1)+4∗0.5}{20}=0.3 ]

所以:

[e(t)=20*0.3=6 ]

[std(t)=\sqrt{200.3(1-0.3)}=2.05 ]

在我们对T4进行剪枝后,即将T4直接作为叶节点,剪枝后的误判概率:

[E(T’)=\frac{7+0.5}{20}=0.375 ]

剪枝后的误判期望数为:

[e(t’)=20*0.375=7.5 ]

[7.5-2.05

Original: https://www.cnblogs.com/TTyb/p/12686248.html
Author: TTyb
Title: 【机器学习】算法原理详细推导与实现(七):决策树算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/7975/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总