决策树学习
- 决策树
-
- 决策树基础
- 经典决策树算法
-
- ID3算法
-
- 属性选择和节点混杂度(Impurity)
-
- [ID3 Q1: 哪个属性是最佳属性?](#ID3 Q1: 哪个属性是最佳属性?)
- 当前最佳属性节点选择
- 熵(Entropy)(广泛使用)
- 熵
- 混杂度(熵)
- 混杂度(Gini)
- 混杂度 (错分类)
- [度量混杂度的变化 Δ I ( N ) ΔI(N) ΔI(N) --- 信息增益(IG,Information Gain)](#度量混杂度的变化 Δ I ( N ) ΔI(N) ΔI(N) — 信息增益(IG,Information Gain))
- [ID3 Q2: 何时返回(停止分裂节点)?](#ID3 Q2: 何时返回(停止分裂节点)?)
- ID3举例
- ID3算法搜索的假设空间
-
- [ID3中的归纳偏置 (Inductive Bias)](#ID3中的归纳偏置 (Inductive Bias))
- CART (分类和回归树)
- 过拟合问题(over-fitting)
- 如何避免过拟合
-
-
- [类型 I.](#类型 I.)
-
- [何时停止分裂(1) :基于样本数](#何时停止分裂(1) :基于样本数)
- 何时停止分裂(2):基于信息增益的阈值
- [避免过拟合: 类型 II](#避免过拟合: 类型 II)
-
- [后剪枝 (1): 错误降低剪枝](#后剪枝 (1): 错误降低剪枝)
- [后剪枝 (2): 规则后剪枝](#后剪枝 (2): 规则后剪枝)
-
- [扩展: 现实场景中的决策树学习•问题 & 改进](#扩展: 现实场景中的决策树学习•问题 & 改进)
-
- [1. 连续属性值](#1. 连续属性值)
- [2. 具有过多取值的属性](#2. 具有过多取值的属性)
- [3. 未知属性值](#3. 未知属性值)
- [4. 有代价的属性](#4. 有代价的属性)
- 其他信息
- 小结
- 归纳学习假设
决策树
决策树基础
适用决策树学习的经典目标问题
- 带有非数值特征的分类问题(主要是非连续)
- 离散特征
- 没有相似度概念(没有明确相似度概念)
- 特征无序
另一个例子: 水果
- 颜色:红色、绿色、黄色......
- 大小:小、中、大
- 形状:球形、细长
- 味道:甜、酸
样本的表示
- 属性的列表而非数值向量
- 例如享受运动的例子:
- 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个负例,A~1~为最佳属性时,取True的有21个正例5个负例,A~1~取False的有8个正例30个负例;A~2~为最佳属性时,取True的有18个正例33个负例,A~2~取False的有11个正例2个负例
比如A~1~是湿度,湿度大还是正常,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(w~j~)可能是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(W~i~) = 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 当数据的分裂在统计意义上并不显著时,就停止增长:预剪枝
- II 构建一棵完全树,然后做后剪枝
类型 I.
对于第一种方法,很难估计树的大小
预剪枝
何时停止分裂(1) :基于样本数
- 通常 一个节点不再继续分裂 ,当:
- 到达一个节点的训练样本数小于训练集合的一个特定比例 (例如 5%)
- 无论混杂度或错误率是多少
- 原因:基于过少数据样本的决定会带来较大误差和泛化错误
何时停止分裂(2):基于信息增益的阈值
设定一个较小的阈值,如果满足下述条件则停止分裂: Δ i ( s ) ≤ β \Delta i(s) \leq \beta Δi(s)≤β
- 优点:
- 用到了所有训练数据
- 叶节点可能在树中的任何一层
- 缺点: 很难设定一个好的阈值
避免过拟合: 类型 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)))
后剪枝 (1): 错误降低剪枝
- 把数据集分为训练集 和验证集
- 验证集:
- 已知标签
- 测试效果
- 在该集合上不做模型更新!
- 验证集:
- 剪枝直到再剪就会对损害性能:
- 在验证集上测试剪去每个可能节点(和以其为根的子树)的影响
- 贪心地去掉某个可以提升验证集准确率 的节点
如何定义新的叶节点的标签?
剪枝后新的叶节点的标签赋值策略
- 赋值成最常见的类别
- 给这个节点多类别的标签
- 每个类别有一个支持度 (根据训练集中每种标签的数目)
- 测试时: 依据概率选择某个类别或选择多个标签
- 如果是一个回归树 (数值标签),可以做平均或加权平均
- ......
错误降低剪枝的效果
后剪枝 (2): 规则后剪枝
- 把树转换成等价的由规则构成的集合
- e.g.
if (outlook=sunny) and (humidity=high) then playTennis = no
- e.g.
- 对每条规则进行剪枝,去除哪些能够提升 该规则准确率的规则前件
- i.e.
(outlook=sunny), (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
2. 具有过多取值的属性
问题:
- 偏差: 如果属性有很多值,根据信息增益IG,会优先被选择
- e.g. 享受运动的例子中,将一年里的每一天作为属性
- 一个可能的解决方法: 用 GainRatio(增益比) 来替代
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 .
(任一假设若在足够大 的训练样例集中很好地逼近 目标函数,它也能在未见实例中很好地逼近目标函数)