Должно ли взвешенное голосование в целом повысить точность классификатора KNN? - PullRequest
0 голосов
/ 19 апреля 2019

Я сравниваю свой базовый классификатор 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;

Этот код должен включать взвешенное голосование с использованием обратного расстояниякаждый сосед (только 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

Заранее спасибо

1 Ответ

0 голосов
/ 27 апреля 2019

Типичное понимание взвешенного голосования в KNN отличается от того, что вы описали. Это связано с тем, насколько сосед имеет значение по отношению к другим ближайшим соседям при выборе решения для одного объекта. Следовательно, взвешенное голосование имеет смысл только для k> 1.

Самая распространенная процедура выбора решения в KNN заключается в подсчете соседей из каждого класса решений и выборе решения с наибольшим количеством. Это одинаково взвешенное голосование. Но есть и другие схемы голосования, которые обычно зависят от расстояния соседей до классифицируемого объекта. В случае такого взвешенного голосования для каждого классифицированного объекта KNN суммирует веса ближайших соседей из каждого класса решений и выбирает решение с наибольшей суммой.

Отдельный вопрос: каково наилучшее значение k? KNN может выбрать значение k, автоматически оптимизируя точность классификации в обучающем наборе с помощью метода «оставь один» или перекрестной проверки.

Предполагается, что вы используете IBk от Weka, у классификатора есть параметр distanceWeighting с 3 возможными значениями (см. Документация IBk ):

  • без взвешивания
  • вес на 1 дистанцию ​​
  • вес на 1 / расстояние

IBk оптимизирует k после установки параметра crossValidate.

Мы с моим другом внедрили альтернативный классификатор KNN для Weka, который имеет другой набор из 3 схем голосования:

  • без взвешивания
  • вес на 1 / расстояние
  • вес на 1 / расстояние ^ 2

В наших экспериментах последняя схема голосования с весами, обратно пропорциональными квадрату расстояния, обычно давала наилучшую точность классификации.

Если вы хотите попробовать нашу альтернативную реализацию KNN, вам нужно установить Rseslib в Weka. Rseslib является официальным пакетом Weka. Вы можете установить его с помощью менеджера пакетов Weka (меню Сервис -> Менеджер пакетов в Weka GUI Chooser). Перезапуск Weka GUI Chooser необходим, чтобы сделать установленные классификаторы видимыми в инструментах Weka.

Путь к классам нашей реализации KNN - weka.classifiers.lazy.RseslibKnn. Параметр voting определяет схему голосования, которая будет использоваться. Значение k оптимизировано по умолчанию, его можно отключить с помощью параметра.

...