Нахождение оптимальных значений k для KNN с использованием разделения данных - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь выполнить задание для разделения данных (обучающий набор, проверочный набор и тестовый набор), чтобы найти наиболее подходящий классификатор - в этом случае k, поскольку я использую k-ближайших соседей (функция kknn, часть пакета Kernlab). Однако, когда я использую приведенный ниже исходный код для рандомизации процесса разделения данных и запускаю циклы для определения наиболее точных значений k, я не получаю непротиворечивые значения k каждый раз, когда запускаю циклы. Числа ВСЕ по всему месту. Правильно ли я разделил свои данные? Я был исправлен в предыдущем посте за отсутствие минимального воспроизводимого примера (MRE), поэтому я попытаюсь предоставить код MRE:


#split data set into three groups, using "random" process in order to try to eliminate bias:
#currently an 80-10-10 split
#'data' in the code represents a data.frame with well over 100 data points

idx <- sample(seq(1, 3), size = nrow(data), replace = TRUE, prob = c(.8, .1, .1))
data_train <- data[idx == 1,] #training set
data_test <- data[idx == 2,] #test set
data_valid <- data[idx == 3,] #validation set

#Here is how I initialize my list to store the accuracy values for each k:

kknn_acc_list = list()

#Here is my for loop to test validation set:

for(i in 1:100){
  model_KNN <-kknn(V5~., data_train, data_valid, k = i, scale = TRUE)
  pred <- round(fitted(model_KNN)) == data_valid$V11  #predictions from the fitted function
  x = sum(pred) / nrow(data_valid) #accuracy measurement -- average number of predictions returned TRUE

  kknn_acc_list[[i]] = x
}

# validation set accuracy list:

kknn_acc_list

}

После применения функции I unlist () к списку по порядку чтобы получить матрицу, я использую функцию which () и max (), чтобы определить значение k с максимальной точностью. С каждым прогоном l oop я получаю широкий диапазон различных значений k, каждое из которых отличается от предыдущих прогонов l oop. Когда я применяю тот же тип l oop для своего тестового набора (data_test), я сталкиваюсь с той же проблемой. Может ли кто-нибудь помочь мне найти решение для того, чтобы отточить конкретное или набор определенных последовательных значений k?

1 Ответ

2 голосов
/ 22 января 2020

Вам нужно установить начальное число, чтобы каждый раз запускать «случайный выбор» в одном и том же месте, а затем делать те же вычисления внутри l oop. Это довольно просто, прямо перед разбиением, set.seed(42) вы можете использовать любое число, которое вы хотите там.

Это должно обеспечить согласованность ваших данных при нескольких запусках кода!

Но вы также неправильно используете это уравнение. Точность - это не число, прогнозируемое как одно из общего числа ... это число наблюдений, которое правильно рассчитано как 1 и правильно предсказано как 0 за количество наблюдений.

true positive +true negatives / all observations

Вы можете найти что часть проблемы просто в использовании неправильного метри c. Однако вы должны привыкнуть к использованию семян сейчас, это обязательный компонент воспроизводимой работы!

...