• 决策树基础


    决策树的学习分三步:特征选择、决策树生成和决策树剪枝

    一、特征选择

      特征选择可以用的指标有:信息增益、信息增益率和基尼指数

      首先要了解什么是信息熵。设样本为D,共有n个类,样本中第k类样本占的比例为pk(k = 1,2,.....,n),那么D的信息熵为

    H(D) = - Σnk=1 pk log2pk

      信息熵反应D的“纯度”,值越小纯度越高。

      另外还要了解条件熵。设特征A有V个取值,用A对D进行划分,每个取值上样本集记为Dv(v = 1,2,....,V),那么条件熵H(D|A)为

    H(D|A) = ΣVv=1 |Dv| H(Dv) / |D| 

      1、信息增益,又叫做互信息

    g(D,A) = H(D) - H(D|A)

      信息增益表明使用特征A进行划分,可以使“纯度提升多少”。值越大,“纯度提升”越多。

    但是信息增益倾向于选择取值较多的特征,比如:有10个样本,特征A有10个取值,每个取值有一个样本,这时分支节点的纯度达到最大,相应的信息增益最大,利用信息增益对特征进行选择,结果更可能选择这样的特征A。但这样的特征无法对新样本进行有效的预测。

    2、信息增益率

    使用信息增益率,可以对信息增益的这一问题进行校正。

    g_ratio(D,A) = g(D,A)/h(A)

    其中h(A) = - ΣVv=1 (|Dv|/|D|)  log2(|Dv|/|D|)

    需要注意的是,增益率对可取值较少的特征有偏好,所以C4.5算法并不是直接选择增益率最大的特征进行划分,而是先从候选属性中找出信息增益高于平均水平的属性,再从中选择信息增益率最高的。

    3、基尼指数

    Gini(D) = 1-Σnk=1 pk2

    Gini_index(D,A) = ΣVv=1 |Dv| Gini(Dv) / |D| 

    基尼指数越小越越有利于划分。

    二、决策树生成

    决策树生成算法比较著名的就是ID3、C4.5以及CART了。其中ID3主要用到特征选择的方法是信息增益、C4.5是信息增益率、CART是基尼指数。

    基本算法

    ——————————————————————————————————————————————————————————————

    输入:训练集D = {(x1,y1),......,(xm,ym)}

          属性集A = {A1,......Ad}

    过程:TreeGenerate(D,A)

    生成节点node;
    if D中样本全属于同一类别C:
        将node标记为C类叶节点
        return 
    if A == 空集 or D中样本在A上的取值相同:
        将node标记为叶节点,其类别标记为D中样本数最多的类
        return
    从A中选择最优划分属性A*  #使用不同的特征选择方法将得到不同的算法
    
    for A*的每个取值a:
        为node生成一个分支;令Da为D中在A*上取值为a的样本子集
        if Da为空:
            将分支节点标记为叶节点,其类别标记为D中样本最多的类
            return
        else:
            以TreeGenerate(Da,A{A*})为分支节点
    

    三、决策树剪枝

      剪枝是决策是学习算法对付“过拟合”的主要手段。下面主要记录两种方法。

      1、简单方法(见周志华《机器学习》)

    从训练集中留出一部分作为验证集,利用余下的数据生成一棵完整的决策树,再自底向上对每一个非叶节点进行:将以该节点为根节点的树杈剪掉,即将该节点替换成叶节点,类标记为样本数最多的类。计算替换前与替换后的验证集精度,如果替换前比替换后验证集精度大,则不剪枝。

    2、复杂方法(见李航《统计学习方法》)

      先定义一个决策树学习的损失函数:

      设树T有|T|个叶节点,叶节点t上的样本数记为Nt,其中k类的样本的有Ntk个(k = 1,2,...,n),Ht(T)为叶节点t上的熵,损失函数

    Cα(T) = Σ|T|t=1 Nt Ht(T) +α|T|

      损失函数的前一项记为C(T),表示模型对训练数据的预测误差(为什么可以表示预测误差,个人理解:熵表示“纯度”也表示“混乱度”,值越大纯度越低,比如t包括三个白球和三个黑球的熵比六个白球的大,三个白球和三个黑球的t节点的类标不管是白还是黑都有三个被分错,而六个白球都不会被分错)。

      损失函数的后一项|T|表示模型复杂度(树的叶节点越多树越庞大,相应的越复杂),α≥0可以权衡模型复杂度和训练误差(树越大,训练误差越小,但|T|越大。α越大倾向于寻找复杂度低,训练误差也相对较低的树,α=0意味着只考虑模型与训练数据的拟合程度,不考虑模型复杂度)

      剪枝,就是在α确定时,选择损失函数最小的模型。


    剪枝算法

    输入:生成的树T,参数α

    输出:修剪后的子数Tα

    (1)计算每个节点的熵

    (2)递归地从树的叶节点向上回缩。设一组叶节点回缩到其父节点前后的整棵树记为TA,TB,其对应的损失函数值分别为Cα(TA),Cα(TB),如果Cα(TA) ≤ Cα(TB),则进行剪枝,并将父节点变为新的叶节点。

    (3)返回(2),直到不能继续为止,得到损失函数最小的子数Tα


     

     α的确定

    自动确定α算法


    输入:生成的树T0

    输出:最优决策树Tα

    (1)设k = 0,T = T0

    (2)设α = +∞

    (3)自下而上地对每个内部结点t计算C(Tt),|T|以及

    g(t) = [C(t) - C(Tt)] / [|Tt| - 1]

    α = min(α,g(t))

      其中Tt表示以t为根节点的子树,C(Tt)是对训练数据的预测误差,|Tt|是Tt的叶节点个数。

    (4)对g(t) = α的内结点t进行剪枝,并对叶结点t以多数表决法决定其类,得到树T。

    (5)k = k+1,αk=α,Tk = T.

    (6)如果Tk不是由根节点及两个叶节点构成的树,则返回步骤(3);否则令Tk = Tn.

    (7)采用交叉验证法在子树序列T0,......,Tn中选取最优子树Tα

     


     具体为什么这样做就能选择比较好的α和最优树,以及怎么做交叉检验选取最优树,在李航《统计学习基础》上,贴个图吧

    四、关于连续性特征的划分方法,见周志华《机器学习》和李航《统计学习方法》。虽然都是书上搬过来的,码字也很累。。。。写到这吧

  • 相关阅读:
    通过json动态创建控制器
    记一次bug解决!改变思路解决问题的同时,还需要弄明白是什么原因。
    __proto__,prototype,constructor
    事件:compositionstart & compositionend,解决oninput获取到拼音的问题。
    事件绑定----阻止冒泡失效
    预装的win10系统如何恢复
    rem.js
    vscode 使用 github仓库
    nginx使用
    伸缩盒
  • 原文地址:https://www.cnblogs.com/miranda-zxh/p/7458656.html
Copyright © 2020-2023  润新知