引入
所谓决策树,就是根据树结构来进行决策。
举个例子,小明的妈妈去上海人民公园相亲角为儿子物色相亲对象,广场上数百名适婚年龄男女的家长自发来到这里,手里拿着自家孩子的基本资料。小明妈为了选到一个理想的儿媳妇,在看到其他人手中的基本资料后,根据自己内心中各项情况的重要程度(从高到低分别是性别,学历,颜值,房子),依次进行判断:
性别是否是女孩子?
如果不是,就pass;
如果是,那学历是否是本科以上?
如果不是,那是否颜值过关且家中有房?
如果不是,则pass;
如果是,则是理想相亲对象;
如果是,那颜值是否过关?
如果不是,那家中是否有房?
如果不是,则pass;
如果是,则是理想相亲对象;
如果是,则是理想相亲对象;
就这样看过基本资料满意后,小明妈才会和对方家长交换资料…
由此我们可以得到一颗较为简单的决策树,对于每一个候选人,其标签是"Yes"和"No",分别代表小明妈是否满意;属性有四个,“性别”“学历”“颜值”“房子”,即:
我们可以看出,实现这棵树的关键是小明妈心中的“重要程度”,有了这个我们才得以根据重要性依次筛选。而在生成一颗决策树时,我们从根结点出发,需要在所有属性中选择一个最重要的属性,之后来到下一个结点,我们要在剩余的所有属性中选择一个最重要的,以此类推。
也就是说,在每个结点就是要找到当前最重要的一个属性来进行划分,并且希望以此划分完的若干个分枝的样本尽量属于同一个类标签,称这种特性叫做结点的纯度.
最优划分属性
那么如何来判断每个属性的重要程度,或者说纯度呢?
采用不同的指标就会生成不同的算法,此处列举三个:
1.信息增益
人们提出了“信息熵”来度量样本集合的纯度。假设样本集合
中,共有
类样本,第i种样本所占比例为
,则信息熵
为:
负号用来保证求和前每一项都是非负数,信息熵越小,纯度越高。
对于上述数据集
,其中的某一个属性
,假设有
个取值,则按该属性进行划分后,将形成
个结点,我们可以计算
个新结点的信息熵
,并根据子结点样本数的比重进行加权求和,与
的信息熵进行比较,来确定使用属性
划分数据集
的信息增益:
属性的信息增益越大就意味着以用该属性进行划分所带来的纯度增加越大,在每个结点选择信息增益最大的属性进行划分而形成的算法是ID3算法.
2.增益率
增益率定义为:
其中
称为属性
的“固有值”.不难发现,属性
取值数目越多(即M越大),则作为
的值通常会越大. 因此,当有些属性取值过多时,可能会导致ID3算法误选取值较多的属性,此时使用增益率作为指标是一个很好的选择,这叫做C4.5决策树.
3.基尼指数
基尼系数定义如下:
直观来说,基尼系数反映了从数据集 D 中随机抽取两个样本, 其类别标记一致的概率. 因此, Gini(D) 越小, 则数据集 D 的纯度越高.
采用与式(4.2)相同的符号表示, 属性
的基尼指数定义为
以基尼指数作为划分依据的决策树算法称为CART决策树.
剪枝
决策树要不断进行分枝,直到每个结点只包括同一个标签的样本,某些较为特异的样本可能需要多分枝出几个结点,这就会导致过拟合问题。
为解决决策树中的过拟合问题,我们就要把一些不必要的“枝叶”剪掉,只保留具有代表性的,我们把这一过程形象地叫做“剪枝”.
剪枝包括预剪枝和后剪枝两种,顾名思义,前者是在生成决策树前,后者是在生成决策树后进行剪枝。
各种算法流程的绝大部分操作都是为了提升学习器的泛化能力,剪枝也不例外。所以我们对某一个结点是否要进行剪枝操作的依据就是,剪枝是否可以增强学习器的泛化能力。
- 预剪枝
预剪枝实际是在决策树生成的过程中判断是否需要剪枝,每当根据信息增益等纯度指标选取了一个划分属性后,计算学习器在根据该属性划分前后测试集上判断的准确率,如果假设按该属性划分精确度有提升则划分,否则则进行剪枝、不再根据该属性划分,并将类标记为该结点上样例最多的类。 - 后剪枝
后剪枝指的是按照流程生成决策树后,自下而上逐一判断每个结点的划分是否可以提高在测试集上的准确率,是的话就保留,否则同样剪枝、不再根据该属性划分,并将类标记为该结点上样例最多的类。
特殊属性处理
- 连续型
对于一些连续型属性,我们通常选择一个分界点将属性分为大于临界值与小于临界值两种,将其转化成离散型属性。
临界值一般选取样本集中任意两个相邻取值的中点作为候选,在所有中点中选择信息增益(或其他指标)最大的一个最为临界值。
- 缺失值
对于有缺失值的样本集,为尽可能保留样本信息,我们不会删除有缺失值的样本。在考虑每个属性时,只考虑有该属性值的样本,而忽略缺失该属性值的样本;在确定划分后,将缺失该属性值的所有样本同时划入所有自结点中。
算法流程
决策树的基本算法流程为:
- 将数据集划分为训练集 与测试集 ,得到属性集 ;
- 判断
中样本是否 均为同一类别 或 所有属性取值相同:
如果是,则将根结点直接标记为叶结点,类别标记为 中样本数最多的类,程序结束;
如果不是,则继续生成树; - 选择信息增益或其他最优划分属性指标,对于 中所有属性计算指标值,选择最优的一个作为划分属性 .
- 对于属性
的每一个取值
,生成一个分支,样本子集为
[如果要进行预剪枝,则:
先暂时将各个分枝结点标记为样本子集 中最多的类标签,如果为空,则以 中最多的类标签代替.
再根据对于分枝前后在测试集的准确率判断是否要剪枝:
如果分枝后准确率提高,则继续进行;
否则进行剪枝,保留暂时的标记标签] - 判断
是否为空:
如果为空,则类别标记为 中最多的类标签,程序结束;
否则以 为新的训练集,A except 为新的属性集回到步骤1 - 最终得到决策树.
[若进行后剪枝,则:
从最后一层的结点依次根据对于分枝前后在测试集的准确率判断是否要剪枝:
如果分枝后准确率提高,则保留该分枝;
否则进行剪枝,用叶结点代替子树]