【问题标题】:Majority vote algorithm in Weka.classifiers.meta.voteWeka.classifiers.meta.vote 中的多数投票算法
【发布时间】:2012-07-22 12:12:15
【问题描述】:

Weka 中使用的多数投票算法是什么。我试图弄清楚它的代码,但无法理解。

【问题讨论】:

    标签: weka


    【解决方案1】:

    在 Weka 中,您可以选择多个分类器用于Weka.classifiers.meta.vote。如果您选择Majority Voting 作为combinationRule(仅适用于nominal 类),那么这些分类器中的每一个都将为测试样本预测一个名义类标签。然后将选择预测最多的标签作为vote分类器的输出。

    例如。您选择使用以下分类器:trees.J48bayes.NaiveBayesfunctions.LibSVM 来预测天气,可以标记为badnormalgood。给定一个新的测试样本,这些是他们的预测:

    J48        - bad
    NaiveBayes - good
    LibSVM     - good
    

    每个可能的标签投票中的结果:

    bad    - 1
    normal - 0
    good   - 2
    

    所以 Weka 的 vote 分类器将选择 good 作为测试样本的标签,因为它在所有三个分类器中的投票数最多。

    --编辑--

    Weka 的Vote 类的source code 中的函数distributionForInstanceMajorityVoting 向您展示了多数投票是如何实现的。我添加了下面的功能。以下是其作用的描述:

    代码的工作原理与我上面解释的差不多。测试实例的所有名义类都加载到votes。每个分类器对实例进行分类,概率最高的标签获得投票。如果多个标签具有相同的概率,则所有这些标签都会获得投票。一旦所有分类器都投票,投票最多的标签将被选为测试实例的 the 标签。如果多个标签的票数相同,则将随机选择其中一个标签。

    protected double[] distributionForInstanceMajorityVoting(Instance instance) throws Exception {
    
      double[] probs = new double[instance.classAttribute().numValues()];
      double[] votes = new double[probs.length];
    
      for (int i = 0; i < m_Classifiers.length; i++) {
        probs = getClassifier(i).distributionForInstance(instance);
        int maxIndex = 0;
        for(int j = 0; j<probs.length; j++) {
          if(probs[j] > probs[maxIndex])
            maxIndex = j;
        }
    
        // Consider the cases when multiple classes happen to have the same probability
        for (int j=0; j<probs.length; j++) {
          if (probs[j] == probs[maxIndex])
            votes[j]++;
        }
      }
    
      for (int i = 0; i < m_preBuiltClassifiers.size(); i++) {
        probs = m_preBuiltClassifiers.get(i).distributionForInstance(instance);
        int maxIndex = 0;
    
        for(int j = 0; j<probs.length; j++) {
          if(probs[j] > probs[maxIndex])
            maxIndex = j;
        }
    
        // Consider the cases when multiple classes happen to have the same probability
        for (int j=0; j<probs.length; j++) {
          if (probs[j] == probs[maxIndex])
            votes[j]++;
        }
      }
    
      int tmpMajorityIndex = 0;
      for (int k = 1; k < votes.length; k++) {
        if (votes[k] > votes[tmpMajorityIndex])
          tmpMajorityIndex = k;
      }
    
      // Consider the cases when multiple classes receive the same amount of votes
      Vector<Integer> majorityIndexes = new Vector<Integer>();
      for (int k = 0; k < votes.length; k++) {
        if (votes[k] == votes[tmpMajorityIndex])
          majorityIndexes.add(k);
       }
    
      // Resolve the ties according to a uniform random distribution
      int majorityIndex = majorityIndexes.get(m_Random.nextInt(majorityIndexes.size()));
    
      //set probs to 0
      probs = new double[probs.length];
    
      probs[majorityIndex] = 1; //the class that have been voted the most receives 1
    
      return probs;
    }
    

    【讨论】:

    • 实际上,我使用了一些 Weka 分类器,并希望将它们的结果与 Weka 外部的其他分类器融合。所以,我想融合结果而不是融合分类器。我想重新实现 Vote 类的一部分以满足我的需要,但面临一些困难。还有其他想法吗?
    • 从命令行调用 Weka 听起来是个好主意。然后,您可以单独训练每个 Weka 分类器(不使用 meta.vote 和您的非 Weka 分类器,然后调用它们中的每一个来预测标签。从那里您可以自己实施多数投票或使用其他一些指标来组合各个结果.
    • 这是我的观点,我使用了Boyer-Moore算法进行多数投票,并将结果与​​Weka的结果进行比较,我得到了不同的结果。我在哪里可以找到有关 Weka 中使用的投票算法的详细信息。谢谢你。
    • 我用 Weka 的多数投票代码扩展了我的答案并解释了它。当您说我已使用 Boyer-Moore 算法进行多数投票时,我不确定您的意思。您是否正在使用 Boyer-Moore 算法,并且想将其与多数投票结合起来?你能详细解释一下你想做什么吗?
    • @Sicco 如何获得类的 weka.classifiers.meta.Vote 返回概率?当我在 weka.classifiers.meta.Vote 上调用 distributionForInstance 时,我没有得到不同类的软概率(例如:我得到 3 个类的 [0, 0, 1])。无论我选择哪种投票规则,它都会发生。我有一个类别不平衡的数据集。所以我在随机欠采样的平衡子集上训练三个随机森林/svm/你最喜欢的分类器(使用SpreadSubSample),并使用投票分类器融合他们的决定。我真的想要不同类别的概率估计。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2023-03-30
    相关资源
    最近更新 更多