【问题标题】:How to find the optimal value for K in K-nearest neighbors using R?如何使用 R 在 K 近邻中找到 K 的最佳值?
【发布时间】:2020-04-23 17:58:27
【问题描述】:

我的数据集包含 5851 个观测值,并分为训练(3511 个观测值)和测试(2340 个观测值)集。我现在想用两个变量训练一个使用 KNN 的模型。我想做 10 倍 CV,重复 5 次,使用 ROC 度量和一标准误差规则,并对变量进行预处理。代码如下所示。

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 近邻,仅使用 total_policies 和 total_contrib 变量探索 k 的合理值。

【问题讨论】:

    标签: r knn training-data


    【解决方案1】:

    欢迎来到 Stack Overflow。你的问题不好回答。

    对于 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。这就是您要寻找的价值。

    披露:这很简单,但这种方法应该可以帮助您解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 2018-03-17
      • 2014-04-12
      相关资源
      最近更新 更多