加权投票是否应该总体上提高KNN分类器的准确性?

时间:2019-04-19 17:17:21

标签: java weka knn

我正在将我的1NN基本分类器与30个数据集中的反距离加权投票进行比较,加权投票选项似乎使分类器在90%的时间内表现相同或更差。

我的问题是,这是否正常?我是否正确实施了分类器的某些部分?

我正在使用Java和WEKA。我已经测试了30个数据集found here。我正在为每个数据集运行30个测试,并计算平均准确度。我计算准确性的方式是对所有正确的预测进行计数,然后将其除以我要分类的实例总数。

以下代码将通过在数据集上测试实例的整体准确性30次并计算准确性来对实例进行分类。

for(int j = 0; j < 2; j++) {

    if(j == 1) { 
        knn.setWeightedVoting(true); 
    }

    double averageAccuracy = 0;
    for(int i = 0; i < 30; i++){
        double correct = 0;
        for(Instance test : newTestData){
            double prediction  = knn.classifyInstance(test);
            if(prediction == test.value(newTestData.numAttributes()-1)) {
                correct++;
            }
        }

        double accuracy = (correct * 100) / newTestData.numInstances();
        averageAccuracy+=accuracy;
    }
}

averageAccuracy = averageAccuracy / 30;

该代码应使用每个邻居的反距离(在这种情况下仅为1)启用加权投票。我有一个由数组表示的理货,其中每个索引代表数据集中的一个类。然后我将k个最近的邻居类别增加投票权重

for(Instance instance : kNearestNeighbours) {
    if(this.weightedVoting) {

        double distance = ClassifierTools.getDistance(instance, testInstance);
        double voteWeight;

        if(distance == 0){
            voteWeight = 0;
        }
        else{
            voteWeight = 1/(distance);
        }

        classTally[(int)instance.classValue()]+=voteWeight;
    }
    else{
        classTally[(int)instance.classValue()]++;
    }
}

我阅读了加权投票作为对基本1NN分类器的改进,因此我希望看到一些相对的改进,但是只有3个数据集有所改进,而在这3个数据集中,只有2个数据集的改进超过0.5%。< / p>

这是我在每个数据集上完整结果的列表

Base 1NN accuracy   Weighted 1NN accuracy
86.75               86.75
66.6                71.83
74.07               72.22
81.76               81.76
71.55               71.55
51.98               51.98
92.33               92.98
85.22               85.22
97.33               97.33
75                  67
69.53               69.53
97.36               97.36
95.03               95.03
96.35               95.68
93.87               93.87
58.24               58.24
61.11               63.4
72.97               72.97
93.33               93.33
89.09               86.31
89.65               89.65
70.99               70.99
72.32               72.32
96.66               96.66
95.001              95.001
77.41               77.41
84.35               84.35
71.73               71.73
57.16               37.37
51.54               51.14

预先感谢

1 个答案:

答案 0 :(得分:0)

KNN中对加权投票的典型理解与您所描述的不同。它与选择单个对象的决策时邻居相对于其他最近邻居的重要性有关。因此,加权投票仅对k> 1有意义。

KNN中最常见的决策选择程序是对每个决策类的邻居进行计数,并选择计数最高的决策。这就是加权投票。但是还有其他投票方案,通常取决于邻居到分类对象的距离。在对每个分类对象进行这种加权投票的情况下,KNN会将每个决策类中最近邻居的权重相加,然后选择总和最大的决策。

一个单独的问题是k的最佳值是多少。 KNN可以通过留一法或交叉验证自动选择k值,以优化训练集上的分类精度。

假设您使用的是Weka的IBk,则分类器的distanceWeighting参数带有3个可能的值(请参见IBk documentation):

  • 不加权
  • 1距离的重量
  • 重量乘1 /距离

设置crossValidate参数后,IBk优化k。

我和我的朋友为Weka实现了另一种KNN分类器,该分类器具有另一组3种投票方案:

  • 不加权
  • 重量乘1 /距离
  • 权重1 /距离^ 2

在我们的实验中,权重与距离的平方成反比的最后一种投票方案通常具有最佳的分类精度。

如果您想尝试我们的替代KNN实现,则需要在Weka中安装Rseslib。 Rseslib是官方的Weka软件包。您可以使用Weka软件包管理器(Weka GUI Chooser中的菜单工具->软件包管理器)进行安装。必须重新启动Weka GUI选择器,以使已安装的分类程序在Weka工具中可见。

我们的KNN实现的类路径为weka.classifiers.lazy.RseslibKnnvoting参数定义要使用的投票方案。 k的值默认情况下是优化的,可以通过参数将其关闭。