zoukankan      html  css  js  c++  java
  • 决策树

    1.基本流程##

    一棵决策树包含一个根结点、若干个内部结点和若干个叶结点;叶结点对应决策结果,其他每个节点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到字节点中;根结点包含样本全集。从根结点到每个叶结点的路径对应了一个判定测试序列。决策树学习的目的是为了产生一个泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循"分而治之"策略。

    决策树学习基本算法


    输入:

    训练集 D = {(x1,y1),(x2,y2),....(xm,ym)}

    属性集A = {a1,a2,...ad}

    过程:

    函数TreeGenerate(D,A)

    生成结点Node;
    if D中样本全属于同一级别C then
        将node标记为C类叶结点;  ---递归返回,情形(1)
        return;
    end if
    if 属性集合A为空 或者 D中样本在A上取值相同 then
        将node标记为叶结点,其类别标记为D中样本数最多的类; ---递归返回,情形(2)
        return;
    end if
    从A中选择最优划分属性a;  ---在第二部分讨论如何获得最优划分属性
    for a 的每一个值 a' do
        为node生成一个分支;
        另Dv表示D中在a上取值为a’的样本子集;
        if Dv为空 then
            将分支结点标记为叶结点,其类别标记为D中样本最多的类; ---递归返回,情形(3)
            return;
         else
            以TreeGenerate(D,A-a)为分支结点; ---从A中去掉属性a
         end if
    end for
    

    输出: 以node为根结点的一棵决策树


    决策树的生成是一个递归过程,在决策树基本算法中,有三种情形会导致递归返回:(1)当前节点包含的样本全部属于同一类别,无需 划分;(2)当前属性集为空,或是所有样本在所有属性上取值相同,无法 划分;(3)当前节点包含的样本集合为空,不能 划分;

    在第(2)种情形下,我们把当前结点标记为叶结点,并将其类别设定为该结点中所含样本最多的类别,利用的当前结点的后验分布;

    在第(3)种情形下,同样把当前结点标记为叶结点,但将其类别设定为其父结点所含样本最多的类别,把父结点的样本分布作为当前结点的先验分布;

    2.划分选择##

    1.信息增益

    信息熵是度量样本集合纯度最常用的一种指标,假定当前样本集合D中第k类样本所占的比例为pk,则D的信息熵定义如下,

    (Ent(D)=-sum_{k=1}^{|y|}p_{k} * log_{2}(p_{k})) (公式1)

    假定离散属性a有V个可能的取值,{a1,a2,...aV},使用属性a对样本集合D进行划分,会产生V个分支结点,其中第v个分支结点包含了D中所有再属性a上取值为av的样本,记为Dv,属性a对样本集合D进行划分所得的"信息增益"为,

    (Gain(D,a) = Ent(D) - sum_{v=1}^{V}frac{|D_{v}|}{|D|} * Ent(D^{v})) (公式2)

    一般而言,信息增益越大越大,说明使用属性a进行划分所获得的"纯度提升"越大,因此,我们可以用信息增益来进行决策树的划分属性选择,如下所示,

    (a* = argmax G(D,a),ain A) (公式3)

    ID3 决策树算法以信息增益为准则来选择划分属性。

    2.信息增益率

    实际上,信息增益准则对于可取值数目较多的属性有所偏好,为了减少这种偏好可能带来的不利影响,C4.5决策树算法没有直接使用信息增益,而是使用"增益率"来选择最有划分属性。

    (GainRatio(D,a) = frac{Gain(D,a)}{IV(a)})

    其中,(IV(a) = -sum_{v=1}^{V}frac{|D^{v}|}{|D|} * log_{2}frac{|D^{v}|}{|D|})

    信息增益率对可取值数目较少的属性有所偏好,因此C4.5算法使用了启发式方法,先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择信息增益率高的属性。

    3,.基尼指数

    CART决策树使用"基尼指数"来选择划分属性。

    数据集合D的纯度可用基尼值来度量,

    (Gini(D) = sum_{k=1}^{|y|}sum_{k^{'} e k}p_{k}p_{k^{'}} = 1 - sum_{k=1}^{|y|}p^{2}_{k})

    Gini(D)返回应了从数据集D中随机抽取两个样本,其类别标记不一致的概率,Gini(D)越小,则数据集合D的纯度越高。

    属性a的基尼指数定义为,

    (GiniIndex(D,a) = sum_{v=1}^{V}frac{|D^{v}|}{|D|} * Gini(D^{v}))

    3.减枝处理##

    决策树减枝的基本策略有"预减枝"和"后减枝"。

    预减枝是指再决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。

    后减枝则是先从训练集上生成一棵完整的决策树,然后自底向上对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则减该子树替换为叶结点。

    1.预减枝

    优点: 预减枝使得决策树的很多分支没有"展开",这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。

    缺陷: 有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却又可能导致性能显著提高;预减枝基于"贪心"本质禁止了这些分支展开,给预减枝决策树带来了欠拟合的风险。

    2.后减枝

    优点: 后减枝决策树通常比预减枝决策树保留了更多的分支,一般情形下,后减枝决策树的欠拟合风险很小,泛化性能往往优于预减枝决策树。

    缺陷: 后减枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未减枝决策树和预减枝决策树都要大得多。

    4.连续与缺失值##

    1.连续值处理

    C4.5 决策树采用二分法对连续属性进行处理。

    2.缺失值处理

    两个问题:

    (1) 如何在属性值缺失的情况下进行划分属性选择?

    (2) 给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?

    问题(1),可以根据样本集合D中在属性a上没有缺失值的样本子集来判断属性a的优劣;

    问题(2),若样本在划分属性上的取值已知,则将样本划入与其取值对应的子结点;若样本在划分属性上的取值未知,则将样本同时划入所有子结点;

  • 相关阅读:
    服务器(Ubuntu 12.04 LTS)上编译基于OpenCV的项目遇到的问题及解决方案
    ubuntu 16.04 LTS 降级安装gcc 4.8
    C#程序中获取电脑硬件配置信息的一种方法
    C#程序将对象保存为json文件的方法
    C#中运用事件实现异步调用
    Redis实现分布式锁 php
    CI框架整合UEditor编辑器上传功能
    PHP给图片加水印具体实现
    检测网站是否被和谐!
    vue的双向绑定和依赖收集
  • 原文地址:https://www.cnblogs.com/zhbzz2007/p/5631098.html
Copyright © 2011-2022 走看看