机器学习笔记(四)——决策树如何长成森林?

决策树是一种基本的分类与回归方法,在集成方法中经常作为基础分类器,比如说随机森林算法。决策树模型具有可读性和分类速度快两大特点,但是也容易造成过拟合的问题。一般来说,决策树算法通常包括3个步骤: 特征选择、决策树的生成和决策树的修剪!

一、特征选择

当我们使用决策树算法对数据进行分类时,我们面临的第一个问题就是 : 我们在哪个特征上进行数据分类划分得到的收益最大? 因此,我们需要工具来定量地评价在不同特征上进行划分数据时各自的效益。

1.1 信息增益

: 在信息与概率统计中,熵代表随机变量不确定的度量。
X X 是一个取有限个值得离散随机变量,则其概率分布位: P ( X = x i ) = p i , i = 1 , 2 , 3..... , n P(X = x_i) = p_i , i = 1,2,3.....,n 则随机变量 X X 的熵为: H ( X ) = i = 1 n p i l o g p i H(X) = -\sum_{i=1}^{n} p_i log p_i 熵的值越大,随机变量的不确定性越大。

条件熵 : 随机变量 X X 在给定的条件下随机变量 Y Y 的条件熵 H ( Y X ) H(Y|X) ,定义为 X X 在给定条件 Y Y 下的条件概率分布的熵对 X X 的数学期望: H ( Y X ) = i = 1 n p i H ( Y X = x i ) = i = 1 n P ( X = x i ) H ( Y X = x i ) , i = 1 , 2 , 3.... , n H(Y|X) = \sum_{i=1}^{n}p_iH(Y|X=x_i) = \sum_{i=1}^{n} P(X=x_i)H(Y|X=x_i) , i = 1,2,3....,n

信息增益: 特征A对训练数据集的信息增益 g ( D , A ) g(D,A) , 定义为数据集D的熵与特征A给定条件下的条件熵之差,即: g ( D , A ) = H ( D ) H ( D A ) g(D,A) = H(D) - H(D|A) 信息增益越大的特征具有更强的分类特征。

在以信息增益为划分数据集的特征的依据时,存在偏向选择取值较多的特征的问题,因此,可以使用信息增益比对其进行校正。

信息增益比:特征A对训练数据集的信息增益比 g R ( D , A ) g_R(D,A) 定义为其信息增益与训练数据集D关于特征A的值的熵 H A ( D ) H_A(D) 之比,即: g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A) = \frac{g(D,A)}{H_A(D)} 其中 H A ( D ) = i = 1 n D i D l o g 2 D i D H_A(D) = - \sum_{i=1}^{n} \frac{D_i}{ D} log_2 \frac{D_i}{D} , n n 是特征A的取值个数, D i D_i 是指数据集中 A = A i A = A_i 的数据的个数

1.2 基尼指数

在分类树中,不仅仅可以通过是使用信息增益或者信息增益比来决定数据集中的最优划分特征,也可以通过基尼指数来选择最优特征。

基尼指数: 分类问题中,假设数据集D中有 K K 个类,样本点属于第k个类的概率为 p k p_k ,则该数据集D的基尼指数定义为: G i n i ( p ) = k = 1 K p k ( 1 p k ) = 1 k = 1 K p k 2 Gini(p) = \sum_{k=1}^{K} p_k(1-p_k) = 1 - \sum_{k=1}^{K}p_k^2 即: G i n i ( D ) = 1 k = 1 K ( C k D ) 2 Gini(D) = 1 - \sum_{k=1}^{K}(\frac{C_k}{D})^2 其中, C k C_k 是指数据集D中属于第k类的样本子集,K是类的个数。
G i n i ( D ) Gini(D) 越小,则数据集的纯度越高,而划分数据集的大原则就是 将无序的数据变得更加有序

因此,特征A的基尼指数定义为: G i n i ( D , A ) = v = 1 V D v D G i n i ( D v ) Gini(D,A) = \sum_{v=1}^{V} \frac{D^v}{D} Gini(D^v) 其中 D v D^v 是数据集根据 A = A v A = A^v 划分来的子数据集, G i n i ( D v ) Gini(D^v) 是子数据集的基尼指数。在候选特征集和中,选择那个使得划分后基尼指数最小的特征作为最优划分属性.

二、决策树的生成

2.1 ID3算法

具体方法: 从根节点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为划分属性,根据该特征的不同取值建立子结点; 对子结点递归调用上述方法,构建决策树; 直到所有特征的信息增益均很小或者没有特征可以选择为止。

'''
输入: 训练数据集D,停止的条件
输出: 决策树
递归操作,建立决策树:
1)计算数据集中各个特征A的信息增益,选择信息增益最大的特征,划分多个子结点
2)判断子结点是否满足停止条件(树的深度,子结点是否同属于同一类,子结点的数据集数量是否小于某一值,子结点的信息增益是否小于阈值),若满足返回; 不满足,递归调用(1)
3)生成决策树
'''

注: C4.5算法与ID3算法的区别在于划分依据不同,C4.5采取的是信息增益比,ID3采用的是信息增益,其它的完全可以套用

2.2 CART算法

具体方法:

'''
输入: 训练数据集D,停止计算的条件
输出: CART决策树
递归操作,建立二叉决策树:
1) 对数据集D的每个特征A的每个取值a,根据A == a 将数据集划分为D1和D2两部分,计算此时的基尼系数
2) 在所有可能的特征A及其所有可能的a,选择使基尼系数最小的特征及其对应的切分点作为最优特征和最优切分点,并生成两个子结点(D1,D2)
3)对两个子结点递归地调用(1),(2),直至满足停止条件
4) 生成CART决策树
'''

三、决策树的修剪

上面提到决策树算法的一大问题在于,有时为了能尽可能地对训练样本进行分类,导致决策树的分支太多,以至于将一些训练集自身的特征当作所有数据都具有的一般性质而导致过拟合现象。因此,主动地去掉一些分支可以有效地降低过拟合的风险。

3.1 预剪枝

预剪枝是指,在决策树生成过程中,对每个结点在划分前不仅仅使用训练集,还使用验证集对其泛化性能进行估计。如果当前结点的划分并不能带来决策树的泛化性能的提高,则停止划分并将当前结点标记为叶结点。

预剪枝可以使得很多分支都没有展开,因此不仅仅可以降低过拟合的风险,而且能够显著地提高决策树的训练时间开销和测试时间开销 ; 但是预剪枝有可能会带来欠拟合的风险。

3.2 后剪枝

后剪枝则是先将训练集生成一颗完整的决策树(每一个叶节点只包含一个类),然后自下向上对非叶结点进行考察,若将该结点对应的子树替换为叶节点能带来决策树的泛化性能的提升,则将该子树替换为叶节点。

一般来说,后剪枝决策树通常会比预剪枝决策树保留更多的分支,因此它的欠拟合风险很小,泛化能力往往优于预剪枝决策树。但是由于后剪枝的过程通常是在生成完全决策树之后进行的,并且自下而上对所有的非叶节点逐一考察,因此其训练时间开销比未剪枝决策树以及预剪枝决策树都要大很多。

因此在选择剪枝的策略时,需要在泛化能力以及时间开销上进行取舍!

四、随机森林算法

首先我们明确一件事,什么是随机森林算法?随机森林算法是通过bagging的思想将多棵树进行集成的算法,简单地你可以认为 决策树+bagging 就是随机森林算法。

4.1 bagging

bagging是一种从训练集中进行子抽样组成每个基模型所需要的子训练集,对所有基模型预测的结果进行综合产生最终的预测结果。
在这里插入图片描述
Bagging用于随机森林算法时的使用步骤:

  • 首先我们从数据集中使用Bootstrap采样有放回的随机选择n个训练样本
  • 在M个特征属性中,随机选择m < M 个属性用于决策树分类中的特征选择过程
  • 重复以上两步T次,得到T个决策树分类器
  • 将测试数据集放在T个分类器,最后经过投票机制(多数服从少数),看到底分在哪一类(分类问题)

4.2 随机森林

每棵树的生成规则:

  • 如果原始训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集 : 在此过程中,会在训练集中出现重复数据 ,但每棵树的训练数据集是不同的
  • 如果训练集的特征维度是M,则从中随机选择m ( m M m \leq M ) 个特征构成特征子集,每次树进行分裂时,从这m个特征中选择最优划分特征
  • 每棵树尽可能地生长,不需要剪枝 : “两次随机性”的引入使得随机森林并不容易陷入过拟合问题

随机森林的错误率的影响因素:

  • 两棵树之间的相关性 : 相关性越大,随机森林的错误率越高
  • 随机森林中每一颗决策树的分类能力 : 分类能力越强,随机森林的错误率越低

一般而言,提高每棵树所使用的特征数量m,可以提高每棵树的分类能力,但是另一方面会导致森林中任意两棵树之间的相关性增大 ; 因此,选择合适的特征数量m是极其重要的调参过程。

猜你喜欢

转载自blog.csdn.net/Pythboy/article/details/85282093
今日推荐