决策树
决策树基础
适用决策树学习的经典目标问题
- 带有非数值特征的分类问题(主要是非连续)
- 离散特征
- 没有相似度概念(没有明确相似度概念)
- 特征无序
另一个例子: 水果
- 颜色:红色、绿色、黄色……
- 大小:小、中、大
- 形状:球形、细长
- 味道:甜、酸
样本的表示
- 属性的列表而非数值向量
- 例如享受运动的例子:
- 6值属性:天气、温度、湿度、风、水温、预测天气
- 某一天的天气实例:{晴、暖、一般、强、暖、不变}
- 例如水果的例子:
- 4值元组:颜色、大小、形状、味道
- 某个水果的实例: {红、球形、小、甜}
训练样本
训练样本就是在样本表达的基础上加上目标取值C(x), 如西瓜
决策树的概念
天生带有可解释性。
发展历史
- 1966,由Hunt首先提出
- 1970’s~1980’s
- CART 由Friedman, Breiman提出
- ID3 由 Quinlan 提出
- 自1990’s以来
- 对比研究、算法改进(Mingers, Dietterich, Quinlan, etc.)
- 最广泛使用的决策树算法:C4.5 由 Quinlan 在 1993 年提出
- C5.0
经典决策树算法
ID3算法
- 自顶向下,贪心搜索
- 递归算法
- 核心循环:
- A :下一步最佳 决策属性
- 将 A 作为当前节点决策属性
- 对属性A (vi)的每个值,创建与其对应的新的子节点
- 根据属性值将训练样本分配到各个节点
- 如果 训练样本被完美分类,则退出循环,否则继续下探分裂新的叶节点
训练样本被完美分类: 就是所有节点很好的分类了(比如所有叶子节点的标签都一样),看后面的 **ID3 Q2: 何时返回(停止分裂节点)?**内容
属性选择和节点混杂度(Impurity)
ID3 Q1: 哪个属性是最佳属性?
一共29个正例,35个负例,A1为最佳属性时,取True的有21个正例5个负例,A1取False的有8个正例30个负例;A2为最佳属性时,取True的有18个正例33个负例,A2取False的有11个正例2个负例
比如A1是湿度,湿度大还是正常,A 2是风,风是强还是正常
当前最佳属性节点选择
- 基本原则: 简洁
- 我们偏向于使用简洁的具有较少节点的树
比如西瓜和柠檬,依据简洁原则,选择左边的,最佳属性color
- 我们偏向于使用简洁的具有较少节点的树
- 基本原则: 简洁
- 我们偏向于使用简洁的具有较少节点的树
- 在每个节点N上,我们选择一个属性T,使得到达当前派生节点的数据尽可能“纯“(尽可能是同样分类的, 比如上面的颜色,左边就是西瓜,右边就是柠檬,如果是大小,右边既有西瓜,也有柠檬,就不太纯)
- 纯度(purity)- 混杂度(impurity)
如何衡量混杂度?
熵(Entropy)(广泛使用)
E n t r o p y ( N ) = − ∑ j P ( w j ) l o g 2 P ( w j ) Entropy(N) = -\sum\limits_j P(w_j)log_2P(w_j) Entropy(N)=−j∑P(wj)log2P(wj)
(比如节点是size, 那w1就是大,w2就是小)
- 定义: 0log0 = 0(可能某个节点是没取值,那概率P(wj)可能是0,因log原因,需要这样定义,否则无意义)
- 在信息理论中,熵度量了信息的纯度/复杂度,或者信息的不确定性
- 正态分布 - 具有最大的熵值
横坐标为取正的概率,如果正的概率为0,则熵为0,取负的概率为100%;正例的概率为0.5时,熵值最大
熵
如果只有两个,熵 = 正例的
−
P
(
w
j
)
l
o
g
2
P
(
w
j
)
-P(w_j)log_2P(w_j)
−P(wj)log2P(wj) + 负例的
−
P
(
w
j
)
l
o
g
2
P
(
w
j
)
-P(w_j)log_2P(w_j)
−P(wj)log2P(wj),
0.993已经很接近1, 说明熵很大
除了熵以外的其它混杂度度量
- Gini混杂度(Duda 倾向于使用Gini混杂度) 基尼
混杂度 i ( N ) = ∑ i ≠ j P ( w i ) P ( w j ) = 1 − ∑ j P 2 ( w j ) 混杂度i(N)=\sum\limits_{i \neq j} P(w_i)P(w_j)=1-\sum\limits_jP^2(w_j) 混杂度i(N)=i=j∑P(wi)P(wj)=1−j∑P2(wj) - 错分类混杂度(miss-classification)
混杂度 i ( N ) = 1 − max j P ( w j ) 混杂度i(N)=1-\max\limits_jP(w_j) 混杂度i(N)=1−jmaxP(wj)(所有中,j的概率最大)
混杂度(熵)
E
n
t
r
o
p
y
(
N
)
=
−
∑
j
P
(
w
j
)
l
o
g
2
P
(
w
j
)
Entropy(N) = -\sum\limits_j P(w_j)log_2P(w_j)
Entropy(N)=−j∑P(wj)log2P(wj)
下面坐标轴,依图例,蓝色纵坐标看右边,红色看左边
熵越来越大
混杂度(Gini)
i ( N ) = ∑ i ≠ j P ( w i ) P ( w j ) = 1 − ∑ j P 2 ( w j ) i(N)=\sum\limits_{i \neq j} P(w_i) P(w_j) = 1 - \sum\limits_jP^2(w_j) i(N)=i=j∑P(wi)P(wj)=1−j∑P2(wj)
最大 Gini 混杂度 在 1 − n ∗ ( 1 / n ) 2 = 1 − 1 / n 1-n*(1/n)^2=1-1/n 1−n∗(1/n)2=1−1/n 时取得
混杂度 (错分类)
i ( N ) = 1 − max j P ( w j ) i(N) = 1 - \max\limits_jP(w_j) i(N)=1−jmaxP(wj)
最大 Gini 混杂度 在
1
−
n
∗
(
1
/
n
)
2
=
1
−
1
/
n
1-n*(1/n)^2=1-1/n
1−n∗(1/n)2=1−1/n时取得 (也就是均匀分布P(Wi) = 1/n)
在有n类时,最大错分类混杂度 = 最大Gini混杂度
1
−
m
a
x
{
1
/
n
}
=
1
−
1
/
n
1-max\{1/n\}=1-1/n
1−max{1/n}=1−1/n
度量混杂度的变化 Δ I ( N ) ΔI(N) ΔI(N) — 信息增益(IG,Information Gain)
例如
- 由于对A的排序整理带来的熵的期望减少量
根据公式计算,得 E n t r o p y ( s a 1 = t ) = − 21 26 ∗ l o g 2 21 26 − 5 26 ∗ l o g 2 5 6 = 0.706 Entropy(s_{a1=t}) = -\frac{21}{26}*log_2{\frac{21}{26}}-\frac{5}{26}*log_2{\frac{5}{6}}=0.706 Entropy(sa1=t)=−2621∗log22621−265∗log265=0.706,即下面最左叶子节点的熵。
(21+5)/(29+35) = 26/64, 即上面最左叶子节点的重要性
因为 G a i n ( S , A 1 ) > G a i n ( S , A 2 ) Gain(S,A_1) > Gain(S, A_2) Gain(S,A1)>Gain(S,A2),所以选择A1节点(因为熵减少的更多,信息增益更大)
ID3 Q2: 何时返回(停止分裂节点)?
-
“如果训练样本被完美分类”
-
情形 1: 如果当前子集中所有数据 有完全相同的输出类别,那么终止
-
情形 2: 如果当前子集中所有数据 有完全相同的输入特征,那么终止
- (可能性1.有噪声,需要判断,如果很多,数据不好,需要做数据清洗,如果少,不影响,很少有很干净的数据,大多数的机器学习都需要有这样的鲁棒性2.很重要的Feature(特征)漏掉了)
-
可能的情形3: 如果 所有属性分裂的信
息增益为0, 那么终止 -------------这是个好想法么?决策树中不会采用这样的策略, 看下面的例子
函数y=a XOR b
a | b | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
信息增益:
属性 | 值 | 概率分布 | IG |
---|---|---|---|
a | 0 | 50% | 0 |
a | 1 | 50% | 0 |
b | 0 | 50% | 0 |
b | 1 | 50% | 0 |
- 根据提出的情形3,甚至在第一步就无法选择任何属性
如果不考虑情形3,随机一个属性就可以构建决策树,
因此在ID3中,只有两种情形会停止分裂(即完美分类),
- 相同的输出类别
- 相同的输入特征值
ID3举例
- 训练样本
- 选择特征 基于湿度、天气、温度、云这几个属性就可以计算出IG如下: G a i n ( S , H u m i d i t y ) = 0.940 - [ ( 7 / 14 ) ∗ 0.985 + ( 7 / 14 ) ∗ 0.592 ] = 0.151 Gain(S,Humidity) =0.940-[(7/14)*0.985 + (7/14)*0.592] =0.151 Gain(S,Humidity)=0.940-[(7/14)∗0.985+(7/14)∗0.592]=0.151
G a i n ( S , O u t l o o k ) = 0.246 Gain(S,Outlook)=0.246 Gain(S,Outlook)=0.246
G a i n ( S , W i n d ) = 0.048 Gain(S,Wind)=0.048 Gain(S,Wind)=0.048
G a i n ( S , T e m p e r a t u r e ) = 0.029 Gain(S,Temperature)=0.029 Gain(S,Temperature)=0.029
Outlook的IG最大,因此讲Outlook作为当前节点的属性
ID3算法搜索的假设空间
-
假设空间是完备的
- 目标函数一定在假设空间里
- 既可以处理属性的OR,也可以处理属性的AND,因此是完备的,任何一个逻辑表达,在ID3的树里都可以表达
-
输出单个假设
- 不超过20个问题(根据经验) ,即影响因素(属性)不要超过20个,
- 否则非常复杂, 也会产生过拟合(超过20个决策性属性)
-
没有回溯
- 局部最优,不是全局最优
-
在每一步中使用子集的所有数据(比如之前的梯度下降,用一条数据就调整,和这里不一样)
- 数据驱动的搜索选择
- 对噪声数据有鲁棒性
ID3中的归纳偏置 (Inductive Bias)
- 假设空间 H 是作用在样本集合 X 上的
- 没有对假设空间作限制, 假设空间不偏
- 偏向于在靠近根节点处的属性具有更大信息增益的树
- 尝试找到最短的树
- 该算法的偏置在于对某些假设具有一些偏好(preference, 搜索偏置), 而不是
对假设空间 H 做限制(restriction描述偏置).
搜索偏置原理:
奥卡姆剃刀(Occam’s Razor)*:偏向于符合数据的最短的假设
Domingos, The role of Occam’s Razor in knowledge discovery. Journal of Data Mining and Knowledge Discovery, 3(4), 1999.
一般认为:一般无偏的学习算法是无用的
CART (分类和回归树)
Classification and Regression Tree
- 一个通用的框架:
- 根据训练数据构建一棵决策树
- 决策树会逐渐把训练集合分成越来越小的子集
- 当子集纯净后不再分裂
- 或者接受一个不完美的决策
许多决策树算法都在这个框架下,包括ID3、C4.5等等
过拟合问题(over-fitting)
c错误率为0,过于拟合,泛化()能力变弱
- 我们说假设
h
∈
H
h ∈H
h∈H 对训练集过拟合,如果存在另一个假设
h
’
∈
H
h’ ∈H
h’∈H满足:
e r r t r a i n ( h ) < e r r t r a i n ( h ′ ) err_{train}(h) < err_{train}(h^{'}) errtrain(h)<errtrain(h′) AND e r r t e s t ( h ) > e r r t e s t ( h ′ ) err_{test}(h) > err_{test}(h^{'}) errtest(h)>errtest(h′), 那h就是过拟合了
如果没有测试集,那就用验证集做衡量
决策树过拟合的一个极端例子:
- 每个叶节点都对应单个训练样本 —— 每个训练样本都被完美地分类
- 整个树相当于仅仅是一个数据查表算法的简单实现
- 决策树学习中的过拟合
上图中22以后,训练集精度还在增加,但是测试集精度已经在下降了,说明过拟合了
如何避免过拟合
- 对决策树来说有两种方法避免过拟合
- I 当数据的分裂在统计意义上并不显著时,就停止增长:预剪枝(pre-pruning) (显著性统计说明参见机器学习实验方法与原则)
- II 构建一棵完全树,然后做后剪枝(post-pruning)
类型 I.
对于第一种方法,很难估计树的大小
预剪枝
何时停止分裂(1) :基于样本数
- 通常 一个节点不再继续分裂,当:
- 到达一个节点的训练样本数小于训练集合的一个特定比例 (例如 5%)
- 无论混杂度或错误率是多少
- 原因:基于过少数据样本的决定会带来较大误差(有时可以说很大方差)和泛化错误, 类似盲人摸🐘, 摸到腿以为是大柱子…;再比如一堆数据,大部分数据几乎在一条直线上,但是刚好碰到少量局部数据,组成一团,和大部分数据不一致,再分会导致很大误差,
何时停止分裂(2):基于信息增益的阈值
设定一个较小的阈值,如果满足下述条件则停止分裂: Δ i ( s ) ≤ β \Delta i(s) \leq \beta Δi(s)≤β
-
优点:
- 用到了所有训练数据
- 叶节点可能在树中的任何一层
-
缺点: 很难设定一个好的阈值
- (可以通过前面介绍的方法,在完整训练集上分出一部分作为验证集,通过训练集训练得出参数,通过验证集调整参数,评估出最好的参数)
和前面的例子x = a xor b不同, 信息增益为0还在分裂,是因为当时在讨论停止条件,而且不分裂就够不成一棵树;但是现在介绍的基于信息增益的阈值停止分裂,是已经构成一棵足够充分的树,再分裂就可能会过拟合,情况不同。
避免过拟合: 类型 II
对于方法 II:
- 如何选择 “最佳” 的树?
- 在另外的验证集合上测试效果
-
M
D
L
(
M
i
n
i
m
i
z
e
D
e
s
c
r
i
p
t
i
o
n
L
e
n
g
t
h
最小描述长度
)
MDL (Minimize Description Length 最小描述长度)
MDL(MinimizeDescriptionLength最小描述长度):
m i n i m i z e ( s i z e ( t r e e ) + s i z e ( m i s c l a s s i f i c a t i o n s ( t r e e ) ) ) minimize ( size(tree) + size(misclassifications(tree)) ) minimize(size(tree)+size(misclassifications(tree)))
missclassification: 错误率: 如果只追求错误率最小,导致树很长,细节点越多
size(tree):如果只追求树的大小,会导致错误率比较大
后剪枝 (1): 错误降低剪枝(error reduce pruning)
- 把数据集分为训练集和验证集
- 验证集:
- 已知标签
- 测试效果,用于验证性能和错误率
- 在该集合上不做模型更新!
- 验证集:
- 剪枝直到再剪就会损害性能(hurt performance):
- 在验证集上测试剪去每个可能节点(和以其为根的子树)的影响
- (在验证集上看性能会不会提升,因为在训练集上找不到这棵树;每次只剪一个,形成新树,不断循环,直到性能不再提高)
- 贪心地去掉某个可以提升验证集准确率的节点(剪掉哪个节点提升准确率越多,就剪哪个)
- 在验证集上测试剪去每个可能节点(和以其为根的子树)的影响
剪掉节点后,如何定义新的叶节点的标签?
剪枝后新的叶节点的标签赋值策略
- 第一种:赋值成最常见的类别
- 第二种:给这个节点多类别的标签
- 每个类别有一个支持度 (根据训练集中每种标签的数目)
- 测试时: 依据概率选择某个类别或选择多个标签
- 第三种:如果是一个回归树 (数值标签),可以做平均或加权平均
- ……
错误降低剪枝的效果
验证集是从后往前剪,即下面的箭头方向
验证集是用来减弱过拟合问题,不能做到百分百消除过拟合,因为
验证集
≠
测试集
验证集\neq 测试集
验证集=测试集
后剪枝 (2): 规则后剪枝(rule-post pruning)
- 把树转换成等价的由规则构成的集合(决策树就是由规则构成,可以看一开始介绍)
- e.g.
if (outlook=sunny) and (humidity=high) then playTennis = no
- e.g.
- 对每条规则进行剪枝,去除那些后能够提升该规则准确率(验证集上的准确率)的规则前件(规则条件)
- i.e.
(outlook=sunny), (humidity=high) ,(outlook=sunny) and (humidity=high)
- i.e.
- 将规则排序成一个序列 (根据规则的(验证集上的)准确率从高往低排序)
- 用该序列中的最终规则对样本进行分类(依次查看是否满足规则序列)
(注:在规则被剪枝后,它可能不再能恢复成一棵树)
一种被广泛使用的方法,例如C4.5
为什么在剪枝前将决策树转化为规则?
- 独立于上下文
- 否则,如果子树被剪枝,有两个选择:
- 完全删除该节点
- 保留它
- 否则,如果子树被剪枝,有两个选择:
- 不区分根节点和叶节点
- 提升可读性
扩展: 现实场景中的决策树学习•问题 & 改进
1. 连续属性值
- 建立一些离散属性值
- 可选的策略:
- I.选择相邻但有不同决策的值的中间值
x
S
=
(
x
l
+
x
u
)
/
2
x_S=(x_l+x_u)/2
xS=(xl+xu)/2
(Fayyad 在1991年证明了满足这样条件的阈值可以信息增益IG最大化) - II. 考虑概率 x S = ( 1 − P ) x l + P x u x_S = (1-P)x_l+Px_u xS=(1−P)xl+Pxu(这个是哪边概率大,就偏向那边)
- I.选择相邻但有不同决策的值的中间值
x
S
=
(
x
l
+
x
u
)
/
2
x_S=(x_l+x_u)/2
xS=(xl+xu)/2
(补充: 机器学习中还常用这样的方法:比如上面的温度, 将温度数据数量在二位坐标系中绘出,横轴温度,纵轴数据量, 将曲线和x之间的面切成小长方形(类似定积分求面积的推导),面积一样, 这样每个区间数据量大小一样;还有其它的)
2. 具有过多取值的属性
问题:
- 偏差: 如果属性有很多值,根据信息增益IG,会优先被选择
- e.g. 享受运动的例子中,将一年里的每一天作为属性,那结果一定会优先这个特征,但它就像查表一样,过拟合
- 一个可能的解决方法: 用 GainRatio(增益比) 来替代
(IG 和Entropy有关, 决策树分的越散(即分支越多),Entropy越小,到了决策树的细枝末节数据量就越少,越有可能确定;比如要二个数据一致比要60个数据一致更容易一些;Entropy越小,熵减少的越多,IG越大;所以IG有天然偏向性,偏向值越多的属性)
增益比大的才考虑,增益比小的就不考虑。
SplitInfromation是把集合分了多少份,集合的熵,而不是分了后总的熵的期望。(要再考虑下)
3. 未知属性值
数据规模不大, 数据得到不易。
如果那个不知属性值取neg,则有2正例4个负例;取pos,则有4正例,0负例
解决方法如果3中方法。
4. 有代价的属性
• 有时有的属性不容易获得(收集该属性值的代价太大)
- Tan & Schlimmer(1990) G a i n 2 ( S , A ) C o s t ( A ) \frac{Gain^2(S,A)}{Cost(A)} Cost(A)Gain2(S,A)
- Nunez(1988)
2
G
a
i
n
(
S
,
A
)
−
1
(
C
o
s
t
(
A
)
+
1
)
w
\frac{2^{Gain(S,A)}-1}{(Cost(A)+1)^w}
(Cost(A)+1)w2Gain(S,A)−1
- w:[0,1] 代价的重要性
其他信息
- 可能是最简单和频繁使用的算法
- 易于理解
- 易于实现
- 易于使用
- 计算开销小
- 决策森林:
- 由C4.5产生的许多决策树(用到集成学习)
- 更新的算法:C5.0 http://www.rulequest.com/see5-info.html
- Ross Quinlan的主页: http://www.rulequest.com/Personal/
小结
-
介绍及基本概念
- 以ID3算法为例
- 算法描述
- 选择特征
- 终止条件
- ID3算法的归纳偏置
- 过拟合问题
- 剪枝
- 预剪枝:基于样本数;基于信息增益阈值
- 后剪枝: 错误降低剪枝;规则后剪枝
在实际应用中,一般预剪枝更快,而后剪枝得到的树准确率更高
- 以ID3算法为例
-
扩展
- 实际场景中的决策树学习
- 连续属性值的离散化
- 具有过多取值的属性处理
- 未知(缺失)属性值的处理
- 有代价的属性
- 基本想法来源于人类做决策的过程
- 简单、容易理解:“如果…就…”
- 对噪声数据有鲁棒性
- 实际场景中的决策树学习
-
应用
- 在研究和应用中广泛使用
- 医疗诊断(临床症状 → \rightarrow → 疾病)
- 信用分析 (个人信息 → \rightarrow → 有价值客户?)
- 日程规划
- ……
- 通常在部署更复杂的算法之前,常把决策树作为一个基准方法
(baseline)(如果复杂算法在统计显著性不能好于决策树,那决策树就够用了) - 决策树方法常被用作复杂学习框架中的基础部分之一
- 在研究和应用中广泛使用
归纳学习假设
- 大部分的学习是从已知的样本中获得一般化的概念
- 归纳学习算法能够在最大程度上保证输出的假设能够在训练数据上拟合目标概念
- 注意: 过拟合问题
- 归纳学习假设:
Any hypothesis found to approximate the target function well over a sufficiently large set of training examples will also approximate the target function well over unobserved examples.
(任一假设若在足够大的训练样例集中很好地逼近目标函数,它也能在未见实例中很好地逼近目标函数)
这里推荐看下机器学习PAC理论