• 决策树与随机森林算法


    决策树

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

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

    这里写图片描述

    决策树模型学习过程通常包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上进行随机特征选择。

     

  • 相关阅读:
    CSP -- 运营商内容劫持(广告)的终结者
    vue学习:解决Apycharm的 * is only available in ES6(use 'esversion: 6') 问题
    nvm、node、npm安装以及pycharm配置eslint
    python中的daemon守护进程实现方法
    python语言基础问题汇总
    python -- DNS处理模块dnspython
    Python ping 模块
    如何把Python脚本导出为exe程序
    从实际案例聊聊Java应用的GC优化
    Python类(六)-静态方法、类方法、属性方法
  • 原文地址:https://www.cnblogs.com/hellochennan/p/6654097.html
Copyright © 2020-2023  润新知