决策树学习总结

1.概述

决策树归纳是从有类标号的训练元组中学习决策树。

决策树是一种类似于流程图的树结构,其中,每个内部结点(非叶子结点)表示在一个属性上的测试,每个分支代表该测试的一个输出,而每个树叶结点存放一个类的类标号。

树的最顶层结点是根结点。

有些决策树只能产生二叉树,而有些决策树可能产生非二叉树。

 

决策树以自顶向下递归的分治方法构造

2.算法归纳

a.用三个参数D,attribute_list和Attribute_selection_method调用该算法。我们称D为数据分区,开始时,它是训练元组和它们相应类标号的完全集。参数attribute_list是描述元组属性的列表。Attribute_selection_method指定选择属性的启发式过程,用了选择可以按类“最好的”区分给定运足的属性。

b.树从单个结点N开始,N代表D中的训练元组。

c.如果D中的元组都为同一类,则结点N变成树叶,并用该类标记它。

d.否则,算法调用Attribute_selection_method确定分裂准则。分裂准则指定分裂属性,并且也指出分裂点或分裂子集。理想情况下,分裂准则这样确定,使得每个分支上的输出分区都竟可能“纯”。一个分区时纯的,如果它的所有元组都属于同一类。换言之,如果根据分裂准则的互斥输出划分D中的元组,则希望结果分区尽可能纯。

e.结点N用分裂准则标记作为结点上的测试。

3.算法描述

算法:Generate_decision_tree.由数据分区D中的训练元组产生决策树

输入:数据分区D,训练元组和它们对应类标号的集合

     attribute_list,候选属性的集合

     Attribute_selection_method,一个确定“最好的”划分数据元组为个体类的分裂准则的过程,这个准则由分裂属性(splitting_attribute)和分裂点或划分子集组成

输出:一个决策树

方法:

  创建一个结点N;

  if  D中的元组都在同一类C中  then

    返回N作为叶结点,以类C标记;

  if attribute_list为空   then

    返回N作为叶子结点,标记中为D中的多数类;    //多数表决

  使用Attribute_selection_method(D,attribute_list),找出“最好的”splitting_criterion;    //这里有多种方法作为"最好的"指标,下面会介绍

  用splitting_criterion标记结点N;

  if splitting_attribute是离散值的,并且允许多路划分 then

    attribute_list  <-- attribute_list -splitting_attribute;

  for splitting_criterion的每个输出j 

   //划分元组并对每个分区产生子树

    设Dj是D中满足输出j的数据元组的集合;

    if  Dj为空 then

      加一个树叶到结点N,标记为D中的多数类;

    else

      加一个由Generate_decision_tree(D,attribute_list)返回的结点到N;

  end for

  返回N;

4.找出“最好的”splitting_criterion的各种指标方法(属性选择度量)

  a.信息增益

     来源:应用信息熵的概念,选择具有最高信息增益的塑像作为结点N的分裂属性。

   目的:该属性使结果分区中对元组分类所需要的信息量最小,并反映这些分区中的最小随机性或“不纯性”。

    优点:这种方法使得对一个对象分裂所需要的期望测试数目最小,并确保找到一颗简单的(但不必是最简单的)树。 

   对D中的元组分类所需要的期望信息由下式给出:

        Info(D)=-Σpi*log2(pi) ;i=1,2,...,m

    其中,pi是D中任意元组属于类Ci的非零概率,并用|C(i,D)|/|D|估计。使用以2为底的对数函数是因为信息用二进位编码。

    Info(D)是识别D中元组的类标号所需要的平均信息量。注意,此时我们所有的信息只是每个类的元组所占的百分比。Info(D)又称为D的熵(entropy).

    现在,假设我们要按某属性A划分D中的元组,其中属性根据训练数据的观测具有v个不同值{a1,a2,...,av}.如果A是离散值的,则这些值直接对应于A上测试的v个输出。可以用属性A将D划分为v个分区或子集{D1,D2,...,Dv},其中,Dj包含D中的元组,它们的A值为aj。这些分区对应于从结点N生长出来的分支。理想情况下,我们希望该划分产生元组的准确分类。即我们希望每个分区都是纯的。然而,这些分区多半是不纯的。(在此划分之后)为了得到准确的分类,我们还需要多少信息?这个量由下式度量:

          Info_A(D)=Σ(|Dj|/|D|*Info(Dj)); 其中|Dj|为第j分区中元组的数目,|D|为总元组数目,|Dj|/|D|充当第j个分区的权重。

    Info_A(D)是基于按A划分对D 的元组分类所需要的期望信息。需要的期望信息越小,分区的纯度越高。

    信息增益定义为原来的信息需求(仅基于类比例)与新的信息需求(对A划分后)之间的差。即   Gain(A)=Info(D)-Info_A(D)

        换言之,Gain(A)告诉我们通过A上的划分我们得到了多少。它是指定A的值而导致的信息需求的期望减少。选择具有最高信息增益Gain(A)的属性A作为结点N的分裂属性。这等价于在“能做最佳分类”的属性A上划分,使得完成元组分类还需要的信息最小(即最小化Info_A(D)).

    PS:读者有兴趣可以去百度看看信息熵和热熵的概念,就会明白为何要去信息熵的线性组合的和最小作为分类指标。

   b.增益率

    信息增益度量偏向于具有许多输出的测试。换句话说,它倾向于选择具有大量值的属性。ID3的后继C4.5使用一种称为信息率(gain ratio)的信息增益扩充,试图克服这种偏倚。

        它用“分裂信息(split information)”的值将信息增益规范化。分裂信息类似于Info(D),定义如下

          SplitInfo_A(D)=-Σ{(|Dj|/|D|)*log2(|Dj|/|D|)};j=1,2,...,v

    该值代表有训练数据集D划分成对应于属性A测试的v个输出的v个分区产生的信息。注意,对于每个输出,它相对于D中元组的总数考虑具有该输出的元组数。它不同于信息增益,信息增益度量关于分类基于同样划分的所获得的信息。增益率定义为  

          GrianRate(A)=Grain(A)/SplitInfo_A(D)  ;

    选择具有最大增益率的属性作为分类属性。然而需要注意的是,随着划分信息趋向于0,该比率变得不稳定。为了避免这种情况,增加一个约束:选取的测试的信息增益必须较大,至少与考察的所有测试的平均增益一样大。

  c.基尼指数

    基尼指数(Gini index)在CART中使用。基尼指数度量数据分区或训练元组集D的不纯度,定义为

        Gini(D)=1-Σ(pi^2) ;   i=1,2,...,m

    其中,pi是D中元组属于Ci类的概率,并用|C(i,D)|/|D|估计。对m个类计算和。

    基尼指数考虑每个属性的二元划分。

    首先考虑A是离散值属性的情况:

      其中A具有v个不同值{a1,a2,...,av}出现在D中。为了确定A上最好的二元划分,考虑使用的已知值形成的所有可能子集。每个子集S_A可以看做属性A的一个形如“A€S_A?”的二元测试。给定一个元组,如果该元组A的值出现在S_A列出的值中,则该测试满足。

      当考虑二元划分裂时,计算每个结果分区的不纯度的加权和。例如,如果A的二元划分将D划分成D1和D2,则给定该划分,D的基尼指数为  Gini_A(D)=|D1|/|D|*Gini(D1)+|D2|/|D|*Gini(D2);

          对于每个属性,考虑每种可能的二元划分。对于离散值属性,选择该属性产生最小基尼指数的子集作为它的分裂子集。

    对于连续值属性,必须考虑每个可能的分裂点。其策略类似于上面介绍的信息增益所使用的策略,其中将每对(排序列后的)相邻值的中点作为可能的分裂点。对于给定的(连续值)属性,选择产生最小基尼指数的点作为该属性的分裂点。注意,对于A的可能分裂点split_point,D1是D中满足A《=split_point的元组集合,而D2是D中满足A>split_point的元组集合。

    对于离散或连续值属性A的二元划分导致的不纯度降低为  ΔGini(A)=Gini(D)-Gini_A(D) 最大化不纯度降低(或等价地,具有最小基尼指数) 的属性选为分裂属性。该属性和他的分裂子集(对于离散值的分裂属性)或分裂点(对于连续值的分裂属性)一起形成分裂准则。

    d.其他属性选择度量

      如基于最小描述长度(Minimum Description Length,MDL)原理的属性选择度量。

5.最后内容

    决策树后面还有关于 树剪枝、可伸缩性与决策树归纳、决策树归纳的可视化挖掘  等等内容,笔者也没搞明白,就先写到这里,搞明白了再续写。

采摘至《数据挖掘概念与技术》第3版。

 

转载于:https://www.cnblogs.com/evilKing/p/4041000.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值