决策树简介
决策树是一种实现分支策略的层次数据结构。他是一种有效的非参数学习方法,可以用于分类和回归。
非参数学习方法与参数学习方法
参数学习方法:在训练完成所有数据后得到一系列训练参数,然后根据训练参数来预测新样本的值,这时不再依赖之前的训练数据了,参数值是确定的。
而非参数学习方法是:在预测新样本值时候每次都会重新训练数据得到新的参数值,也就是说每次预测新样本都会依赖训练数据集合,所以每次得到的参数值是不确定的。例如局部加权回归(LWR)就是非参数学习方法。
决策树有二元分支树和多分枝树,一般采用二元分裂。
决策树技术核心是递归分割的贪婪算法。
决策树要解决的问题
-
收集待分类的数据,这些数据所有属性应该是完全标注的;
-
设计分类原则,即数据的哪些属性可以被用来分类,以及如何将该属性量化;
-
分类原则的选择,即在众多分类准则中,每一步应使用哪一准则最终树更令人满意。
-
设计分类停止条件,实际应用中数据的属性很多,真正有分类意义的属性往往有限,因此在必要的时候应停止数据集分裂:
-
该节点包含的数据太少不足以分裂;
-
继续分裂数据集对树生成的目标没有贡献;
-
树的深度过大不宜再分;
-
ID3算法
ID3算法核心
ID3算法核心是在决策树各级节点上选择属性时,通过计算信息增益来选择属性,以使得每一非叶节点进行测试时,能获得关于被测试记录最大的类别信息。
具体方法
检测所有的属性,选择信息增益最大的属性产生的决策树节点,游该属性的不同取值建立分支,再对各分支的子集递归调用该方法建立决策树节点的分支,直到所有子集仅包含同一类别的数据为止。
在分支节点处属性的选择上,ID3算法使用信息论中的信息增益作为标准,通过计算分支节点处每个属性的信息增益,选择具有最高信息增益(信息熵减少的程度最大)的属性作为当前节点的分支属性,这样保证了对训练样本子集进行分类时所需要信息最小,从而确保所产生的决策树最为简单。
信息论基本概念
定义1
若存在
n
n
n个相同概率的消息,则每个消息的概率
p
p
p是
1
n
\frac{1}{n}
n1,一个消息传递的信息量是
n
\operatorname{}n
n;
定义2 若有
n
n
n个消息,其给定概率分布
P
=
(
p
1
,
p
2
,
p
3
,
…
,
p
n
)
P = \left( p_{1},p_{2},p_{3},\ldots,p_{n} \right)
P=(p1,p2,p3,…,pn),则由该分布传递的信息量称为
P
P
P的熵,记为
I
(
p
)
=
−
∑
i
=
1
n
p
i
l
o
g
2
p
i
I\left( p \right) = - \sum_{i = 1}^{n}{p_{\mathbb{i}}\operatorname{log_2}p_{i}}
I(p)=−i=1∑npilog2pi
信息熵
信息熵是消除不确定性所需信息量的度量,即位置时间可能含有的信息量。具体计算方法见定义2。
熵可以作为数据出精度或胡乱度的衡量指标:
-
当数据变得越来越纯时,熵的值变得越来越小;
-
信息中正反所占比例相同时,熵取最大值;
-
信息中所有数据都只属于一个类时,熵得到最小值。
定义3 若一个记录集合 T T T根据类别属性的值被分成相互独立的类 C 1 , C 2 , C 3 , …   C k C_{1},C_{2},C_{3},\ldots\,C_{k} C1,C2,C3,…Ck,则识别 T T T的一个元素所属哪个类所需要的信息量为 Info ( T ) = I ( P ) \text{Info}\left( T \right) = I\left( P \right) Info(T)=I(P),其中 P P P为 C 1 , C 2 , C 3 , …   C k C_{1},\ C_{2},C_{3},\ldots\,C_{k} C1, C2,C3,…Ck的概率分布,即 P = ( ∣ C 1 ∣ ∣ T ∣ , … , ∣ C k ∣ ∣ T ∣ ) P = \left( \frac{\left| C_{1} \right|}{\left| T \right|},\ldots,\frac{\left| C_{k} \right|}{\left| T \right|} \right) P=(∣T∣∣C1∣,…,∣T∣∣Ck∣)
定义4
信息增益度是两个信息量之间的差值,其中一个信息量是确定
T
T
T中衣服元素的信息量,另一个信息量是在已得到属性
X
X
X的值后确定
T
T
T中的一个元素的信息量。信息增益度公式为:
Gain ( X , T ) = I n f o ( T ) − I n f o ( X , T ) \text{Gain}\left( X,T \right) = Info\left( T \right) - Info(X,T) Gain(X,T)=Info(T)−Info(X,T)
信息增益
信息增益可以衡量划分数据集前后数据(标签)有序性发展的程度。其计算公式见定义4。
ID3算法评价
优点:
分类过程和领域知识无关,几乎所有模式和场景都可以得到结果;
缺点:
-
ID3算法注意力集中在特征的选择上,且偏向于选择特征值数目较多的特征,而特征值数目较多的特征缺不总是最优特征;
-
ID3算法用户信息作为特征选择量上存在一个假设,即训练例子集中的正、反例的比例应该与实际问题领域中的正反例的比例相同。但在一般情况下,都不能保证二者相同,这样计算训练集的信息增益便存在偏差;
-
不适用于连续变量;
-
只能用于分类;
-
一次只用一类特征值进行划分,特征间相关性强调不够;
-
样本量较小时,可能会导致过度分类;
-
对样本数据缺失的情况无法处理;
-
不适合处理包含多重分支的特征值;
ID3算法适用于数量较大的决策树判断系统和大型的数据库系统。在这些系统中,其优势会得到更好体现。ID3算法引入后不久,Schlimmer和Fisher在ID3算法的基础熵构造了ID4算法,允许递增式构造决策树,1988年,Utgoff提出ID5算法,允许通过修改决策树来增加新的训练实例,而无需重建决策树。
ID3算法改进-C4.5
改进之处
-
用**信息增益率(详见下文定义5)**来选择属性,克服了用信息增益选择属性时偏向选择取值较多的这一不足;
-
在决策树构造过程中进行剪枝;
-
能够完成对连续属性的离散化处理;
-
能够对不完整数据进行处理。
定义5
设样本集
T
T
T按离散属性
A
A
A的
s
s
s个不同取值划分为
T
1
,
T
2
,
…
,
T
s
T_{1},T_{2},\ldots,T_{s}
T1,T2,…,Ts,共
s
s
s个子集,则用属性
A
A
A对样本集
T
T
T进行划分的信息增益率为
ratio
(
A
,
T
)
=
G
a
i
n
(
A
,
T
)
/
s
p
l
i
t
(
A
,
T
)
\text{ratio}\left( A,T \right) = Gain(A,T)/split(A,T)
ratio(A,T)=Gain(A,T)/split(A,T)。其中
split ( A , T ) = − ∑ i = 1 s ∣ T i ∣ ∣ T ∣ × l o g 2 ( ∣ T i ∣ ∣ T ∣ ) \text{split}\left( A,T \right) = - \sum_{i = 1}^{s}\frac{\left| T_{i} \right|}{\left| T \right|} \times \operatorname{log_2}\left( \frac{\left| T_{i} \right|}{\left| T \right|} \right) split(A,T)=−i=1∑s∣T∣∣Ti∣×log2(∣T∣∣Ti∣)
连续值属性与分裂点处理
-
将需要处理的样本(对应根节点)或样本子集(对应子树)按照连续变量的大小从小到大进行排序;
-
取每对相邻值的中点作为可能的分裂点split_point;
-
用信息增益比率选择最佳划分。
假设一连续属性公有N个不同的属性值,则可以找到N-1个可能的分裂点。检查每个可能的分裂点,取能使得信息增益最大的分裂点,将D分裂成D1:A
<= split_point 和 D2:A > split_point
当离散属性和连续属性并存时,C4.5算法倾向于选择连续特征做最佳分裂点。
缺失值的处理
简单方法:赋予它该属性最常见的值
复杂策略:为A的每一个可能值赋予一个概率,则改进如下:
Gain ′ ( A , T ) = F × G a i n ( A , T ) \text{Gain}^{'}\left( A,T \right) = F \times Gain(A,T) Gain′(A,T)=F×Gain(A,T)
其中F为属性值未缺失的实例所占比例,计算 G a i n ( A , T ) Gain(A,T) Gain(A,T)时忽略属性值缺失的实例。
分裂时,将属性缺失的实例分配给所有分支,并带一个权重。
过拟合与剪枝
过拟合
上述的决策树算法增长树的每一个分支的深度,直到恰好能对训练样例比较完美的分类。
实际应用中,当训练样本中有噪声或训练样例的数量太少以至于不能产生目标函数的有代表性采样时,该策略可能遇到困难。
以上情况发生时,这个简单算法产生的树会过度拟合训练样例(Over fitting)。
产生原因:训练样本中有噪声,训练样例太小,缺乏代表性样本等。
剪枝
预剪枝(pre-pruning)
在完全正确分类训练集之前就停止树的生长。
所有决策树的构建方法,都是在无法进一步降低熵的情况下才会停止创建分支的过程。为了避免过拟合,可以设定一个阈值,熵减小的数量小于这个阈值,即使可以继续降低熵,也停止继续创建分支。
本方法由于实际效果不好,生成的决策树分支较少,一般不采用。
后减枝(post-pruning)
由“完全生长”的树减去子树。
在测试集上定义损失函数C,目标时通过剪枝使得在测试集上C的值下降。
自底向上遍历每一个非叶节点(除根节点),将当前的非叶节点从树中剪去,旗下所有的叶节点合并成一个节点,代替原来被剪掉的叶节点;
计算剪去节点前后的损失函数,如果剪去节点值后损失函数变小了,则说明该节点可以减去,并将其减去,如果发现损失函数并没有减少,说明该节点不可减去,则将树还原成未减去的状态。
重复上述过程,直到所有的非叶节点(除了根节点)都被尝试。
方法:
Reduced-Error Pruning(REP)
Peaimistic-Error Pruning(PEP)
Cost-Complexity Pruning(CCP)
Error-Based Pruning(EBP)
C4.5评价
优点
-
通过信息增益率选择分裂属性,客服了ID3算法中通过信息增益倾向于选择拥有多个属性值的属性作为分裂属性的不足;
-
可以将连续性属性进行离散化处理,克服ID3算法不能处理连续性数据缺陷,C4.5算法能够处理离散型和连续性变量两种属性类型;
-
构造决策树后采用后减枝操作,解决ID3算法中可能出现过拟合问题;
-
可训练具有缺失属性值的训练属性;
-
产生的分类规则易于理解且准确率高;
缺点
-
构造树的过程中,需要对数据集进行多次顺序扫描和排序,因而导致算法的低效
-
针对含有连续属性的训练样本时,算法计算效率较低;
-
算法在选择分类属性时没有考虑到条件属性间的相关性,只计算数据集中的每一条件属性与决策属性之间的期望信息,有可能影响到属性选择的正确定;
-
算法只适合于能够驻留与内存的数据集,当训练集大得无法在内存容纳时程序无法运行。
CART算法
算法特点
分类回归树(CART:Classification and Regression Tree)可以处理高度倾斜或多态的数值型数据,也可处理顺序或无序的类属性数据。CART算法选择具有最小的gini(下见定义6)系数值的属性作为测试属性,gini值越小,样本的“纯净度”越高,划分效果最好。
定义6 设样本 T T T中包含 n n n个不同类别,则
gini ( T ) = 1 − ∑ j = 1 n p j 2 \text{gini}\left( T \right) = 1 - \sum_{j = 1}^{n}p_{j}^{2} gini(T)=1−j=1∑npj2
其中 p j p_{j} pj是 T T T中包含 j j j值的频率(用频率等价于概率)。若将 T T T划分为两个子集 T 1 T_{1} T1和 T 2 T_{2} T2,则
gini ( T 1 , T 2 ) = ∣ T 1 ∣ ∣ T ∣ gini ( T 1 ) + ∣ T 2 ∣ ∣ T ∣ g i n i ( T 2 ) \text{gini}\left( T_{1},T_{2} \right) = \frac{\left| T_{1} \right|}{\left| T \right|}\text{gini}\left( T_{1} \right) + \frac{\left| T_{2} \right|}{\left| T \right|}gini(T_{2}) gini(T1,T2)=∣T∣∣T1∣gini(T1)+∣T∣∣T2∣gini(T2)
与C4.5算法类似,CART算法也是先建树后减枝,但在具体实现上有所不同。由于二叉树不易产生数据碎片,精确度往往高于多叉树,因此CART算法采用二分递归划分,在分支节点上进行布尔测试,判断条件为真的划归左分支,否则划归右分支,最终形成一个二叉决策树。
CART算法在满足下述条件之一时停止建树:
所有叶节点中的样本数为1或样本属于同一类;
决策树高度到达用户设置的阈值。
CART算法在剪枝阶段,采用代价-复杂性剪枝算法。当决策树复杂度超过一定程度后,随着复杂度的提高,测试集的分类精确度反而降低。
CCP(代价复杂度剪枝)
CCP选择节点表面误差率增益值(下见定义7)最小的非叶子节点,删除该非叶子节点的左右子节点,若有多个非叶子节点的表面误差率增益值相同小,则选择非叶子节点中子节点数量最多的非叶子节点进行剪枝。
定义7 设样本集为 T T T共有 m m m个取值划分, R ( t ) R\left( t \right) R(t)表示叶子节点的误差代价, R ( t ) = r ( t ) × p ( t ) R\left( t \right) = r\left( t \right) \times p(t) R(t)=r(t)×p(t),其中 r ( t ) r(t) r(t)为节点的错误率, p ( t ) p(t) p(t)为节点数据量的占比; R ( T ) R(T) R(T)表示子树的误差代价:
R ( T ) = ∑ i = 1 m r i ( t ) × p i ( t ) R\left( T \right) = \sum_{i = 1}^{m}{r_{i}(t) \times p_{i}(t)} R(T)=i=1∑mri(t)×pi(t)
其中 r i ( t ) r_{i}(t) ri(t)为子节点 i i i的错误率, p i ( t ) p_{i}(t) pi(t)为节点 i i i的数据节点占比; N ( T ) N(T) N(T)表示子树节点个数,则表面误差率增益值 α \alpha α:
α = R ( t ) − R ( T ) N ( T ) − 1 \alpha = \frac{R\left( t \right) - R(T)}{N\left( T \right) - 1} α=N(T)−1R(t)−R(T)
决策树总结
决策树技术发现数据模式和规则的核心是归纳算法。
决策树不足
决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。可以通过集成学习之类的方法解决。
寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善。
有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。
如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。
评价指标
评价指标在这里不做过多讨论,但其却是一个很重要的问题。具体请详见混淆矩阵和ROC曲线。