上个星期去崇州参加比赛,回来老师已经讲到了「分类」,那一节课学了决策树,现在继续课后巩固一下。
什么是决策树
概念
决策树(decision tree)是一种类似于流程图的树结构(可以是二叉树也可以不是),其中,每个内部节点(非叶子结点)表示在一个属性上的测试,每个分枝代表该测试的一个输出,而每个叶子结点存放一个类标号。书的最顶层节点是根节点。
决策树是一种基本的分类与回归方法,它可以看作if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。
更好的理解
以一个例子更好的理解决策树:
上面这个例子,就是用来决策顾客是否可能购买计算机。每个内部节点表示在一个属性上的测试(比如是否是学生),而每个叶子结点存放一个类标号也就是决策结果(比如 buys_computer = no/yes),箭头表示一个判断条件在不同情况下的决策路程。
决策树可以运用在诸多领域。
决策树学习算法构成
主要构成有三个部分:
特征选择
决策树生成
决策树的剪枝
决策树的路径具有一个重要的性质:互斥且完备,即每一个样本均被且只能被一条路径所覆盖。
特征选择
如果利用一个特征进行分类的结果与随机分类的结果无异,则可以认为这个特征是不具备分类能力的。把这样的特征去掉,对决策树的分类精度应该影响不大。
那如何判断一个特征的分类能力呢?比如说在上面那个图中,为什么将age属性作为第一个分类,而不是student或者credit_rating呢?
这就需要「信息增益」这个概念,需要一些准备知识。
熵(entropy)
熵表示随机变量的不确定性,熵值越大表示随机变量含有的信息越少,变量的不确定性越大。 随机变量 X 的熵的表达式为:
P(X = xi) = pi,i = 1, 2, …, n,是 X 的概率分布。
联合熵
上面那个是一个变量 X 的熵,多个变量的联合熵,比如两个变量 X 和 Y 的联合熵表达式为:
联合熵是一集变量之间不确定性的衡量手段。
条件熵
随机变量X给定的条件下,随机变量Y的条件熵H(Y|X)定义为:
信息增益(information gain):
信息增益是指:得知特征 X 的信息而使得类 Y 的信息的不确定性减少的程度。
特征 A 对训练集 D 的信息增益记为g(D, A),定义为集合 D 的经验熵H(D),与特征 A 给定条件下 D 的熵H(D|A)之差,即:
根据信息增益准则进行特征选择的方法是:对训练数据集D,计算其每个特征的信息增益,并比它们的大小,从而选择信息增益最大的特征。
信息增益比(information gain ratio)
以信息增益作为特征选择准则,会存在偏向于选择取值较多的特征的问题。可以采用信息增益比对这一问题进行校正。
特征 A 对训练集 D 的信息增益比定义为其信息增益与训练集 D 关于特征 A 的值的熵之比,即
其中,
决策树的生成
决策树的生成算法有很多变形,这里介绍几种经典的实现算法:ID3 算法,C4.5 算法以及 CART 算法。这些算法的主要区别在于分类结点上特征选择的选取标准不同。下面详细了解一下算法及其具体实现过程。
具体例题可参考《数据挖掘概念与技术》一书。
数据
数据来源于《数据挖掘概念与技术》书中。以下实现均基于这个数据。
RID
age
income
student
credit_rating
Class: buys_computer
1
youth
high
no
fair
no
2
youth
high
no
excellent
no
3
middle_aged
high
no
fair
yes
4
senior
medium
no
fair
yes
5
senior
low
yes
fair
yes
6
senior
low
yes
excellent
no
7
middle_aged
low
yes
excellent
yes
8
youth
medium
no
fair
no
9
youth
low
yes
fair
yes
10
senior
medium
yes
fair
yes
11
youth
medium
yes
excellent
yes
12
middle_aged
medium
no
excellent
yes
13
middle_aged
high
yes
fair
yes
14
senior
medium
no
excellent
no
ID3 算法及实现
ID3 算法的核心是在决策树各个结点上应用信息增益准则进行特征选择。
从根节点开始,对结点计算所有可能特征的信息增益,选择信息增益最大的特征作为结点的特征,并由该特征的不同取值构建子节点;
对子节点递归地调用以上方法,构建决策树;
直到所有特征的信息增益均很小或者没有特征可选时为止。
Python 实现
# 待更
C4.5 算法及实现
由 ID3 算法演化而来。
C4.5 算法与 ID3 算法的区别主要在于它在生产决策树的过程中,使用信息增益比来进行特征选择。
Python 实现
# 待更
CART 算法及实现
由 ID3 算法演化而来。
CART 算法假设决策树是一颗二叉树,它通过递归地二分每一个特征,将特征区间划分为有限个单元,并在这些但愿上确定预测的概率分布。
CART 算法中,对于回归,采用的是「平方误差最小化」准则;对于分类,采用的是「基尼指数最小化」准则。
平方误差最小化
假设已将输入空间划分为 M 个单元,并且在每个单元 R1, R2, …, Rm,并且在每个 单元 Rm 上有一个固定的输出值 Cm ,于是回归树可以表示为:
当输入空间的划分确定时,可以用平方误差
来表示回归树对于训练数据的预测误差。
基尼指数
这里讲的是分类,所以先重点了解基尼指数。
基尼指数是度量数据分区和训练元组集 D 的不纯度。
假设有 m 个类别,样本点属于第 i 类的概率为 Pi,则概率分布的基尼指数定义为:
对每个属性,需要考虑每种可能的二元化分。对于离散值属性,选择该属性产生最小基尼指数的子集作为它的分裂子集。而对于连续值属性,必须考虑每个可能的分裂点。
对于样本 D,如果根据特征 A 的某个值 a,把 D 分成 D1 和 D2 两部分,则在特征 A的条件下,D 的基尼系数表达式为:
对于离散或连续值属性 A 的二元划分导致的不纯度降低为:
选择产生最小基尼指数的属性作为分裂属性。
Python 实现
# 待更
决策树的剪枝
# 待更