我们知道在决策树中节点的分裂是选择当前信息增益(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==maxClass的weight时,表明到目前为止该节点已经是一个叶子节点了(在该节点上的所有样本都是同一个类别)
- //同时当当前节点样本量小于某一个值时,它也将停止分裂.
- //当停止分裂以后我们使用 样本类别分布表来构建一个不分裂节点(即叶子节点)
- //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中是非常重要的类,它记录了很多重要的样本信息,这个会在以后给大家介绍.


雷达卡



京公网安备 11010802022788号







