6

Wekaで使用されている多数決アルゴリズムは何ですか。私はそのコードを理解しようとしましたが、それを理解できませんでした。

4

1 に答える 1

14

Weka では、複数の分類器を選択して使用できますWeka.classifiers.meta.voteMajority Votingas combinationRule(クラスでのみ機能)を選択するnominalと、これらの分類器のそれぞれが、テスト サンプルの名義クラス ラベルを予測します。次に、最も多く予測されたラベルがvote分類器の出力として選択されます。

例えば。使用する次の分類子を選択します: trees.J48bayes.NaiveBayesおよびfunctions.LibSVMとラベル付けできる天気を予測badnormalますgood。新しいテスト サンプルが与えられた場合の予測は次のとおりです。

J48        - bad
NaiveBayes - good
LibSVM     - good

可能なラベルごとに次の投票が行われます。

bad    - 1
normal - 0
good   - 2

したがって、Weka の分類子は、3 つの分類子すべての中で最も多くの票を獲得しているため、テスト サンプルのラベルとしてvote選択します。good

- 編集 -

Weka のクラスのソース コードdistributionForInstanceMajorityVoting内の関数は、多数決がどのように実装されているかを示しています。以下の機能を追加しました。これが何をするかの説明です:Vote

上記で説明したように、コードはほとんど機能します。テスト インスタンスのすべての名義クラスが にロードされvotesます。各分類器はインスタンスを分類し、確率が最も高いラベルが投票されます。複数のラベルの確率が同じ場合、これらすべてのラベルが投票されます。すべての分類子がそこに投票すると、最も投票数の多いラベルがテスト インスタンスのラベルとして選択されます。複数のラベルの投票数が同じ場合、これらのラベルの 1 つがランダムに選択されます。

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;
}
于 2012-07-24T09:25:50.260 に答える