数据挖掘-决策树 Decision tree

数据挖掘-决策树 Decision tree

目录

  • 数据挖掘-决策树 Decision tree

    • 1. 决策树概述

      • 1.1 决策树介绍

        • 1.1.1 决策树定义
        • 1.1.2 本质
        • 1.1.3 决策树的组成
        • 1.1.4 决策树的分类
        • 1.1.5 决策过程
      • 1.2 决策树的优化
        • 1.2.1 过拟合
      • 1.3.1 剪枝
    • 2. 理论基础
      • 2.1 香农理论

        • 2.1.1 信息量
        • 2.1.2 平均信息量/信息熵
        • 2.1.3 条件熵
        • 2.1.4 信息增益(Information gain)
        • 2.1.5 信息增益率 (Information Gain Ratio)
        • 2.1.6 基尼系数
    • 3. 决策树算法
      • 3.1 ID3算法

        • 3.1.1 ID3算法简述
        • 3.1.2 熵值对决策的影响
        • 3.1.3 算法思想
        • 3.1.4 递归返回条件
        • 3.1.5 算法步骤
        • 3.1.6 ID3算法缺点
      • 3.2 C 4.5 算法
        • 3.2.1 为什么采用C 4.5 算法?
        • 3.2.2 C4.5对以上缺点的改进
        • 3.2.3 算法思想
        • 3.2.4 算法步骤
        • 3.2.6 决策树C4.5算法的不足与改进
      • 3.3 CART分类/回归树
        • 3.3.1 为什么引入CART分类/回归树
        • 3.3.2 结点选择标准
        • 3.3.3 CART分类树算法对连续特征和离散特征的处理
        • 3.3.4 CART分类树算法思想
        • 3.3.6 CART剪枝
    • 4. 总结
      • 4.1 三种算法比较

        • 4.1.1 三种算法对比表格

1. 决策树概述

1.1 决策树介绍

1.1.1 决策树定义

  • 决策树是一种典型的分类方法
  • 首先对数据进行处理利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析
    • 例:根据外面环境决定是否外出,构建决策树,利用条件进行判断

1.1.2 本质

  • 本质上决策树是通过一系列规则对数据进行分类的过程

1.1.3 决策树的组成

  1. 根节点:最顶部的决策点
  2. 决策结点:(非叶子节点) 决策结点代表一个问题或者决策.通常对应待分类对象的属性
  3. 分支: 测试的结果
  4. 叶子节点: 就是树最底部的节点,也就是决策结果

1.1.4 决策树的分类

(1)分类树

  • 分类树使用信息增益或增益比率或其它方式来划分节点,根据每个节点样本的类别情况投票决定测试样本的类别(输出为离散值)

(2)回归树(regression tree)

  • 回归树(regression tree),顾名思义,就是用树模型做回归问题,每一片叶子都输出一个预测值(连续值)。预测值一般是该片叶子所含训练集元素输出的均值

1.1.5 决策过程

  1. 在沿着决策树从上到下的遍历过程中,在每个结点都有一个测试。
  2. 对每个结点上问题的不同测试输出导致不同的分枝,最后会达到一个叶子结点。
  3. 这一过程就是利用决策树进行分类的过程,利用若干个变量来判断属性的类别

1.2 决策树的优化

1.2.1 过拟合

  • 算法生成的决策树非常详细并且庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的。因此用这个决策树来对训练样本进行分类的话,你会发现对于训练样本而言,这个树表现完好,误差率极低且能够正确得对训练样本集中的样本进行分类。训练样本中的错误数据也会被决策树学习,成为决策树的部分,但是对于测试数据的表现就没有想象的那么好,或者极差,这就是所谓的过拟合(Overfitting)问题

1.3.1 剪枝

1. 剪枝原因

  • 当训练数据量大、特征数量较多时构建的决策树可能很庞大,这样的决策树用来分类是否好?答案是否定的。
  • 决策树是依据训练集进行构建的,当决策树过于庞大时,可能对训练集依赖过多,也就是对训练数据过度拟合。从训练数据集上看,拟合效果很好,但对于测试数据集或者新的实例来说,并不一定能够准确预测出其结果。
  • 因此,对于决策树的构建还需要最后一步----即决策树的修剪

2. 预剪枝(Pre-Pruning)

(1)什么是预剪枝

  • 在构造决策树的同时进行剪枝。

(2)思想

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

(3)过程

  • 所有决策树的构建方法,都是在无法进一步降低熵的情况下才会停止创建分支的过程,为了避免过拟合,可以设定一个阈值,熵减小的数量小于这个阈值,即使还可以继续降低熵,也停止继续创建分支
  • 这种方法实际中的效果并不好

3. 后剪枝(Post-Pruning)

(1)什么是后剪枝?

  • 后剪枝是在决策树生长完成之后,对树进行剪枝,得到简化版的决策树。

(2)过程

  • 后剪枝的剪枝过程是删除一些子树,然后用其叶子节点代替,这个叶子节点所标识的类别通过大多数原则(majority class criterion)确定。所谓大多数原则,是指剪枝过程中, 将一些子树删除而用叶节点代替,这个叶节点所标识的类别用这棵子树中大多数训练样本所属的类别来标识,所标识的类称为majority class,剪枝的过程是

    • 对拥有同样父节点的一组节点进行检查,判断如果将其合并,熵的增加量是否小于某一阈值。
    • 如果确实小,则这一组节点可以合并一个节点,其中包含了所有可能的结果。
  • 后剪枝是目前最普遍的做法

4. 两种方式比较

  • 后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情况下,后剪枝决策树欠拟合的风险很小,其泛化能力往往优于预剪枝预测数。 但由于其是基于创建完决策树之后,再对决策树进行自底向上地剪枝判断,因此训练时间开销会比预剪枝或者不剪枝决策树要大

2. 理论基础

2.1 香农理论

2.1.1 信息量

(1)信息量定义

  • 假设事件\(a_i\)的发生概率为\(p(a_i)\),则事件ai的所含有或所提供的信息量\(I(a_i)\)为:

    \[I(a_i)=-log_2{p(a_i)}?
    \]

  • 从直觉上讲,小概率事件比大概率事件包含的信息量大。
    • 如果某件事情是“百年一见”则肯定比“习以为常”的事件包含的信息量大。端案例就是“太阳从东方升起”,因为为确定事件,所以不携带任何信息量。

2.1.2 平均信息量/信息熵

(1)信息熵定义

  • 信息量度量的是一个具体事件发生所带来的信息,而熵则是在结果出来之前对可能产生的信息量的期望——考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望
  • 熵是度量样本集合纯度最常用的一种指标,它是信息的期望值,即 信息熵 = 平均信息量(信息量的期望)

    \[Ent(D)=H(X)=-\sum_{k=1}^N{p(k)\log_2{p(k)}}
    \]

(2)平均信息量

  • 假设有n个互不相容的事件\(a_1,a_2,a_3,….,a_n\),它们中有且仅有一个发生,则其平均的信息量可如下度量:

    \[I(a_1,a_2,...,a_n)=E[I(a_i)]=-\sum_{i=1}^N{p(a_i)\log_2{p(a_i)}}
    \]

    • 上式,对数底数可以为任何数,不同的取值对应了熵的不同单位。通常取2,
    • 规定当\(p(a_i)=0\)时:\(I(a_i) = 0\)
      • 例假设有一个数据集合D,其中只有两个类,一个是正例类,一个是负例类

        计算D中正例类和负例类在三种不同的组分下熵的变化情况。

        1. D中包含有50%的正例和50%的负例:\(Entropy(D)=-0.5log_20.5-0.5log_20.5=1\)
        2. D中包含有20%的正例和80%的负例:\(Entropy(D)=-0.2log_20.2-0.8log_20.8=0.722\)
        3. D中包含有100%的正例和0%的负例。\(Entropy(D)=-1log_21-0log_20=0\)

2.1.3 条件熵

(1)定义

  • 条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性。随机变量X给定的条件下随机变量Y的条件熵H(Y|X)

\[H(Y|X)=\sum_{x\in{X}}p(x)H(Y|X=x)
\]

(2)公式推导

\[H(Y|X) = \sum_{x\in{X}}p(x)H(Y|X=x)=-\sum_{x\in{X}}p(x)\sum_{y\in{Y}}p(y|x)log_2p(y|x)= -\sum_{x\in{X}}\sum_{y\in{Y}}p(x,y)log_2p(y|x)
\]

2.1.4 信息增益(Information gain)

(1)信息增益定义

  • 特征 A 对训练数据集 D 的信息增益 $$Gain(D,A)$$ ,定义为集合 D 的经验熵(即为熵)与特征 A 给定条件下的经验条件熵$$

    Ent(D|A)$$之差,即:

\[Gain(D,A)=Ent(D)-Ent(D|A)
\]

  • 其中特征 A 将数据集划分为:$ D_1,D_2,...,D_v$,而经验条件熵为:

\[Ent(D|A) = \sum_{i=1}^v \frac{\left|D_i\right|}{\left|D\right|}Ent(D_i)
\]

2.1.5 信息增益率 (Information Gain Ratio)

(1)信息增益率定义

  • 对于样本集D中的离散属性A,为:

    \(增益率=\frac{增益}{数据集D以特征A作为随机变量的熵}\),即:

\[增益率 GR(D,A) = \frac{Gain(D,A)}{H_A(D)}=Gain(D,A)*SplitInfo(D,A)
\]

  • 之前是把集合类别作为随机变量,现在把某个特征作为随机变量,按照此特征的特征取值对集合D进行划分,计算熵\(H_A(D)\):

    \[H_A(D) = -\sum_{i=1}^n\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}
    \]

    • n为特征A的类别数
    • \(|D_i|\)为特征A的第i个取值对应的样本个数。
    • \(|D|\)为样本个数。
  • 分裂信息(Split information)也叫惩罚系数:

\[SplitInfo(D,A) = \frac{1}{H_A(D)}
\]

2.1.6 基尼系数

(1)基尼系数定义

  • 基尼指数Gini(D)表示集合D不确定性,基尼指数Gini(D,A=a)表示集合D经A=a分割后的不确定性(类似于熵),基尼指数越小,样本的不确定性越小(与熵类似)
  • 假设K个类别,第k个类别的概率为pk概率分布的基尼系数表达式:

\[Gini(P)=\sum_{k=1}^kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2
\]

  • 推导:

\[Gini(P) = \sum_{k=1}^kp_k(1-p_k)=\sum_{k=1}^k(p_k-p_k^2)=\sum_{k=1}^kp_k-\sum_{k=1}^kp_k^2=1-\sum_{k=1}^Kp_k^2
\]

  • 对于样本D,个数为\(|D|\),假设K个类别,第k个类别的数量为\(|C_k|\),则样本D的基尼系数表达式:

\[Gini(D) = 1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2
\]

(2)二分类问题

  • 如果是二分类问题,第一个样本输出概率为p,概率分布的基尼系数表达式为:

\[Gini(p)=2p(1-p)=1-p(1-p)
\]

  • 对于样本D,个数为|D|,根据特征A的某个值a,把D分成|D1|和|D2|,则在特征A的条件下,样本D的基尼系数表达式为

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

(3)使用基尼系数的优点

  • 比较基尼系数和熵模型的表达式,二次运算比对数简单很多。尤其是二分类问题,更加简单。

(4)熵模型的度量方式比,基尼系数对应的误差

  • 对于二分类

  • 基尼系数和熵之半的曲线非常接近,仅在45度角附近误差稍大。因此,基尼系数可以做为熵模型的一个近似替代。

3. 决策树算法

3.1 ID3算法

3.1.1 ID3算法简述

  • ID3算法主要针对属性选择问题。是决策树学习方法中最具影响和最为典型的算法。

3.1.2 熵值对决策的影响

  • 从上述的结果可以看到一个趋势,当数据变得越来越纯净时,熵的值变得

    越来越小。事实上可以证明,当正例(0.5),反例(0.5)时,熵取最大值。,即,熵越大,节点的信息量越多,越不纯;当

    D 中所有数据都只属于一个类时,熵得到最小值。

  • 信息增益大,代表着熵小,所以确定性较高
  • 显然,熵可以作为数据纯净度或混乱度的衡量指标。这正是决策树学习中需要的

3.1.3 算法思想

  • ID3算法递归地构建决策树,当选择某个特征作为节点时,我们就希望这个特征的信息熵越小越好,那么不确定性越小
  • 从根节点开始,对所有特征计算信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点;再对子节点递归地调用以上方法构建决策树
  • 知道所有特征的信息增益均很小或者没有特征可以选择为止, 最后得到一个决策树

3.1.4 递归返回条件

  1. 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分。(此时将所含样本最多的类别设置为该叶子节点类别)
  2. 熵小于阀值,熵的大小表示数据的复杂程度,当熵过小时,表示数据的纯度比较大,如果熵或者基尼值小于一定程度时,节点停止分裂
  3. 决策树的深度是所有叶子节点的最大深度,当深度到达指定的上限大小时,停止分裂

3.1.5 算法步骤

  • 输入:训练数据集 D ,特征集 A , 阈值 ? ;
  • 过程:函数 TreeGenerate(D,A) .
计算节点信息增益 Gain(D,a) :
节点a的熵: Ent(D,a)
节点D的熵: Ent(D)
节点信息增益: Gain(D,a)=Ent(D)?Ent(D,a)
生成节点node:
if D 中样本全属于同一类别 C then
    将node标记为 C 类叶节点;return
end if
if A=? OR D 中样本在 A 上取值相同 then
    将node标记为叶节点,期类别标记为 D 中样本数最多的类;return
end if
按照节点信息增益,从 A 中选择最优划分属性 a?
for a? 中的每一个值 ai? do
	为node生成一个分支;令 Di 表示 D 中在 a? 上取值为 ai? 的样本子集;
	if Di 为空,then
		将分支节点标记为叶节点,其类别标记为 D 中样本最多的类;return
	else
		以 TreeGenerate(Di,A/a?) 为分支节点
	end if
end for
  • 输出:以node为根节点的一棵决策树

3.1.6 ID3算法缺点

  • ID3没考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。
  • ID3用信息增益作为标准容易偏向取值较多的特征。然而在相同条件下,取值比较多的特征比取值少的特征信息增益大。
    • 比如一个变量A有2个值,各为1/2:

      • \(H(Y|A) = 0.5(-0.5log0.5-0.5log0.5)+0.5(-0.5log0.5-0.5log0.5)=0.693\)
    • 另一个变量B为3个值,各为1/3
      • \(H(Y|B)=3(1/3(-1/3log(1/3)+1/3(-1/3)log(1/3)+1/3(-1/3)log(1/3)))=0.610\)
    • 其实他们都是完全不确定的变量,但是取3个值比取2个值的信息增益大
    • 例如ID,编号等无用信息也可能会被作为标准
  • ID3算法没考虑缺失值问题。
  • 没考虑过拟合问题

3.2 C 4.5 算法

3.2.1 为什么采用C 4.5 算法?

(1)ID3算法缺点

  • 不能处理连续特征

    • 长度,密度等
  • 使用信息增益为标准偏向于取值较多的属性,容易造成过拟合缺失值处理的问题
    • 例:如果将身份证号作为一个属性,那么,其实每个人的身份证号都是不相同的,也就是说,有多少个人,就有多少种取值,它的取值很多吧,让我们继续看,如果用身份证号这个属性去划分原数据集D,那么,原数据集D中有多少个样本,就会被划分为多少个子集,每个子集只有一个人,这种极端情况下,因为一个人只可能属于一种类别,好人,或者坏人,那么此时每个子集的信息熵就是0了,就是说此时每个子集都特别纯,这样导致的结果是,信息增益计算出来的特别大,然后决策树会用身份证号这个属性来划分原数据集D,其实这种划分毫无意义。

3.2.2 C4.5对以上缺点的改进

(1)对于信息增益作为标准容易偏向于取值较多特征的问题

  • C4.5思路:

    引入一个信息增益比GR(Y,X),它是信息增益G(D,A)与特征熵HA(D)(也称分裂信息)(分裂信息(Split information)的倒数)的比

    • 特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益容易偏向于取值较多的特征的问题。

(2)对不能处理连续值特征问题

  • C4.5思路:将连续的特征离散化
  1. 将\(m\)个连续样本从小到大排列。(比如 m 个样本的连续特征A有 m 个,从小到大排列 \(a1,a2,......am\))
  2. 取相邻两样本值的平均数,会得\(m-1\)个划分点。
    • 其中第\(i\)个划分点$ t_i $表示为:

\[t_i=\frac{a_i+a_{i+1}}{2}
\]

  1. 对于这\(m-1\)个点,分别计算以该点作为二元分类点时的信息增益。选择信息增益最大的点作为该连续特征的二元离散分类点

    • (比如取到的增益最大的点为\(a_t\),则小于\(a_t\)的值为类别1,大于\(a_t\)的值为类别2,这样就做到了连续特征的离散化。
    • 注意的是,与离散属性不同,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。(即将符合该决策的数据进行下一次计算)
  2. 用信息增益比选择最佳划分。

注意

    • 因为若采用增益比,影响分裂点信息度量准确性,若某分界点恰好将连续特征分成数目相等的两部分时其抑制作用最大,而选择属性的时候才使用增益比,这个指标能选择出最佳分类特征。
    • 例:(贷款问题)
      收入/百 40 48 60 72 80 90
      贷款成功与否
      1. 可以证明这时候的切分点,只能出现在目标分类不同的相邻实例之间,即出现在(48,60)和(80,90)之间,这时候选取切分点$ s1=(48+60)/2=54$ 和 \(s2=(80+90)/2=85\)
      2. 只需按照s1分类算出s1作为分割点的增益值和按照s2分类算出s2作为分割点的增益值

        \(Gain(s1)=H(D)-{\frac{2}{6}[0]+\frac{4}{6}[-\frac{3}{4}log(\frac{3}{4})-\frac{1}{4}log(\frac{1}{4})]}=H(D)-0.541\)

        \(Gain(s2)=H(D)-{\frac{5}{6}[-\frac{2}{5}log(\frac{2}{5})-\frac{3}{5}log(\frac{3}{5})]+\frac{1}{6}[0]}=H(D)-0.809\)

      3. 比较大小,选出最大的增益值所代表的分割点,
      4. 选出最大的为s1后,利用s1=54就可以将收入分成小于54和大于54两类

(3)对于缺失值处理的问题

  • 赋上该属性最常见的值
  • 根据节点的样例上该属性值出现的情况赋一个概率,比如该节点上有10个样本,其中属性A的取值有6个为是,4个为否.那么对改节点上缺失的属性A,以0.6的概率设为是,0.4的概率设为否.
  • 丢弃有缺失值的样本
  • 需要解决的两个问题:
    • 在样本某些特征缺失的情况下选择划分的属性
    • 选定了划分属性,对于在该属性上缺失特征的样本的处理
  • 解决办法:
    • 对于第一个子问题,对于某一个有缺失特征值的特征A。C4.5的思路是将数据分成两部分,对每个样本设置一个权重(初始可以都为1),然后划分数据,一部分是有特征值A的数据D1,另一部分是没有特征A的数据D2. 然后对于没有缺失特征A的数据集D1来和对应的A特征的各个特征值一起计算加权重后的信息增益比,最后乘上一个系数,这个系数是无特征A缺失的样本加权后所占加权总样本的比例
    • 对于第二个子问题,可以将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配。比如缺失特征A的样本a之前权重为1,特征A有3个特征值A1,A2,A3。 3个特征值对应的无缺失A特征的样本个数为2,3,4.则a同时划分入A1,A2,A3。对应权重调节为2/9,3/9, 4/9

3.2.3 算法思想

  • 与ID3算法不同的是,选举决策结点时,计算信息增益率,选择最大的进行特征作为当前结点

3.2.4 算法步骤

  • 输入:训练数据集 D ,特征集 A , 阈值 ? ;
  • 过程:函数 TreeGenerate(D,A) .
计算节点信息增益比 Gainratio(D,a) :
节点a的熵: Ent(D,a)
节点D的熵: Ent(D)
节点信息增益: Gain(D,a)=Ent(D)?Ent(D,a)
节点固定值: IV(a)
节点信息增益比: Gainratio(D,a)=Gain(D,a)IV(a)
生成节点node:
if D 中样本全属于同一类别 C then
	将node标记为 C 类叶节点;return
end if
if A=? OR D 中样本在 A 上取值相同then
	将node标记为叶节点,期类别标记为 D 中样本数最多的类;return
end if
按照节点信息增益,从 A 中选择最优划分属性 a?
for a? 中的每一个值 ai? do
	为node生成一个分支;令 Di 表示 D 中在 a? 上取值为 ai? 的样本子集;
	if Di 为空,then
		将分支节点标记为叶节点,其类别标记为 D 中样本最多的类;return
	else
		以 TreeGenerate(Di,A/a?) 为分支节点
	end if
end for
  • 输出:以node为根节点的一棵决策树

3.2.6 决策树C4.5算法的不足与改进

  1. 决策树算法非常容易过拟合,因此对于生成的决策树要进行剪枝。C4.5的剪枝方法有优化的空间。思路主要是两种,一种是预剪枝,即在生成决策树的时候就决定是否剪枝。另一个是后剪枝,即先生成决策树,再通过交叉验证来剪枝。后面在下篇讲CART树的时候我们会专门讲决策树的减枝思路,主要采用的是后剪枝加上交叉验证选择最合适的决策树。
  2. C4.5生成的是多叉树,在计算机中二叉树模型会比多叉树运算效率高。多叉树改二叉树,可以提高效率。
  3. C4.5只能用于分类。
  4. C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化减少运算强度但又不牺牲太多准确性的话,因此用基尼系数代替熵模型

3.3 CART分类/回归树

3.3.1 为什么引入CART分类/回归树

  • 在决策树算法原理(ID3,C4.5)中,提到C4.5的不足,比如模型是用较为复杂的熵来度量,使用了相对较为复杂的多叉树,只能处理分类不能处理回归。
  • 对这些问题,CART(Classification And Regression Tree)做了改进,可以处理分类,也可以处理回归

3.3.2 结点选择标准

(1)对于分类树,使用平均基尼系数作为分类依据

  • 假设训练集为D,其中特征 A 将数据集划分为:\(D_1,D_2,...,D_n\)

    \[Gain(D,A)=\sum_{i\in{I}}p_iGini_i
    \]

    • 其中\(Gain_i\)为数据集为\(D_i\),即\(A = a_i\)时,的基尼值
    • 计算出的平均基尼系数越小越好

(2)对于回归树,使用方差作为分类依据

  • 条件同上

    \[Gain(D,A)=\sum_{i\in{I}}\sigma_i
    \]

    \[\sigma_i=\sqrt{\sum_{i\in{I}}(x_i-\mu)^2}=\sqrt{\sum_{i\in{I}}x_i^2-n\mu^2}
    \]

    • 其中σ为数据集为\(D_i\),即\(A=ai\)时的方差,\(u\)为平均值
    • 计算出的均方差之和越小越好,代表与正确数据的偏差越小

3.3.3 CART分类树算法对连续特征和离散特征的处理

(1)CART分类树算法对连续值的处理

  • 思想和C4.5相同,都是将连续的特征离散化。唯一区别在选择划分点时,C4.5是信息增益比,CART是基尼系数
  • 具体思路:m个样本的连续特征A有m个,从小到大排列\(a_1,a_2,......,a_m\),则CART取相邻两样本值的平均数做划分点,一共取m-1个,其中第i个划分点Ti表示为:\(Ti = (a_i + a_{i+1})/2\)。分别计算以这m-1个点作为二元分类点时的基尼系数。选择基尼系数最小的点为该连续特征的二元离散分类点
    • 比如取到的基尼系数最小的点为\(a_t\),则小于\(a_t\)的值为类别1,大于at的值为类别2,这样就做到了连续特征的离散化。
    • 注意:与ID3,C4.5处理离散属性不同的是,如果当前节点为连续属性,则该属性在后面还可以参与子节点的产生选择过程

(2)CART分类树算法对多个(大于2)离散值的处理

  • 采用的思路:不停的二分离散特征。
  • 在ID3、C4.5,特征A被选取建立决策树节点,如果它有3个类别\(A_1,A_2,A_3\),我们会在决策树上建立一个三叉点,这样决策树是多叉树。
  1. CART采用的是不停的二分。
  2. 会考虑把特征A分成\(\{A_1\}\)和\(\{A_2,A_3\}\)、\(\{A2\}\)和\(\{A_1,A_3\}\)、\(\{A_3\}\)和\(\{A_1,A_2\}\)三种情况,找到基尼系数最小的组合,比如\(\{A2\}\)和\(\{A_1,A_3\}\),然后建立二叉树节点,一个节点是\(\{A_2\}\)对应的样本,另一个节点是\(\{A_1,A_3\}\)对应的样本
    • 由于这次没有把特征A的取值完全分开,后面还有机会对子节点继续选择特征A划分A1和A3这和ID3、C4.5不同,在ID3或C4.5的一颗子树中,离散特征只会参与一次节点的建立。

(3)例

3.3.4 CART分类树算法思想

  1. 从根节点开始,对节点计算现有特征的基尼指数

    • 对每一个特征,例如A,再对其每个可能的取值如a,根据样本点对A=a的结果的‘是’与‘否’划分为两个部分,利用公式2.1.6(2)进行计算
  2. 在所有可能的特征A以及该特征所有的可能取值a中,选择基尼指数最小的特征及其对应的取值作为最优特征和最优切分点
  3. 根据最优特征和最优切分点,将本节点的数据集二分,生成两个子节点
  4. 对两个字节点递归地调用上述步骤,直至节点中的样本个数小于阈值,或者样本集的基尼指数小于阈值,或者没有更多特征后停止
  5. 生成CART分类树

3.3.6 CART剪枝

(1)后剪枝算法思想

  • 剪枝的过程就是一个动态规划的过程:从叶结点开始,自底向上地对内部结点计算预测误差以及剪枝后的预测误差,如果两者的预测误差是相等或者剪枝后预测误差更小,当然是剪掉的好。但是如果剪枝后的预测误差更大,那就不要剪了。剪枝后,原内部结点会变成新的叶结点,其决策类别由多数表决法决定。不断重复这个过程往上剪枝,直到预测误差最小为止

(2)剪枝过程

  1. 令决策树的非叶子节点为\(\{T_1,T_2...,T_i\}\)
  2. 计算所有非叶子节点的表面误差率增益值 \(a=\{a_1,a_2,a_3,...,a_n\}\)
  3. 选择表面误差率增益值 \(a_i\) 最小的非叶子节点$ T_i$(若多个非叶子节点具有相同小的表面误差率增益值,选择节点数最多的非叶子节点)
  4. 对 \(T_i\) 进行剪枝

(3)计算

  • 表面误差率增益值

    \[\alpha = \frac{R(t)-R(T)}{N(T)-1}
    \]

    • 其中\(R(t)\)表示叶子节点的误差代价

      \[R(t) = r(t)p(t)
      \]

      • \(r(t)\)为结点错误率
      • \(p(t)\)为结点数据量的占比
    • \(R(T)\)表示子树的误差代价,如果该节点不被剪枝。它等于子树T上所有叶子节点的误差代价之和

      \[R(T)=\sum_i^nr_i(t)p_i(t)
      \]

      • \(r_i(t)\)表示叶子结点i的错误率
      • \(p_i(t)\)表示叶子结点i的数据结点占比
    • \(N(t)\)表示叶子树叶结点个数

4. 总结

4.1 三种算法比较

4.1.1 三种算法对比表格

算法 支持模型 树结构 特征选择 连续值处理 缺失值处理 剪枝 特征值属性多次使用
ID3 分类 多叉树 信息增益 不支持 不支持 不支持 不支持
C4.5 分类 多叉树 信息增益率 支持 支持 支持 不支持
CART 分类,回归 二叉树 基尼系数,均方差 支持 支持 支持 支持

参考1 ID3 C4.5

参考2

参考3

参考4 回归树

参考5 cart算法

参考6 回归树预测值

原文地址:https://www.cnblogs.com/nishoushun/p/12630624.html

时间: 2024-10-30 15:21:48

数据挖掘-决策树 Decision tree的相关文章

【机器学习算法-python实现】决策树-Decision tree(1) 信息熵划分数据集

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 决策书算法是一种逼近离散数值的分类算法,思路比較简单,并且准确率较高.国际权威的学术组织,数据挖掘国际会议ICDM (the IEEE International Conference on Data Mining)在2006年12月评选出了数据挖掘领域的十大经典算法中,C4.5算法排名第一.C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法. 算法的主要思想就是将数据集依照特

机器学习算法实践:决策树 (Decision Tree)(转载)

前言 最近打算系统学习下机器学习的基础算法,避免眼高手低,决定把常用的机器学习基础算法都实现一遍以便加深印象.本文为这系列博客的第一篇,关于决策树(Decision Tree)的算法实现,文中我将对决策树种涉及到的 算法进行总结并附上自己相关的实现代码.所有算法代码以及用于相应模型的训练的数据都会放到GitHub上(https://github.com/PytLab/MLBox). 本文中我将一步步通过MLiA的隐形眼镜处方数集构建决策树并使用Graphviz将决策树可视化. 决策树学习 决策树

转载:算法杂货铺——分类算法之决策树(Decision tree)

作者:张洋 算法杂货铺——分类算法之决策树(Decision tree) 2010-09-19 16:30 by T2噬菌体, 44346 阅读, 29 评论, 收藏, 编辑 3.1.摘要 在前面两篇文章中,分别介绍和讨论了朴素贝叶斯分类与贝叶斯网络两种分类算法.这两种算法都以贝叶斯定理为基础,可以对分类及决策问题进行概率推断.在这一篇文章中,将讨论另一种被广泛使用的分类算法——决策树(decision tree).相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置,因此在实际

【机器学习算法-python实现】决策树-Decision tree(2) 决策树的实现

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 接着上一节说,没看到请先看一下上一节关于数据集的划分数据集划分.如今我们得到了每一个特征值得信息熵增益,我们依照信息熵增益的从大到校的顺序,安排排列为二叉树的节点.数据集和二叉树的图见下. (二叉树的图是用python的matplotlib库画出来的) 数据集: 决策树: 2.代码实现部分 由于上一节,我们通过chooseBestFeatureToSplit函数已经能够确定当前数据集中的信息熵最大的

机器学习入门 - 1. 介绍与决策树(decision tree)

机器学习(Machine Learning) 介绍与决策树(Decision Tree) 机器学习入门系列 是 个人学习过程中的一些记录与心得.其主要以要点形式呈现,简洁明了. 1.什么是机器学习? 一个比较概括的理解是: 根据现有的数据,预测未来 2.核心思想 : Generalization 可以理解为,归纳.概括.就像是人的学习一样,找出一件事物与与一件事物的联系 3.归纳性的机器学习(Inductive machine learning) 其核心思想是使用训练数据,并从其中摸索出一套适用

机器学习(二)之决策树(Decision Tree)

Contents 理论基础 熵 信息增益 算法实现 Python 模型的保存与读取 总结 理论基础 决策树(Decision Tree, DT):决策树是一种基本的分类与回归方法.由于模型呈树形结构,可以看做是if-then规则的集合,具有一定的可读性,可视化效果好. 决策树的建立包括3个步骤:特征选择.决策树生成和决策树的修剪. 模型的建立实际上就是通过某种方式,递归地选择最优的特征,并通过数据的划分,将无序的数据变得有序. 因此,在构造决策树时,第一个需要解决的问题就是如何确定出哪个特征在划

决策树Decision Tree 及实现

Decision Tree 及实现 标签: 决策树熵信息增益分类有监督 2014-03-17 12:12 15010人阅读 评论(41) 收藏 举报  分类: Data Mining(25)  Python(24)  Machine Learning(46)  版权声明:本文为博主原创文章,未经博主允许不得转载. 本文基于python逐步实现Decision Tree(决策树),分为以下几个步骤: 加载数据集 熵的计算 根据最佳分割feature进行数据分割 根据最大信息增益选择最佳分割feat

机器学习-决策树 Decision Tree

咱们正式进入了机器学习的模型的部分,虽然现在最火的的机器学习方面的库是Tensorflow, 但是这里还是先简单介绍一下另一个数据处理方面很火的库叫做sklearn.其实咱们在前面已经介绍了一点点sklearn,主要是在categorical data encoding那一块.其实sklearn在数据建模方面也是非常666的.一般常用的模型都可以用sklearn来做的.既然它都这么牛逼了,咱们为啥还要学TensorFlow呢?其实主要的原因有两个,一是因为Google在流量方面的强势推广,导致绝

Spark上的决策树(Decision Tree On Spark)

最近花了一些时间学习了Scala和Spark,学习语言和框架这样的东西,除了自己敲代码折腾和玩弄外,另一个行之有效的方法就是阅读代码.MLlib正好是以Spark为基础的开源机器学习库,便借机学习MLlib是如何利用Spark实现分布式决策树.本文主要是剖析MLlib的DecisionTree源码,假设读者已经入门Scala基本语法,并熟悉决策树的基本概念,假如您不清楚,可以参照Coursera上两门课程,一门是Scala之父Martin Odersky的<Functional Programm