一棵决策树包含 一个根节点,若干内部节点,若干叶子节点。可以理解为,每一个节点里面都存储着一定量的数据集,根节点最多,包含数据的全集,一个节点的数据集等于其所有子节点的集合。与此同时,根节点和内部节点都对应一个分类属性(分类的依据,就是 特征)。根节点到某一个子节点的那条路径,对应了一个判定测试序列。
决策树的思想就是简单直观的“分而治之” 的策略。
基本流程图 见书P74页
代码的核心为 如何从A(特征集,属性集)中选择最优划分属性a
2.划分选择
我们希望决策树节点分支后的分支节点所包含的样本尽可能属于同一类(即样本的标签尽可能相同),即节点的纯度应该越来越纯。反应节点纯度用以下三种情况表示。
* 信息增益–ID3
原理:我们用信息熵
我们希望混乱程度减少尽可能多,则下一个节点的纯度就大。
我们要对某一个节点进行分支,这个节点有n个特征(属性),但是只能选一个作为“判别条件”,那么现在的就是通过比较每一个属性对应的信息增益的大小,从n个属性选一个出来,谁的Gain(D,a)大,就选谁。即
每一个属性的样本为
如果每一个属性的信息增益相同,任意选一个属性即可。
- 增益率–C4.5
信息增益准则对可取值数目较多的属性有所偏好。也就是说,一般的,属性的可取值数目越多,信息增益就越大,这样其实并不好。那我们就让信息增益除以一个数,这个数在属性的可取值多的情况下,取值也很大,这样就抵消了一部分因为属性的可取值的数目带来的影响。这个数就是,IV(a)=−∑v=1n|Dv||D|log2|Dv||D|。其实就是可取数的信息量,n越大,信息也就越大。
即最终比较每个属性的公式为Gain_ratio(D,a)=Gain(D,a)IV(a)
但是,由于IV(a)变化的比Gain(D,a)快
所以信息增益率对可取值数目较少的属性有所偏好。 - 基尼指数–CRAT
定义基尼指数为Gini_index(D,a)=∑v=1n|Dv||D|Gini(Dv)
基尼指数越小越好。即a∗=argminaGini_index(D,a)
公式Gini(D)=1−∑k=1|y|p2k
用于反映该节点的纯度。Gini(D)越小,纯度越高。
该公式表明表示从数据集中任选两个得到样本的标签不同的概率。
∑k=1|y|p2k表示从数据集中任选两个得到样本的标签相同的概率。
3.剪枝操作—–用于防止过拟合
由于决策树的产生全是用训练集做的,不断循环分支,所以train error 会很小,但是可能因为分枝过度,而过拟合。剪枝可以解决这个问题。
* 预剪枝
一边分枝,一边用测试集观测其泛化能力。就是在每次对该节点分支之前,用测试集去计算分支前的测试集精度和分支后的测试集精度,如果分枝能够提高测试集精度,就继续分枝。
比如有一个节点node,如果不对其进行分枝,那么该节点就是叶子节点,取其标签最多的标签作为该节点的标签,再用测试集去验证,计算该标签对测试集的预测的准确度p1。如果对其分枝,计算子节点对测试集的预测准确度p2。再比较p1,p2大小即可。
缺点:可能会造成欠拟合的情况。因为有些节点现在划分可能不会提高泛化性能,但是在此基础上再进行划分,泛化性能又会提高。
后剪枝
先生成完整的决策树,再从底向上对每一个节点用测试集检验,如果将该节点最为叶子节点的话,泛化性能是否会提高,能提高就将该内部节点最为叶子节点。泛化性能用决策树对测试集的预测准确度来衡量。优点:因为是把整个决策树先生成出来,再对每一个节点进行考验,所以欠拟合的风险小。
缺点:正因如此,计算量非常大。