决策树
决策树的定义
决策树类似于人们进行决策的过程,从一个根节点开始,通过逐一特征的筛选,生成多个分支,每个叶子节点为一个分类
考虑下面的样本:
人们的决策过程:
我们看到对于青年来说,只要工作情况就能决定是否房贷,房子和信贷情况并没有起到区分作用。对所有年龄层的来说,信贷情况都是多余的特征。这个决策过程看起来不错,不过这就是最佳路径了吗?
而在实际操作中,我们是用什么算法策略决定每一步特征的选取呢?也就是说,我们进行特征选择是基于什么准则?
特征选择
我们基于信息增益来选择特征。信息增益指的是信息熵的增益,为理解它需要提前了解两个概念:信息熵,条件熵
信息熵
一个事件发生的概率越低,它的不确定性就越强,信息量就越大,所以我们要用概率的函数来表示信息量,即;多个独立事件发生的概率是它们各自概率的乘积,而信息量是他们各自信息量的和,即
满足这个条件的函数是对数,于是用对数表示信息量:
其中
上面说的是一个具体的事件或特征。对一个变量X来说,它可能取不同的值,它取任何一个值都是一个事件,且所有取值的事件互相独立。我们考虑X的信息就应该考虑它所有取值,那么合理的方式就是使用它所有取值信息量的期望:
我们将此称作信息熵。所以说信息熵指的是变量的属性。
条件熵
现在在X基础上再加入另一个变量Y,它们的联合概率分布(与条件概率分别的区别见附录)为
定义条件熵为Y在X条件下的熵:
其中
观察条件熵的定义公式,从外往里看,它是X取值变动下对熵的加权和,而本身是固定下的,Y取值变动下每个条件概率的加权和。所以它是期望的期望,或者说是熵的熵,是信息量的嵌套加权。
推导一下条件熵具体的计算方法:
则:
①
②
由②可见条件熵由联合概率和条件概率构成。由①可见,条件概率可以由联合概率和作为条件的事件概率求得
信息增益
了解了信息熵(或者称经验熵)和条件熵,可以来理解信息增益了。
信息增益的定义是,当一个特征A引入后,原来集合D的经验熵,变成了D对A的条件熵,这个变化过程熵减少了多少。用数学表示:
BTW,因为特征在不断引入,每次引入之后的条件熵就成为下一次特征引入前的经验熵。
决策树的特征选择基于信息增益最大,也就是新特征的加入使得整个集合的信息量减少最多,概率就越大,这样就越接近最终分类结果。
基于信息增益进行特征选择
现在开始通过计算信息增益来对上述样本进行特征选择。
1.1)首先计算初始经验熵,初始只有一个特征D,就是放贷与否。放贷为,不放为,则经验熵为:
1.2)假设引入“年龄段”特征。则原来对样本的了解只有放贷与否,现在多了一个“年龄段”的区分度。设“年龄段”为,使用上述②式,计算条件熵:
P(青年,放贷)= P(放贷|青年)= P(青年,不放贷)= P(不放贷|青年)=
P(中年,放贷)= P(放贷|中年)= P(中年,不放贷)= P(不放贷|中年)=
P(老年,放贷)= P(放贷|老年)= P(老年,不放贷)= P(不放贷|老年)=
=>
1.3)假设引入“有工作与否”特征。设“有工作与否”为,使用上述②式,计算条件熵:
P(有工作,放贷)= P(放贷|有工作)= P(有工作,不放贷)= P(不放贷|有工作)=
P(没工作,放贷)= P(放贷|没工作)= P(没工作,不放贷)= P(不放贷|没工作)=
=>
1.4)假设引入“有房子与否”特征。设“有房子与否”为,使用上述②式,计算条件熵:
P(有房子,放贷)= P(放贷|有房子)= P(有房子,不放贷)= P(不放贷|有房子)=
P(没房子,放贷)= P(放贷|没房子)= P(没房子,不放贷)= P(不放贷|没房子)=
=>
1.5)假设引入“信贷情况”特征。设“信贷情况”为,使用上述②式,计算条件熵:
P(信贷一般,放贷)= P(放贷|信贷一般)= P(信贷一般,不放贷)= P(不放贷|信贷一般)=
P(信贷好,放贷)= P(放贷|信贷好)= P(信贷好,不放贷)= P(不放贷|信贷好)=
P(信贷非常好,放贷)= P(放贷|信贷非常好)= P(信贷非常好,不放贷)= P(不放贷|信贷非常好)=
=>
1.6)比较,,, =>
也就是这里我们选择特征“有房子与否”,至此我们做出了第一个特征选择,在选择之后根据有房子与否的“是”与“否”岔开了两个路径,也就是分割出来了两个子空间和,其中“是”空间的路径已经抵达了叶子;“否”空间还有待开发。
2.1)针对分出来的子空间,继续进行特征选择。
幸运的是,我们只有一个子空间需要开发。空间的数据缩小为:
此时空间处于初始状态,即没有选择任何特征,它的信息熵为:
2.2)假设引入“年龄段”特征。设“年龄段”为,使用上述②式,在数据空间计算条件熵:
P(青年,放贷)= P(放贷|青年)= P(青年,不放贷)= P(不放贷|青年)=
P(中年,放贷)= P(放贷|中年)= P(中年,不放贷)= P(不放贷|中年)=
P(老年,放贷)= P(放贷|老年)= P(老年,不放贷)= P(不放贷|老年)=
=>
2.3)假设引入“有工作与否”特征。设“有工作与否”为,使用上述②式,计算条件熵:
P(有工作,放贷)= P(放贷|有工作)= P(有工作,不放贷)= P(不放贷|有工作)=
P(没工作,放贷)= P(放贷|没工作)= P(没工作,不放贷)= P(不放贷|没工作)=
=>
2.4)假设引入“信贷情况”特征。设“信贷情况”为,使用上述②式,计算条件熵:
P(信贷一般,放贷)= P(放贷|信贷一般)= P(信贷一般,不放贷)= P(不放贷|信贷一般)=
P(信贷好,放贷)= P(放贷|信贷好)= P(信贷好,不放贷)= P(不放贷|信贷好)=
P(信贷非常好,放贷)= P(放贷|信贷非常好)= P(信贷非常好,不放贷)= P(不放贷|信贷非常好)=
=>
2.5)比较,, =>
所以我们选择的特征是“有工作与否”,并且注意,该特征的信息增益是,意味着,全部信息被衰减,流程图应该停止了。我们绘图看看是否如此:
的确如此!
我们比较此图和初始的流程图,可知,采用信息增益,可以尽可能等减少分支和叶子,迅速决策。
决策树生成算法
常见的决策树生成算法有ID3算法,C4.5算法和CART算法
ID3算法
ID3算法使用的是信息增益,其运算过程正是上节所描述的例子!
C4.5算法
C4.5与ID3的区别仅仅是使用信息增益比 而非信息增益。为什么要用信息增益比呢?
因为在使用信息增益,会导致特征选择时偏向于选择取值较多的那个特征,而那个特征可能是没有意义的。比如编号,身份证号,星期几。如下的用星期作为特征,可以产生5个分支,使用ID3算法的信息增益可以将所有信息熵衰减掉,直接生成五个叶子:
这是非常严重的过拟合。为了避免这种情况的产生,我们必须增加与分支数(选定特征的取值数)相关的惩罚项,形成信息增益比:
其中惩罚项是,是所选特征的取值数,是子空间,此例中
CART算法
将会在之后的文章中单独讲解
说明
当然,需要注意的是:无论使用哪种算法,对于大数据来说,我们的决策树的层数可能非常多,如果我们分解到没有特征可分的地步会过拟合,且时间消耗非常大。 通常的做法是设置一个信息增益阈值,当某个特征引入后信息增益小于该阈值,我们就可以停止树分裂,并把原始数据集中数量最多的那个类别作为叶子节点
附录:联合概率分布和条件概率分布的区别
考虑两个变量:天晴与否,花开与否
它们组合成四种事件:
1)天晴了A1,花开了B1
2)天晴了A1,花没开B2
3)天没晴A2,花开了B1
4)天没晴A2,花没开B2
联合概率分别描述这四种情况:
, , , ,
条件概率分布描述的是某个事件已经发生了,比如B1已经发生了,就扼杀了2),4)的可能,我们就只能从1),3)两种情况去考虑:
,
条件概率和联合概率的数学关系:
参考
《统计方法学》by 李航