zoukankan      html  css  js  c++  java
  • 第五章-一起看决策树如何做出决策?

    在前面我们学习了KNN是一种基本的分类和回归方法。今天我们继续来学习另一个也能进行分类和回归的方法——决策树(Decision Tree)。那么对此,决策树到底是如何做出决策的呢?请接下来往下看——

    思维导图(内容概览)

    衡量标准

    对于一个统计学习方法,我们需要从模型+决策+算法逐步入手。但是在认识模型之前,特征的选取又是显得特别重要,在决策树法中,存在一些比较重要的概念,即选取特征的标准

    • 评估离散程度常用的有方差、熵、基尼指数

      • 方差:适用于连续随机变量,数值有实际意义。
      • :适用于离散随机变量,数值没有实际意义。
      • 基尼指数:适用于离散随机变量,数值没有实际意义。
    • :用于表示随机变量的不确定(混乱)程度,记作

      [H(X) = -sum_{i=1}^n p_i log p_i ]

    • 条件熵:在一直随机变量X的条件下,随机变量Y的不确定性(混乱程度)记作

      [H(Y|X) = sum_{i=1}^np_iH(Y|X=x_i) ]

    • 信息增益:在得知特征X的信息而使得类Y的信息的不确定性减少程度,记作

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

    • 信息增益比

      • 信息增益的缺陷:偏向于选择取值较多的特征。

      • 概念:对于A特征的信息增益比,就是信息增益与训练数据集关于特征A的熵之比,记作

        [g_r(D, A) = frac{g(D, A)}{H_A(D)} ]

    • 基尼指数(K为类别数量,Pk为属于k类的概率)定义为:

      [Gini(p) = sum_{k=1}^Kp_k(1-p_k) = 1 - sum_{k=1}^Kp^2_k ]

    • 在特征A的条件下,集合D的基尼指数定义为

    [Gini(D, A) = frac{|D_1|}{D}Gini(D_1) + frac{D_2}{D}Gini(D_2) ]

    决策树模型

    定义:分类决策树模型是一种描述对实例进行分类的树形结构。决策树由节点和有向边组成,结点有两种类型:内部结点和叶结点。内部结点表示一个特征或属性,叶结点表示一个类。用决策树分类,从根结点开始,对实例的某一个特征进行测试,根据测试结果,将实例分配到其子结点;这时,每一个子结点对应着该特征的一个取值。如此递归下去,直至到达叶结点。最后将所有实例进行分类

    决策树模型示意图:

    损失函数和剪枝(Pruning)策略

    在决策模型中,会存在一个很重要的步骤,那就是剪枝,剪枝能决定最后的决策树的样子。

    当遇到一系列的连续值,这是该怎么办?此时需要将连续值进行离散化,也即是需要选取连续值的分界点

    • 剪枝的原因:决策树的过拟合风险过大时,每个叶子节点就分成了一个数据,结果不太如意。
    • 剪枝策略:预剪枝,后剪枝。
      • 预剪枝:边建立决策树边进行剪枝的操作(更加实用),比如在选择若干个特征进行先构造决策树。限制深度,叶子节点个数、叶子样本点数、信息增益量等;
      • 后剪枝:边建立完决策树后进行剪枝操作。通过一定的衡量标准,叶子节点越多,损失越大。

    DT模型是以极小化决策树的整体损失函数或代价函数,可定义如下:

    [C_alpha(T) = C(T) + alpha * |T_(leaf)| ]

    • 前半部分表示对训练数据的拟合程度。
    • 后半部分表现模型复杂程度。
    • 用于对树规模的惩罚程度,取值为0是表示只考虑模型与训练数据的拟合程度,不考虑模型复杂度,取值正无穷时则刚好相反。

    决策树的生成算法

    • 如何切分特征

      • 根节点的选择应该用哪一个特征?该如何切分?
      • 根节点的目标是通过一种衡量标准,来计算通过不同特征进行分支选择后的分类的情况,找出最好的那个作为根节点,以此类推。
    • 类别:每一种算法不同,衡量标准也不相同。

      • **ID3算法:信息增益 **

      • C4.5:信息增益率(解决了ID3的问题,考虑自身的熵)

      • CART:使用GINI系数作为衡量标准

      • GINI系数

        [G_{ini}(p) = sum_{k=1}^k{p_k(1-p_k)} = 1-sum_{k=1}^Kp_k^2 ]

    ID3算法

    ID3算法的核心是在决策树各个节点上运用信息增益准则选择特征,递归构建决策树

    算法描述:

    [输入:训练数据集D,特征集A,阈值varepsilon;\ 输出:决策树T.\ (1) 若D中所有实例属于同一个类C_K,则T为单节点树,并将C_K作为该节点的类标记,返回T;\ (2) 若A=phi,则T为单节点树,并将D中实例数最大的类C_K作为该节点的类标记,返回T.\ (3) 否则,计算A中特征对D的信息增益,选择信息增益最大的特征A_g;\ (4) 如果A_g的信息增益小于阈值varepsilon,则置T为单节点树,并将D中实例中最大的类作为该节点的类标记,返回T;\ (5) 否则,对A_g每一个可能值a_i,依A_g=a_i将D分割为若干个非空子集D_i,将D_i中实例数最大的类为该节点的标记,\构建子节点,由结点以及子节点构成树T,返回T;\ (6) 对第i个子节点,以D_i为训练集,以A-{A_g}为特征集,递归地调用(1)~(5),得到子树T_i,返回T。 ]

    C4.5算法

    C4.5算法和ID3算法相似,并对ID3算法做了改进。其核心是采用信息增益比来选取特征。

    [输入:训练数据集D,特征集A,阈值varepsilon;\ 输出:决策树T.\ (1) 若D中所有实例属于同一个类C_K,则T为单节点树,并将C_K作为该节点的类标记,返回T;\ (2) 若A=phi,则T为单节点树,并将D中实例数最大的类C_K作为该节点的类标记,返回T.\ (3) 否则,计算A中特征对D的信息增益比,选择信息增益比最大的特征A_g;\ (4) 如果A_g的信息增益小于阈值varepsilon,则置T为单节点树,并将D中实例中最大的类作为该节点的类标记,返回T;\ (5) 否则,对A_g每一个可能值a_i,依A_g=a_i将D分割为若干个非空子集D_i,将D_i中实例数最大的类为该节点的标记,\构建子节点,由结点以及子节点构成树T,返回T;\ (6) 对第i个子节点,以D_i为训练集,以A-{A_g}为特征集,递归地调用(1)~(5),得到子树T_i,返回T。 ]

    CART算法

    CART算法包含两步:决策树生成和决策树剪枝

    CART生成

    决策树生成就是递归构建二叉决策树的过程。对回归树使用平方误差最小化准则,对分类书用基尼指数(GINI INDEX)组笑话准则,进行特征选择,生成二叉树。

    1. 回归树的生成

      通常使用最小二乘回归树生成算法进行生成回归树。

      [输入:训练数据集D;\ 输出:回归树f(x).\ 在训练集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建决策树:\ (1) 选择最优的切分变量j与切分点s,求解 \ min_{j,s}[min_{c_j}sum_{x_jin R_1(j,s)}(y_i-c_i)^2+min_{c_j}sum_{x_jin R_2(j,s)}(y_i-c_i)^2],遍历j,对j的切分点s,选择最小的(j,s);\ (2) 用选定的对(j,s)划分区域并决定相应的输出值:\ R_1(j,s)={x|s(j) leq s},R_2(j,s)={x|s(j) > s} hat{c_m}=frac{1}{N_m}sum{y_i},xin R_m,m=1,2 \ (3) 继续对两个子区域调用步骤(1),(2),直至满足条件;\ (4)将输入空间划分成M个区域R_1,R_2,R_3...R_M,生成决策树。\ f(x)=sum^M_{m=1}hat{c_m}I(xin R_m) ]

    2. 分类树的生成

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

      CART生成算法描述:

      [输入:训练数据集D,停止计算的条件;\ 输出:CART决策树.\ 根据训练数据集,从根结点开始,递归地对每一个结点进行如下操作,构建决策树:\ (1)设结点地训练集为D,计算现有特征对该数据集的基尼指数。此时,对每一个特征A,对可能取得每一个值a,\ 根据样本点对A=a得测试为"是"或"否"将D分割成D_1和D_2,计算A=a得基尼指数。\ (2)在所有可能得特征A和可能得切分点a中,选择最小的基尼指数得特征以及对应的切分点。\ 由此,从现结点生成两个子结点,将训练集依特征分配到两个子结点中去。\ (3)对两个子节点递归调用(1),(2),直至满足条件;\ (4) 生成CART决策树。 ]

  • 相关阅读:
    Node.js中exports与module.exports的区别
    Node js : Best way to define entity class
    使用 mongodb 的 Docker Image 快速上手系列 lab
    CreateFont函数为什么改变不了字体?该怎么解决
    docker service ps打印出来的错误信息被截断了怎么办?
    Docker for windows可用性检查
    Express application generator的使用
    Docker: 如何将node.js的项目部署到docker的swarm上面去
    Docker worker nodes shown as “Down” after re-start
    Docker创建虚机和swarm
  • 原文地址:https://www.cnblogs.com/cecilia-2019/p/11336852.html
Copyright © 2011-2022 走看看