楼主: ReneeBK
7737 0

Weka如何处理分类时测试样本属性缺失问题 [推广有奖]

  • 1关注
  • 62粉丝

VIP

已卖:4897份资源

学术权威

14%

还不是VIP/贵宾

-

TA的文库  其他...

R资源总汇

Panel Data Analysis

Experimental Design

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

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

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
本文主要分析我Weka中J48在分类时处理缺失值的问题.在J48中,如果在当前节点上该样本的属性为空,它会按照一个当前节点上该属性的分布情况得到一个分布表,即如果该节点的训练样本的属性值分布为 [2,3,5] (样本量为10),则此时该样本按照[0.2,0.3,0.5]的权重进入当前节点的子树中.


  1. //WangYi 2007-10-7
  2.   /*
  3.    * 分类样本
  4.    */
  5.   public double classifyInstance(Instance instance)
  6.     throws Exception {

  7.     double maxProb = -1;
  8.     double currentProb;
  9.     int maxIndex = 0;
  10.     int j;

  11.     /*
  12.      * 找到可能性最大的类别作为当前测试样本的类别
  13.      */
  14.     for (j = 0; j < instance.numClasses(); j++) {
  15.       //对于类别j的可能性
  16.       //wangyi 2008.4.1
  17.     currentProb = getProbs(j, instance, 1);
  18.       if (Utils.gr(currentProb,maxProb)) {
  19.     maxIndex = j;
  20.     maxProb = currentProb;
  21.       }
  22.     }

  23.     return (double)maxIndex;
  24.   }

  25. 该函数在 weka.classifiers.trees.ClassifierTree类文件中.该函数实现了分类一个测试样本的功能.

  26. /*
  27.    * 在这里有DecisionTree处理未知值的解决办法
  28.    */
  29.   private double getProbs(int classIndex, Instance instance, double weight)
  30.     throws Exception {
  31.    
  32.     double prob = 0;
  33.    
  34.     /*
  35.      * 当前节点如果是叶子节点,返回instance在该classIndex下的可能性
  36.      */
  37.     if (m_isLeaf) {
  38.       return weight * localModel().classProb(classIndex, instance, -1);
  39.     } else {
  40.            /*
  41.             * 如果不是叶子节点则我们找该样本应该进入下一级哪一个子节点
  42.             */
  43.       int treeIndex = localModel().whichSubset(instance);
  44.      
  45.       /*
  46.        * 当该样本的属性为?时,它将返回-1
  47.        */
  48.       if (treeIndex == -1) {
  49.              /*
  50.               * 计算当前节点上的属性值分布情况,得到权重数组
  51.               */
  52.        double[] weights = localModel().weights(instance);
  53.        for (int i = 0; i < m_sons.length; i++) {
  54.               /*
  55.                * 按照权重数组进入下一级子节点
  56.                */
  57.          if (!son(i).m_isEmpty) {
  58.            prob += son(i).getProbs(classIndex, instance,
  59.                                 weights[i] * weight);
  60.          }
  61.        }
  62.        return prob;
  63.       } else {
  64.              /*
  65.               * 如果该样本的属性为空,进入特定子节点
  66.               */
  67.        if (son(treeIndex).m_isEmpty) {
  68.          return weight * localModel().classProb(classIndex, instance,
  69.                                            treeIndex);
  70.        } else {
  71.          return son(treeIndex).getProbs(classIndex, instance, weight);
  72.        }
  73.       }
  74.     }
  75.   }

  76. 该函数也在weka.classifiers.trees.ClassifierTree中.

  77. /*
  78.    * C4.5Split中计算样本在当前节点 属性上的权重数值
  79.    */
  80.   public final double [] weights(Instance instance) {
  81.    
  82.     double [] weights;
  83.     int i;
  84.    
  85.     if (instance.isMissing(m_attIndex)) {
  86.       weights = new double [m_numSubsets];
  87.       /*
  88.        * 计算权重信息还是借助了 Split中保存的统计信息
  89.        * (distribution),这个对象相信大家不会陌生
  90.        */
  91.       for (i=0;i<m_numSubsets;i++)
  92.        weights [i] = m_distribution.perBag(i)/m_distribution.total();
  93.       return weights;
  94.     }else{
  95.       return null;
  96.     }
  97.   }
复制代码


二维码

扫码加我 拉你入群

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

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

关键词:WEKA distribution classifiers classifier exception wangyi public double return 可能性

本帖被以下文库推荐

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-30 18:56