决策树和随机森林

  决策树是比较容易的理解的机器学习算法,算法学习过程就是利用数据的属性构造树的过程,根据构建的树,逐步向下决策,最后得到结果。决策树利用树结构进行决策,和人类理解决策问题时的思路很像,比如对于”是否要买下这套房子?”这样的决策问题,人类会思考“地段位置好吗?”。位置好,那再看“房子的价格可以接受吗?”。可以接受,“房子面积够用吗?”……经过一些列的决策判断之后,才会决定买/不买这套房子。

1. 决策树的构建过程

 emsp;决策树既然采用了树结构,那么就会包含树的根节点,若干中间节点和叶节点,而树的构建过程是一个递归的过程。决策树算法构建树的流程可以表示如下:

输入:训练集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) }
   属性集 A = { a 1 , a 2 , . . . , a d }
树生成过程: TreeGenerate( D , A )
1. 生成节点node
2. if D 中的样本都是同一个类别 C
3.   将node标记为叶节点,类别为 C
4.   return
5. if A 为空 or D 中的样本在各个属性上的取值都一样
6.   将node标记为叶节点,类别为 D 中样本最多的类
7. if D 为空
8.    将node标记为叶节点,类别为父节点的类
9. 从 A 中选择最优划分属性 a 对节点进行划分, a 的每一个属性值 a v 划分一个分支
10. for a v
11.   生成一个分支,分支的属性集合为 A a ,数据集合为 D v ,表示 D 中在 a 上取值为 a v 的所有样本
12.   TreeGenerate( D v , A a )
13. 输出:一颗决策树

其中,属性集有 d 个和样本 x i 的维度是保持一致的。

  决策树的构建过程是很明显的递归流程,包括递归返回条件和分而治之的思想。在决策树的构建中,很关键的是如何选择最优划分属性,依据什么准则来选择当前状况下的最优划分属性呢?最直接的想法是希望每次划分,都尽可能使得各个分支节点的样本属于同一个类。那么如何用数学语言描述这个想法呢?决策树一般采用信息增益、增益率和基尼指数。

2. 信息增益

  信息增益是比较采用某属性进行划分的前后,信息熵的变化,选择使信息熵变化最大的属性作为当前的最优划分属性。信息熵是度量样本纯度的常用指标。

  假定当前样本集合为 D ,每类样本 k 占总样本比例为 p k k = 1 , 2 , . . . , K ,假设集合 D 上共有 K 个类别)。则定义信息熵为:

E n t ( D ) = k = 1 K p k log 2 p k

信息熵的值越小,则样本集 D 的纯度越高,即大多样本都属于同一个类。比如在所有样本都是同一个类时, p k 要么是0,要么是1,则 E n t ( D ) = 0

  针对属性 a 进行划分( a 共有 M 种取值),划分 M 个分支,每个分支的样本集合为 D m , ( m = 1 , 2 , . . . , M ) 。则信息增益为:

G a i n ( D , a ) = E n t ( D ) m = 1 M E n t ( D m )

考虑根据样本数对 M 个分支加上权重,样本数越多,权重越大,则信息增益重新表示为:
G a i n ( D , a ) = E n t ( D ) m = 1 M | D m | | D | E n t ( D m )

其中, | D m | 表示数据集 D m 中样本的数量。因此,对于属性的选择,就是选择使得 G a i n ( D , a ) 最大的属性,如下。著名的 I D 3 决策树就是以信息增益为准则来选择最优划分属性。

a = arg max a A G a i n ( D , a )

3. 增益率

  分析信息增益会发现,如果某个属性包含较多的属性值,那么就会把数据集划分为很多个子集,那么每个子集的样本数量就会相对较少,信息熵也就会较小。因此取值数目越多的属性,越可能被选择为最优划分属性。即信息增益准则偏好于取值数目较多的属性。

  为了削弱信息增益对取值较多属性的偏好,可以使用增益率作为选择最优划分属性的准则。增益率的定义为:

G a i n R a t i o ( D , a ) = G a i n ( D , a ) I V ( a )

其中, I V ( a ) = m = 1 M | D m | | D | log 2 | D m | | D | I V ( a ) 有点像求划分子集的熵,跟属性密切相关,且属性 a 的取值越多, I V ( a ) 越大,那么就有效的抑制了信息增益对取值较多属性的偏好。

   C 4.5 决策树算法综合使用信息增益和增益率。首先确定信息增益高于平均水平的属性,再从中选择增益率最大的。

4. 基尼指数

  使用基尼指数值来表示数据集 D 的纯度。

G i n i ( D ) = 1 k = 1 K p k 2

表示从 D 中随机抽取两个样本类别标记不一致的概率。 G i n i ( D ) 越小,数据的纯度越大。而基尼指数表示为:

G i n i _ I n d e x ( D , a ) = m = 1 M G i n i ( D m )

通过选择使基尼指数最小的属性。 a = arg min a G i n i _ I n d e x ( D , a )

5. 剪枝

  在决策树中,为了追求在训练集上更高的准确率,会导致整棵树枝繁叶茂。这样很容易造成模型过拟合,在训练集上表现很好,而在测试集上的准确率却不高。

  剪枝是决策树中常用的解决过拟合的手段,包括预剪枝和后剪枝两种策略。预剪枝是在构造决策树时,根据该次划分能否带来泛化性能的提升决定是否执行此次划分,即阻止分枝的生成。后剪枝则是先生成一颗完整的决策树,而后从叶节点开始回溯,考察每个中间节点,若将某个中间节点修改为叶节点可以提升泛化性能,那么将该中间节点替换为叶节点,即剪掉节点下的所有分枝。

   不管是预剪枝还是后剪枝,都涉及泛化性能验证的问题,因此需要将数据分为训练集和验证集,使用训练集构建决策树,而使用验证集评估模型的泛化性能。

5.1 预剪枝

  在决策树的构建过程中,利用验证集评估当前构建的决策树的准确率,即根据当前最优属性划分后的决策树的准确率。若执行此次划分前的准确率小于划分后的准确率,则执行此次划分,否则不划分。在预剪枝中,当前的划分可能不会提升准确率,但是后续在该划分下的发展,则可能会达到更高的准确率,但是预剪枝策略直接忽略掉了这种可能性,因此预剪枝策略可能会导致模型欠拟合。

5.2 后剪枝

  构建好决策树之后,从最底层开始层序遍历决策树。对于非叶节点,利用验证集评估基于该结点进行划分和不划分的准确率,若不划分的准确率高于划分的准确率,则将该节点置为叶节点。

6. 连续属性取值

  在决策树的构建中,选择属性划分分枝时,是把属性的所有可能取值作为分枝,这对离散取值的属性是可行的,但对于连续取值的属性应该怎么办呢?

  将连续取值离散化是解决该问题的方法。假设 D 上的数据在属性 a 上的取值连续,但是数据集中的样本数是有限的,把所有样本在属性 a 上的值排序 ( a 1 , a 2 , . . . ) 。以所有相邻取值的中间点作为分界点 t ,可以把 D 分为两部分,在选择最优划分属性时,把分界点 t 也作为需要选择的属性之一。因此,分界点 t 丰富了属性集合,同一属性的不同分界点也可以作为最优的划分规则,因此在有连续值属性的决策树中,相同的属性可能多次出现在决策树中。
  对于信息增益而言,

G a i n ( D , a ) = max t T a G a i n ( D , a , t )

7. 随机森林

  随机森林(random forest, RF)可以简单的理解为决策树的组合,“”树(决策树)多了就成了林(随机森林)”。随机森林是集成学习策略bagging在决策树上的应用(关于集成学习更多的了解参见我的博客集成学习),它使用决策树作为基学习器,但对决策树的构建略有改动,即在决策树的构建过程中,对属性的选择引入了随机扰动。

  在随机森林算法中,a. 首先是基于自助采样法(自助采样法请参见我的博客机器学习中的模型评估与度量)得到 T 组训练样本。b. 针对每一组训练样本构建一棵决策树。但在随机森林中,对决策树中的每一个节点,并不是直接选择最优属性进行划分,而是先从该节点的属性集中随机选择包含 K 个属性的子集,再从这个子集中选择最优属性进行划分(推荐选择 K = log 2 d d 表示当前节点的总属性条目)。c. 得到 T 棵决策树,通过bagging策略,即多数投票的方式做最后的决策。

猜你喜欢

转载自blog.csdn.net/b876144622/article/details/80413327
今日推荐