决策树:构建流程
准备工作:明确自变量和因变量,确定信息度量的方式,确定终止条件
选择特征:得到当前待处理子集,计算所有特征信息度量,得到当前最佳分类特征
创建分支:根据选中特征将当前记录分成不同分支,分支个数取决于算法
是否终止:判断是否满足终止条件,满足退出循环,否则继续递归调用
生成结果:判断是否需要剪枝,需要则适当修剪,否则为最终结果
说明性的栗子:
决策树
决策树(decision tree)是一种基本的分类与回归方法。
可以这样理解,分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。
结点有两种类型:内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性,叶结点表示一个类。如下图所示的决策树,理解就好。
可以把决策树看成一个if-then规则的集合,将决策树转换成if-then规则的过程是这样的:由决策树的根结点(root node)到叶结点(leaf node)的每一条路径构建一条规则;路径上内部结点的特征对应着规则的条件,而叶结点的类对应着规则的结论。决策树的路径或其对应的if-then规则集合具有一个重要的性质:互斥并且完备。这就是说,每一个实例都被一条路径或一条规则所覆盖,而且只被一条路径或一条规则所覆盖。这里所覆盖是指实例的特征与路径上的特征一致或实例满足规则的条件。
接下来我们就通过一个栗子来详细说明决策树的构建流程。已知电脑购买记录,对购买者进行建模,预测新用户是否购买电脑。
准备工作
电脑购买记录数据如下:
观察数据,明确自变量(年龄,收入层次,是否单身,信用等级)和因变量(是否购买电脑)
- 自变量
- 因变量
明确信息度量方式:熵 — 信息增益(ID3)
- 熵
- 基尼系数
明确分支终止条件:纯度
- 纯度
- 记录条数:当前待处理的记录条数是否小于一个阈值
- 循环次数
信息熵:是信息论里面的概念,由香农提出,是用来描述混乱程度的度量,它的取值范围0~1,值越大,说明越混乱。熵定义为信息的期望值:公式如下:
那么假如样本数据表中的数据为训练数据集D,则训练数据集D的经验熵为H(D),|D|表示其样本容量,及样本个数。设有K个类Ck, = 1,2,3,...,K,|Ck|为属于类Ck的样本个数,因此信息熵公式就可以写为 :
举个栗子:有一堆苹果和梨共 100 个,随机拿出一个,拿出的是哪一种水果?
- 50个苹果 + 50个梨子
- 0个苹果+100个梨子
- 80个苹果+20 个梨子
第一种情况的信息熵为1,说明混乱程度最大,也就是想要提前预测拿出的水果是啥的难度最大,第二中全是梨,说明混乱程度最小,拿出一个水果则一定是梨子,而第三种情况的信息熵为0.722,混乱程度不算最大,但是想要预测是苹果还是梨子还是有一定的难度。熵,就是描述当时现象,事物的混乱程度
信息增益和特征选择
信息增益就是指从一个状态到另一个状态后,信息的确定性的增加,信息增益越大,那么对信息确定性的贡献也就越大。比如我们收集到了几种植物果实的颜色和气味,根据这两个信息确定是否无水果?
不考虑任何特征,直接去估计结果:
也就是说直接来猜测的话,出错的概率是最大的。然后考虑以颜色为参考信息,判断是否为水果:
说明以颜色作为参考信息,混乱程度下降了,确定性增加了。
那我们考虑以味道为参考信息,判断是否为水果:
那么只根据味道来判断,甜就是水果,不甜就不是水果,可以说完全确定,不存在混乱了。
所以,信息增益:
- 颜色:1- 0.689 = 0.311
- 味道:1-0 = 1
味道的信息增益更大,所以基于这个数据集,就会优先考虑味道这个特征所谓划分依据。
构建决策树
回到之前的电脑购买记录数据集:
编写产生数据矩阵的函数 createDataSet:
第一级特征选择
编写计算整体熵的函数calcAllInfoEnt:
计算整体的熵:购买9例,未购买:5例
编写计算条件特征熵和信息增益的函数chooseBestFeatureToSplit和划分数据集的函数
计算年龄的熵:
计算收入的熵:
计算单身的熵:
计算信用的熵:
计算各个特征的信息增益:
所以,选择年龄作为当前最佳特征(索引0)。
按照取值产生分支
年龄作为分支条件,所以在子路径中就没有年龄这个特征了:
首先来看青少年这个分支,该分支是否满足终止条件(小于最小记录数,或者纯度为1,或者循环次数)
计算当前分支信息增益后,选择是否单身作为当前最佳特征:
因此,下一级以是否单身作为分支条件,子已经满足终止条件:
其他分支的二级特征选择方法相同。不再赘述。
生成构建的决策树
编写生成决策树的函数:
输出模型如下(字典表示 ):
这个就是我们构建的决策树模型:
- if 青少年 && 单身 then 买;
- if 青少年 && 不单身 then 不买;
- if 中年 then 买;
- if 老年&& 信用一般 then 买;
- if 老年&& 信用良好 then 不买;
总结
以上介绍的算法是ID3 (Iterative Dichotomiser 3 ,迭代树三代),是由Ross Quinlan提出的:
核心是信息熵,根据信息增益来决定输的节点。
存在以下问题:
- 信息度量不合理:倾向于选择取值多的字段
- 输入类型单一:离散型
- 不作剪枝:容易发生过拟合
C4.5(J.Ross Quinlan在ID3的基础上提出的):和 ID 3相比的改进:
- 用 信息增益率代替信息增益
- 能对连续属性进行离散化,对不完整数据进行处理
- 进行剪枝
C50:相比C4.5的改进:
- 使用了boosting
- 前修剪、后修剪
CART(Classification and Regression Tree),是由下面三个大牛一起提出的
- 核心是基尼系数(Gini)
- 分类是二叉树
- 支持连续值
- 后剪枝进行修剪
- 支持回归,可以预测连续值
ID3,C4.5,CART三种决策树算法的对比: