Как найти оптимальное значение K в K-ближайших соседях, используя R? - PullRequest
1 голос
/ 23 апреля 2020

Мой набор данных содержит 5851 наблюдений и разбит на поезд (3511 наблюдений) и тестовый набор (2340 наблюдений). Теперь я хочу обучить модель, используя KNN, с двумя переменными. Я хочу сделать 10-кратное резюме, повторенное 5 раз, используя RO C metri c и правило единой ошибки, а переменные предварительно обрабатываются. Код показан ниже.

set.seed(44780)
ctrl_repcvSE <- trainControl(method = "repeatedcv", number = 10, repeats = 5,
                           summaryFunction = twoClassSummary, classProbs = TRUE,
                           selectionFunction = "oneSE")
tune_grid <- expand.grid(k = 45:75)
mod4 <- train(purchased ~ total_policies + total_contrib,
              data = mhomes_train, method = "knn",
              trControl= ctrl_repcvSE, metric = "ROC",
              tuneGrid = tune_grid, preProcess = c("center", "scale"))

Проблема, с которой я столкнулся, состоит в том, что я уже пробовал так много разных значений K (например, K = 10:20, 30:40, 50:60, 150: 160 + различные длины настройки. Однако каждый раз, когда на выходе говорится, что выбранное значение для K является последним, так, например, для значений K = 70:80, выбранное значение для K = 80, каждый раз, когда я делаю Это означает, что я должен смотреть дальше, потому что если выбранное значение K в этом случае, то есть лучшие значения K, которые выше 80. Как мне в конечном итоге найти это значение?

Назначение только определяет : Для k-ближайших соседей изучите разумные значения k, используя только переменные total_policies и total_contrib.

1 Ответ

0 голосов
/ 23 апреля 2020

Добро пожаловать в переполнение стека. На ваш вопрос нелегко ответить.

Для k-ближайших соседей я использую другую функцию knn3 часть библиотеки caret.

Я приведу пример с использованием iris набор данных. Мы пытаемся получить точность нашей модели для различных значений для k и вычерчиваем эти точности.

library(data.table)
library(tidyverse)
library(scales)
library(caret)

dt <- as.data.table(iris)

# converting and scaling data ----
dt$Species      <- dt$Species %>% as.factor()
dt$Sepal.Length <- dt$Sepal.Length %>% scale()
dt$Sepal.Width  <-  dt$Sepal.Width %>% scale()
dt$Petal.Length <- dt$Petal.Length %>% scale()
dt$Petal.Width  <-  dt$Petal.Width %>% scale()

# remove in the real run ----
set.seed(1234567)

# split data into train and test - 3:1 ----
train_index <- createDataPartition(dt$Species, p = 0.75, list = FALSE)
train <- dt[train_index, ]
test <- dt[-train_index, ]

# values to check for k ----
K_VALUES  <- 20:1
test_acc  <- numeric(0)
train_acc <- numeric(0)

# calculate different models for each value of k ----
for (x in K_VALUES){
  model <- knn3(Species ~ ., data = train, k = x)
  pred_test <- predict(model, test, type = "class")
  pred_test_acc <- confusionMatrix(table(pred_test,
                                         test$Species))$overall["Accuracy"]
  test_acc <- c(test_acc, pred_test_acc)

  pred_train <- predict(model, train, type = "class")
  pred_train_acc <- confusionMatrix(table(pred_train,
                                          train$Species))$overall["Accuracy"]
  train_acc <- c(train_acc, pred_train_acc)
}

data <- data.table(x = K_VALUES, train = train_acc, test = test_acc)

# plot a validation curve ----
plot_data <- gather(data, "type", "value", -x)
g <- qplot(x = x,
           y = value,
           data = plot_data,
           color = type,
           geom = "path",
           xlim = c(max(K_VALUES),min(K_VALUES)-1))
print(g)

Теперь найдите k с хорошей точностью для ваших данных test, Это то значение, которое вы ищете.

Раскрытие информации: это упрощено, но этот подход должен помочь вам решить вашу проблему.

...