什么是Weka中使用的多数表决算法。 我试图找出它的代码,但无法理解。
Answer 1:
在Weka中您可以选择使用多分类Weka.classifiers.meta.vote
。 如果您选择了Majority Voting
为combinationRule
(只与工作nominal
类),然后每个分类器将预测测试样品标称类的标签。 这是预测的最标签将被选择作为输出vote
分类器。
例如。 您可以选择使用以下分类: trees.J48
, bayes.NaiveBayes
和functions.LibSVM
来预测天气,这可以被标记bad
, normal
或good
。 给定一个新的测试样品,这些都是他们的预测:
J48 - bad
NaiveBayes - good
LibSVM - good
在下面的票数为每个可能的标签结果:
bad - 1
normal - 0
good - 2
所以Weka中的vote
分类将选择good
作为标签,供试品,因为它拥有最多票数的所有三个分类之中。
- 编辑 -
该功能distributionForInstanceMajorityVoting
在源代码 Weka中的的Vote
类显示了多数表决是如何实现的。 我加了下面的功能。 这里是做什么的描述:
代码工作,因为我上面所解释的漂亮多了。 测试实例的所有标称类被加载到votes
。 最高概率获得一票每个分类,分类上述实例和标签。 如果多个标签具有相同的概率,那么所有这些标签收到的一票。 一旦所有分类都投有票,得票最多的标签被选定为标签的测试实例。 如果多个标签具有票的相同量,则这些标记之一将随机选择。
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;
}
文章来源: Majority vote algorithm in Weka.classifiers.meta.vote