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

Java 加权投票通常应该提高KNN分类器的准确性吗?,java,weka,knn,Java,Weka,Knn,我将我的1NN基本分类器与30个数据集上的反向距离加权投票进行比较,加权投票选项似乎使分类器在90%的时间内表现相同或更差 我的问题是,这是正常的还是我错误地实现了分类器的某些部分 我正在使用Java和WEKA。我已经测试了30个数据集。我对每个数据集运行30个测试,并计算平均准确度。我计算准确度的方法是计算所有正确的预测,然后将它们除以我正在分类的实例总数 下面的代码将通过在数据集上测试实例的总体精度30次并计算精度来对实例进行分类 for(int j = 0; j < 2; j++)

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

我的问题是,这是正常的还是我错误地实现了分类器的某些部分

我正在使用Java和WEKA。我已经测试了30个数据集。我对每个数据集运行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;

我认为加权投票是对基本1NN分类器的改进,因此我希望看到一些相对的改进,但是只有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

提前感谢

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

KNN中最常见的决策选择过程是计算每个决策类中的邻居,并选择具有最大计数的决策。这是同等权重的投票。但也有其他投票方案,通常取决于邻居到分类对象的距离。在对每个分类对象进行加权投票的情况下,KNN对每个决策类的最近邻加权求和,并选择具有最大和的决策

另一个问题是什么是k的最佳值。KNN能自动选择k值,并通过留一法或交叉验证在训练集上优化分类精度

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

  • 不加权
  • 按1-distance计算的重量
  • 重量/距离
IBk在设置
crossValidate
参数后优化k

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

  • 不加权
  • 重量/距离
  • 重量按1/距离^2计算
在我们的实验中,最后一个投票方案的权重与距离的平方成反比,通常给出最好的分类精度

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;

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

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