注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

anqiang专栏

不要问细节是怎么搞的,源码说明一切

 
 
 

日志

 
 

J48实现中的一些问题 二   

2009-05-25 09:14:49|  分类: Weka 学习系列 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

如何处理叶子节点样本量为0或者很少的情况

我们知道在决策树中节点的分裂是选择当前信息增益(Info Gain)或者Gain Ratio最大的属性来进行的,在分裂以后将分裂节点属性对应的值下的样本分别放到对应的叶子节点(或者称为下一级节点).在进行到这一步时,我们考虑这样一种情况:

假设当前选择的分裂属性为attr,

当前在这个节点的样本量为10,

属性attr attr1,attr2,attr3这三个属性值,

与它们对应的样本量为6,4,0;

这个时候生成的下级节点的样本量分别为6,4,0.它们将继续尝试分割,对于拥有样本量6,4的这两个节点它们的处理很简单,在进行一次分割操作就可以了.然而对于只有0个样本的节点如何处理?这是一个问题.一个简单的想法是在这个时候停止分裂操作.让它成为一个叶子节点.

我们看看weka中是如何处理的:

//在这里它形成了一个一维数组格式如下

   

    /*           class1  class2  class3 ...

     * dimension

     *

     * 这样实际上就是一个样本类别分布表了.

     */

      checkDistribution = new Distribution(data);

     

      //System.out.println("checkDistribution:" + checkDistribution);

      noSplitModel = new NoSplit(checkDistribution);

     

      //total==maxClassweight,表明到目前为止该节点已经是一个叶子节点了(在该节点上的所有样本都是同一个类别)

      //同时当当前节点样本量小于某一个值时,它也将停止分裂.

      //当停止分裂以后我们使用 样本类别分布表来构建一个不分裂节点(即叶子节点)

      //wangyi 2008.6.15

      if (Utils.sm(checkDistribution.total(),2*m_minNoObj) ||

      Utils.eq(checkDistribution.total(),

          checkDistribution.perClass(checkDistribution.maxClass())))

    return noSplitModel;

该函数在weka.classifiers.trees.j48.C45ModelSelection类中,在这里我们可以看到 当样本量小于某个数量时就停止分裂. 对于0个样本量的节点,它会形成一个 [0,0,0,...]的类别分布节点. 在决策时,当一个样本被分类到这个叶子节点时,我们该如何决策它的类别. 因为它的类别分布式均衡的,所以我们可以随机选择一个类别作为当前样本的类别. weka中是选择第一个类别作为其样本类别.

      具体函数如下:

/**

   * Returns class with highest frequency for given bag.

   * 当样本类别分布均衡时,返回的类别标签是数组的第一个(即类别一)

   */

  public final int maxClass(int index) {

 

    double maxCount = 0;

    int maxIndex = 0;

    int i;

 

    if (Utils.gr(m_perBag[index],0)) {

      for (i=0;i<m_perClass.length;i++)

    if (Utils.gr(m_perClassPerBag[index][i],maxCount)) {

      maxCount = m_perClassPerBag[index][i];

      maxIndex = i;

    }

      return maxIndex;

    }else

      return maxClass();

  }

该函数在weka.classifiers.trees.j48.Distribution类中,这个类在weka中是非常重要的类,它记录了很多重要的样本信息,这个会在以后给大家介绍.
  评论这张
 
阅读(632)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017