决策树与随机森林

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了决策树与随机森林相关的知识,希望对你有一定的参考价值。

参考技术A

决策树(decision tree)是一种基本的分类与回归方法,本文主要讨论用于分类的决策树。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布,其主要优点是模型具有可读性,分类速度快。决策树学习通常包括三个步骤:特征选择,决策树的生成和决策树的修剪。而随机森林则是由多个决策树所构成的一种分类器,更准确的说,随机森林是由多个弱分类器组合形成的强分类器。

本文将先对决策树特征选择的算法ID3, C4.5和CART进行计算,然后介绍决策树的剪枝策略,最后介绍随机森林。

在 信息论 中, 条件熵 描述了在已知第二个随机变量X的前提下,随机变量Y的信息熵还剩多少。基于X条件的Y的信息熵,用H(Y|X)表示。

如果H(Y|X=x)为变数Y在变数X取特定值x条件下的熵,那么H(Y|X)就是H(Y|X=x)在X取遍所有可能的x后取平均的结果。

首先需要知道的是熵的公式:

条件熵的推导公式如下:

决策树分类从根节点开始,对实例的某一特征进行测试,根据测试结果将实例分配到其子节点。每一个子节点对应着该特征的一个取值。如此递归地对实例进行测试并分配,直至达到叶节点,最后将实例分配到叶节点的类中。

决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行划分。如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。通常特征选择的准则是信息增益或信息增益比,特征选择的常用算法有ID3,C4.5,CART。

信息增益表示得知特征A的信息而使得数据X的信息的不确定性的程度。
信息增益定义:特征A对训练数据集D的信息增益g(D, A)定义为集合D的经验熵H(D)与给定特征A的条件下D的经验条件熵H(D|A)之差,即:

根据信息增益选择特征的方法是:对于给定数据集D,计算其每个特征的信息增益,并比较他们的大小,选择信息增益最大的特征。使用信息增益选择特征的算法称为C3算法。

信息增益值的大小是相对于训练数据集而言的,并没有绝对意义。在分类为题困难时,也就是说在训练数据集的经验熵大的时候,信息增益值会偏大。反之,信息增益值会偏小。因此,使用信息增益比可以对这一问题进行校正,这是另一种特征选择算法,也即C4.5算法。

信息增益比定义 :特征A对训练数据集D的信息增益比g R (D, A)定义为其信息增益g(D, A)与训练集D的经验熵之比:

基尼指数是CART分类树用来选择最优特征的算法,同时决定了该特征的最优二值切分点。

定义:假设有K个类,样本点属于第k类的概率为p k ,则概率分布的基尼指数定义:

对于给定的样本集合D,其基尼指数为:

一个特征的信息增益/基尼系数越大,表明特征对样本的熵减少的能力更强,这个特征使得数据由不确定性变成确定性的能力越强。

决策树生成算法产生的决策树对于训练数据的分类往往很准确,但对于未知数据的分类却没有这么准确,即容易出现过拟合情况。解决的办法便是考虑树的复杂度,对已生成的树进行剪枝简化。

决策树的剪枝往往通过极小化决策树整体的损失函数来实现。
设树T的叶节点个数为|T|,t是树T的叶节点,该叶节点有N t 个样本点,其中k类的样本点有N tk 个,k=1,2,3...K, H t (T)为叶节点t上的经验熵, α>=0为参数,则决策树学习的损失函数可以定义为:

损失函数中C(T)表示模型对训练数据的预测误差,也即拟合程度。|T|表示模型复杂度,即节点越多模型越复杂,使用参数α来控制两者之间的影响。α越大模型越简单,对数据拟合差;α越小模型越复杂,对数据拟合性好;α=0时则不考虑模型复杂度。

因此,剪枝就是在确定了α时,选择损失函数最小的树。

参考:
《统计学习方法》李航
机器学习. 邹博

决策树与随机森林算法

决策树

决策树模型是一种树形结构,基于特征对实例进行分类或回归的过程。即根据某个特征把数据分划分到若干个子区域(子树),再对子区域递归划分,直到满足某个条件则停止划分并作为叶子节点,不满足条件则继续递归划分。

一个简单的决策树分类模型:红色框出的是特征。

 

技术分享

 

决策树模型学习过程通常包3个步骤:特征选择、决策树的生成、决策树的修剪

1.特征选择

选择特征顺序的不同将会产生不同决策树,选择好的特征能使得各个子集下标签更纯净。度量特征对产生子集的好坏有若干方法,如误差率,信息增益、信息增益比和基尼指数等。

1.1误差率

训练数据D被特征A分在若干子结点后,选择子节点中出现数目最多的类标签作为此结点的返回值,记为yc^。则误差率定义为1|D|∑i=1|Dc|I{yi≠yc}

1.2信息增益

熵与条件熵:熵表示随机变量不确定性的度量。设计随机变量X为有限离散随机变量,且pi=P(X=xi)。熵的定义为H(X)=?∑ni=1pilog(pi)。熵越大,随机变量的不确定性就越大,当X取某个离散值时概率为1时,则对应的熵H(X)为0,表示随机变量没有不确定性。条件熵:表示已知随机变量X的条件下随机变量Y的不确定性,定义H(Y|X)=∑ni=1piH(Y|X=xi),其中pi=P(X=xi)。这里X表示某个特征,即表示根据某个特征划分后,数据Y的熵。如果某个特征有更强的分类能力,则条件熵H(Y|X)越小,表示不确定性越小。

信息增益:特征A对训练数据集D的信息增益定义为g(D,A)=H(D)-H(D|A).即有特征值A使得数据D的不确定性下降的程度。所以信息增益越大,表明特征具有更强的分类能力。

1.3信息增益比

信息增益比也是度量特征分类能力的方法。定义训练数据D关于特征A的值的熵HA(D)=?∑ni=1|Di||D|log2(|Di||D|),|D|表示训练数据的总数,|Di|表示训练数据D中特征A取第i个值的总数目。信息增益比越大,表明特征分类能力越强。

gR(D,A)=g(D,A)HA(D)

1.4基尼指数

假设随机变量X可以取K的离散值,p(X=k)=pk则X的基尼指数定义为:Gini(X)=∑Kk=pk(1-pk)=1-∑Kk=1-pk2.对于给定的样本集合D,其基尼指数为Gini(D)=1?∑Kk=1(|Ck||D|)2,|Ck|是D中属于第k类的样本个数,K是类的个数。基尼指数表示样本集合的不确定性程度,所以基尼指数越小,对应的特征分类能力越强

下图表示一个二分类的情况下,度量样本集合的不确定性程度几种方法。熵(Entropy),基尼指数(Gini),误差率的关系(Error rate).为了方便比较熵被缩小一半。

 

技术分享

2.决策树的生成

ID3与C4.5都是决策树的经典分类决策树算法。唯一不同的是ID3算法采用信息增益作为特征选择准则,而C4.5采用的是信息增益比的方法。下面介绍ID3决定树生成算法的过程,C4.5类似。

ID3算法

从根节点开始,在数据集D上计算所有可能的特征A分别计算信息增益,选择信息增益最大的特征作为分类条件,对该特征不同的取值分别建立子集作为子节点,最对子集递归地调用以上方法。直到没有特征可以选择或者信息增益很小为止。

下面的代码来自《机器学习实战》

[java] view plain copy
 
  1. <span style="background-color:rgb(255,255,255)"><code class="hljs python">def createTree(dataSet, labels) :  
  2.      classList = [example[-1] for example in dataSet]    
  3.      if classList.count(classList[0] ) == len(classList) :#数据集全部属于同一个类别  
  4.           return classList[0] #返回这个类别,并作为叶子结点  
  5.      if len(dataSet[0]) == 1:  #没有特征可以选择  
  6.           return majorityCnt(classList)  #返回数目最多的类别,并作为叶子结点  
  7.      bestFeat = chooseBestFeatureToSplit(dataSet)  #选择信息增益最大的特征A  
  8.      bestFeatLabel = labels[bestFeat]  
  9.      myTree = {bestFeatLabel : {}}#建立结点  
  10.      del (labels[bestFeat])   #特征集中去除特征A  
  11.      featValues = [example[bestFeat] for example in dataSet] #特征A下的所有可能的取值  
  12.      uniqueVals = set(featValues)#去重  
  13.      for value in uniqueVals:    #对可能取值分别建立子树  
  14.           subLabels = labels[ : ]      
  15.           myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), subLabels)#递归建立子树  
  16.      return myTree</code></span>  

3.决策树剪枝

不考虑复杂度的情况下,一个完全生长树很容易过拟合,对训练数据拟合很好,但对预测数据效果很差。因此要对生成的决策树做修剪,剪掉一些不必要的branch.可以通过增加正则项来控制决策树的复杂度。定义Cα(T)表示决策树的损失,C(T)表示模型对训练数据的预测误差。|T|表示模型的复杂度,即叶子节点的数目。

Cα(T)=C(T)+α|T|

参数α权衡训练误差与模型复杂度。

(1)计算每个节点的经验熵

(2)递归地从树的叶节点向上回溯,计算叶节点回溯到父节点之前与之后的损失Cα(TB)与Cα(TA),如果Cα(TA),代表修剪此节点后,损失函数更小,则进行剪枝。

(3)返回(2),直到不能继续为止。

4.CART算法

CART(Classification and regression tree)算法一种即能做分类又能做分类的决策树算法。

特征选择

回归树采用平方误差最小化准则:数据集D的平方误差定义为∑|D|i=1(yi?y′)2,其中y′表示数据集D的平均值。

分类树选择基尼指数最小化准则。

CART树生成

回归树的生成

(1)考虑数据集D上的所有特征,遍历每一个特征下所有可能的取值或者切分点,对数据集D划分成两部分D1和D2

(2)分别计算上述两个子集的平方误差和,选择最小的平方误差对应的特征与分割点,生成两个子节点。

(3)对上述两个子节点递归调用(1)(2),直到没有特征可以选择,或者子节点数目很小或者平方误差小于阈值为止,作为叶子节点,并返回节点内样本的均值(也可以在叶子节点内训练回归模型作为预测值)。

分类树的生成

(1)考虑数据集D上的所有特征,遍历每一个特征下所有可能的取值或者切分点,对数据集D划分成两部分D1和D2

(2)分别计算上述两个子集的基尼指数的和,选择最小的基尼指数的和对应的特征与分割点,生成两个子节点。

(3)对上述两个子节点递归调用(1)(2),直到没有特征可以选择,或者子节点数目小于阈值或者基尼指数小于阈值为止,作为叶子节点,并返回类别数目最多的类别。

CART的剪枝

CART的剪枝算法,从决策树T0的底端不断剪枝,直到根节点。计算完全生长树的内部的每一个结点t的剪枝系数g(t),剪枝系数代表修剪后整体损失减小的程度,即修剪前与修剪后的数据的误差下降的程度。在T0中剪去最小的g(t),得到的子树作为T1,如此剪下去,直到根节点。利用独立的验证集,测试子树序列T0,T1,T2...,Tn每个子树的平方误差或者基尼指数。数值最小的决策树作为最优的决策树。

5.随机森林

最简单的RF(Random Forest)算法是bagging+完全生长CART树的组合。

通过bagging方法是建立多个分类或者回归模型,最后采用投票或平均作为预测值,可以降低过拟合。

 

技术分享

 

bagging对训练样本采用boostrap采样方法进行M轮,分别建立决策树。由于每轮采用出的样本子集基本不相同,训练的模型相关性会降低小。为了进一步降低模型间的相关性,每轮训练前可以对训练数据的特征进行随机采样,也可以在决策树的每个branch上进行随机特征选择。

 

以上是关于决策树与随机森林的主要内容,如果未能解决你的问题,请参考以下文章

决策树与随机森林

初始决策树与随机森林

08 决策树与随机森林

web安全之机器学习入门——3.2 决策树与随机森林算法

机器学习:通俗易懂决策树与随机森林及代码实践

决策树与随机森林