加权投票通常会提高KNN分类器的准确性吗?

问题描述 投票:0回答:1

我将我的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%。

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

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

提前致谢

java weka knn
1个回答
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 Chooser是必要的,以便在Weka工具中显示已安装的分类器。

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

© www.soinside.com 2019 - 2024. All rights reserved.