楼主: ReneeBK
3054 0

Weka如何处理叶子节点样本量为0或者很少的情况 [推广有奖]

  • 1关注
  • 62粉丝

VIP

已卖:4900份资源

学术权威

14%

还不是VIP/贵宾

-

TA的文库  其他...

R资源总汇

Panel Data Analysis

Experimental Design

威望
1
论坛币
49655 个
通用积分
55.9937
学术水平
370 点
热心指数
273 点
信用等级
335 点
经验
57805 点
帖子
4005
精华
21
在线时间
582 小时
注册时间
2005-5-8
最后登录
2023-11-26

楼主
ReneeBK 发表于 2014-11-14 14:32:46 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

我们知道在决策树中节点的分裂是选择当前信息增益(Info Gain)或者Gain Ratio最大的属性来进行的,在分裂以后将分裂节点属性对应的值下的样本分别放到对应的叶子节点(或者称为下一级节点).在进行到这一步时,我们考虑这样一种情况:
假设当前选择的分裂属性为attr,当前在这个节点的样本量为10, 属性attr有 attr1,attr2,attr3这三个属性值,与它们对应的样本量为6,4,0; 这个时候生成的下级节点的样本量分别为6,4,0.它们将继续尝试分割,对于拥有样本量6,4的这两个节点它们的处理很简单,在进行一次分割操作就可以了.然而对于只有0个样本的节点如何处理?这是一个问题.一个简单的想法是在这个时候停止分裂操作.让它成为一个叶子节点.


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

  1. //在这里它形成了一个一维数组格式如下
  2.    
  3.     /*           class1  class2  class3 ...
  4.      * dimension
  5.      *
  6.      * 这样实际上就是一个样本类别分布表了.
  7.      */
  8.       checkDistribution = new Distribution(data);
  9.      
  10.       //System.out.println("checkDistribution:" + checkDistribution);
  11.       noSplitModel = new NoSplit(checkDistribution);
  12.      
  13.       //当total==maxClass的weight时,表明到目前为止该节点已经是一个叶子节点了(在该节点上的所有样本都是同一个类别)
  14.       //同时当当前节点样本量小于某一个值时,它也将停止分裂.
  15.       //当停止分裂以后我们使用 样本类别分布表来构建一个不分裂节点(即叶子节点)
  16.       //wangyi 2008.6.15
  17.       if (Utils.sm(checkDistribution.total(),2*m_minNoObj) ||
  18.       Utils.eq(checkDistribution.total(),
  19.           checkDistribution.perClass(checkDistribution.maxClass())))
  20.     return noSplitModel;
  21. 该函数在weka.classifiers.trees.j48.C45ModelSelection类中,在这里我们可以看到 当样本量小于某个数量时就停止分裂. 对于0个样本量的节点,它会形成一个 [0,0,0,...]的类别分布节点. 在决策时,当一个样本被分类到这个叶子节点时,我们该如何决策它的类别. 因为它的类别分布式均衡的,所以我们可以随机选择一个类别作为当前样本的类别. 在weka中是选择第一个类别作为其样本类别.
  22.       具体函数如下:
  23. /**
  24.    * Returns class with highest frequency for given bag.
  25.    * 当样本类别分布均衡时,返回的类别标签是数组的第一个(即类别一)
  26.    */
  27.   public final int maxClass(int index) {

  28.     double maxCount = 0;
  29.     int maxIndex = 0;
  30.     int i;

  31.     if (Utils.gr(m_perBag[index],0)) {
  32.       for (i=0;i<m_perClass.length;i++)
  33.     if (Utils.gr(m_perClassPerBag[index][i],maxCount)) {
  34.       maxCount = m_perClassPerBag[index][i];
  35.       maxIndex = i;
  36.     }
  37.       return maxIndex;
  38.     }else
  39.       return maxClass();
  40.   }
  41. 该函数在weka.classifiers.trees.j48.Distribution类中,这个类在weka中是非常重要的类,它记录了很多重要的样本信息,这个会在以后给大家介绍.
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:WEKA 样本量 distribution classifiers classifier 最大的 如何 叶子 信息 样本

本帖被以下文库推荐

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-17 18:14