机器学习-决策树

时间:2022-03-15 11:41:29

一、决策树

  决策树是一种简单高效并且具有强解释性的模型,广泛应用于数据分析领域。其本质是一颗由多个判断节点组成的树,在使用模型进行预测时,根据输入参数依次在各个判断节点进行判断游走,最后到叶子节点即为预测结果。

  在数据挖掘中,决策树主要有两种类型:
  分类树 的输出是样本的类标。
  回归树 的输出是一个实数 (例如房子的价格,病人呆在医院的时间等)。

  术语分类和回归树 (CART) 包含了上述两种决策树

 

  1、树模型  

   首先,在了解树模型之前,自然想到树模型和线性模型有什么区别呢?其中最重要的是,树形模型是一个一个特征进行处理,之前线性模型是所有特征给予权重相加得到一个新的值。决策树与逻辑回归的分类区别也在于此,逻辑回归是将所有特征变换为概率后,通过大于某一概率阈值的划分为一类,小于某一概率阈值的为另一类;而决策树是对每一个特征做一个划分。另外逻辑回归只能找到线性分割(输入特征x与logit之间是线性的,除非对x进行多维映射),而决策树可以找到非线性分割。而树形模型更加接近人的思维方式,可以产生可视化的分类规则,产生的模型具有可解释性(可以抽取规则)。树模型拟合出来的函数其实是分区间的阶梯函数。

  其次,需要了解几个重要的基本概念:根节点(最重要的特征);父节点与子节点是一对,先有父节点,才会有子节点;叶节点(最终标签)。  

  • 决策树:从根节点开始一步步走到叶子节点(决策)
  • 所有的数据最终都会落到叶子节点,既可以做分类也可以做回归

  机器学习-决策树 

  2、决策树的训练与测试
  训练阶段:从给定的训练集构造出来一棵树(从跟节点开始选择特征, 如何进行特征切分)
  测试阶段:根据构造出来的树模型从上到下去走一遍就好了

  一旦构造好了决策树,那么分类或者预测任务就很简单了,只需要走一遍就可以了,那么难点就在于如何构造出来一颗树,这就没那么容易了,需要考虑的问题还有很多的!

  3、如何切分特征(选择节点)

  •  问题:根节点的选择该用哪个特征呢?接下来呢?如何切分呢?
  •  想象一下:我们的目标应该是根节点就像一个老大似的能更好的切分数据(分类的效果更好),根节点下面的节点自然就是二当家了。
  •  目标:通过一种衡量标准,来计算通过不同特征进行分支选择后的分类情况,找出来最好的那个当成根节点,以此类推。

  4、衡量标准-熵

  熵:熵是表示随机变量不确定性的度量(解释:说白了就是物体内部的混乱程度,比如杂货市场里面什么都有那肯定混乱呀,专卖店里面只卖一个牌子的那就稳定多啦)
  公式:H(X)=- ∑ pi * logpi, i=1,2, ... , n
  一个栗子:
    A集合[1,1,1,1,1,1,1,1,2,2]
    B集合[1,2,3,4,5,6,7,8,9,1]
  显然A集合的熵值要低,因为A里面只有两种类别,相对稳定一些而B中类别太多了,熵值就会大很多。(在分类任务中我们希望通过节点分支后数据类别的熵值大还是小呢?)

  熵:不确定性越大,得到的熵值也就越大
    当p=0或p=1时,H(p)=0,随机变量完全没有不确定性
    当p=0.5时,H(p)=1,此时随机变量的不确定性最大

    机器学习-决策树

  如何决策一个节点的选择呢?
  信息增益:表示特征X使得类Y的不确定性减少的程度。(分类后的专一性,希望分类后的结果是同类在一起)

  5、基尼不纯度

  基尼不纯度是指将来自集合中的某种结果随机应用于集合中某一数据项的预期误差率。如何集合中的每一个数据项都属于同一分类,那么推测的结果总会是正确的,因此误差率是 0;如果有 4 种可能的结果均匀分布在集合内,出错可能性是75%,基尼不纯度为 0.75。该值越高,说明拆分的越不理想,如果该值为 0,说明完美拆分。

  6、信息增益

  假设集合 U,一次拆分后变为了两个集合 u1 和 u2 ,则有:

信息增益 = E(U) - (Pu1 x E(u1) + Pu2 x E(u2))

  E 可以是基尼不纯度或熵。
  使用 Pu1 和 Pu2 是为了得到拆分后两个集合基尼不纯度或熵的加权平均,其中 :

  •  Pu1 = Size(u1) / Size(U)
  •  Pu2 = Size(u2) / Size(U)

  信息增益越大,说明整个集合从无序到有序的速度越快,本次拆分越有效。

 

 

二、决策树的分类

  在建立一棵决策树的过程中,一个很重要的问题就是:怎么样将树干分叉? 
  由此问题,便引申出了三种基本的决策树:

    1. ID3:利用数据集的信息增益来划分,在介绍信息增益之前先来了解一下熵的概念。 
      对于一个数据集,其熵定义如下: 
              机器学习-决策树
      其中p(xi)某一类别xi的概率。 
      根据香农信息理论,信息熵表示了信息的不确定度,当数据集呈均匀分布时,熵最大。 
      那么,在分类之前数据集的信息熵是可以计算得到的,它和划分后的数据集的信息熵的差值即为信息增益。这里有一个划分好坏的判断标准,对于一个特定的数据集,它的信息熵是一定的,若根据某一规则将数据集划分后,数据集的信息熵越小,说明数据集的不确定度越小,即数据间的差异越小,此时信息增益越大。从而得出,信息增益越大,划分方式越好。
    2. C4.5: 利用数据集的信息增益比来划分数据集,从ID3进化而来,避免了分类决策时偏向于取值较多的特征的问题。
    3. CART树:采用基尼系数作为分类标准。基尼系数具有以下特点:

      (1)基尼系数是一种不等性度量;

      (2)值介于0-1之间,0表示完全相同,1表示完全不同,基尼系数越大,数据集越混乱。

        机器学习-决策树

三、决策实例

  数据:14天打球情况
  特征:4种环境变化
  目标:构造决策树,决定打不打球

  机器学习-决策树

  划分方式:4种
  问题:谁当根节点呢?
  依据:信息增益

  机器学习-决策树

  计算

  在历史数据中(14天)有9天打球,5天不打球,所以此时的熵应为:

  机器学习-决策树

  4个特征逐一分析,先从outlook特征开始:

    Outlook = sunny时,熵值为0.971
    Outlook = overcast时,熵值为0
    Outlook = rainy时,熵值为0.971

  根据数据统计,outlook取值分别为sunny,overcast,rainy的概率分别为:5/14, 4/14, 5/14

  熵值计算:5/14 * 0.971 + 4/14 * 0 + 5/14 * 0.971 = 0.693

  对于Outlook的信息增益:0.94 - 0.693 = 0.247

  同样的方式可以计算出其他特征的信息增益,那么我们选择最大的那个就可以啦,相当于是遍历了一遍特征,找出来了大当家,然后再其余的中继续通过信息增益找二当家!

四、决策树剪枝

  决策树为什么(WHY)要剪枝?

  原因是避免决策树过拟合(Overfitting)样本。前面的算法生成的决策树非常详细并且庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的。因此用这个决策树来对训练样本进行分类的话,你会发现对于训练样本而言,这个树表现完好,误差率极低且能够正确得对训练样本集中的样本进行分类。训练样本中的错误数据也会被决策树学习,成为决策树的部分,但是对于测试数据的表现就没有想象的那么好,或者极差,这就是所谓的过拟合(Overfitting)问题。Quinlan教授试验,在数据集中,过拟合的决策树的错误率比经过简化的决策树的错误率要高。

  怎么剪枝

  现在问题就在于,如何(HOW)在原生的过拟合决策树的基础上,生成简化版的决策树?可以通过剪枝的方法来简化过拟合的决策树。

  剪枝可以分为两种:

  预剪枝(Pre-Pruning)和后剪枝(Post-Pruning),下面我们来详细学习下这两种方法:
  PrePrune:预剪枝,边建立决策树边进行剪枝的操作(更实用),及早的停止树增长,可以通过限制深度,叶子节点个数叶子节点样本数,信息增益量

  PostPrune:后剪枝,在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树。
  其实剪枝的准则是如何确定决策树的规模,可以参考的剪枝思路有以下几个:
  1:使用训练集合(Training Set)和验证集合(Validation Set),来评估剪枝方法在修剪结点上的效用
  2:使用所有的训练集合进行训练,但是用统计测试来估计修剪特定结点是否会改善训练集合外的数据的评估性能,如使用Chi-Square(Quinlan,1986)测试来进一步扩展结点是否能改善整个分类数据的性能,还是仅仅改善了当前训练集合数据上的性能。
  3:使用明确的标准来衡量训练样例和决策树的复杂度,当编码长度最小时,停止树增长,如MDL(Minimum Description Length)准则。

五、总结

  处理缺失数据

  决策树模型还有一个很大的优势,就是可以容忍缺失数据。如果决策树中某个条件缺失,可以按一定的权重分配继续往以后的分支走,最终的结果可能有多个,每个结果又一定的概率,即:
  最终结果 = 某个分支的结果 x 该分支的权重(该分支下的结果数/总结果数)

  处理数值型数据

  决策树主要解决分类问题(结果是离散数据),如果结果是数字,不会考虑这样的事实:有些数字相差很近,有些数字相差很远。为了解决这个问题,可以用方差来代替熵或基尼不纯度。