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