首页 > 解决方案 > 运行 caret::train() 以开发 kknn 模型时的性能预期

问题描述

我正在使用caret::train()函数开发一个加权 knn 分类模型 (kknn),它具有 10 倍交叉验证和一个tuneGrid ,其中包含 15 个kmax值、一个distance值和 3 个kernel值。

如果我正确理解了这个过程,那就是 450 次总迭代(迭代是计算给定kmaxdistancekernel组合的给定结果的概率)。 x有大约 480,000 个数据点(6 个预测变量,每个有大约 80,000 个观测值),y有大约 80,000 个数据点。

了解有无数变量会影响性能,如果在具有 8 核 3GHz Intel 处理器和 32GB RAM 的 pc 上运行,我可以合理地期望train函数需要多长时间?

目前每次折叠大约需要 70 分钟,也就是每次迭代大约需要 1.5 分钟。这是合理的,还是过度的?

这是一个kknn学习练习。我意识到还有其他类型的算法可以更有效地产生更好的结果。

这是基本代码:

x <- as.matrix(train_set2[, c("n_launch_angle", "n_launch_speed", "n_spray_angle_Kolp", "n_spray_angle_adj", "n_hp_to_1b", "n_if_alignment")])
y <- train_set2$events
set.seed(1)
fitControl <- trainControl(method = "cv", number = 10, p = 0.8, returnData = TRUE,
                           returnResamp = "all", savePredictions = "all",
                           summaryFunction = twoClassSummary, classProbs = TRUE, 
                           verboseIter = TRUE)
tuneGrid <- expand.grid(kmax = seq(11, 39, 2), 
                        distance = 2, 
                        kernel = c("triangular", "gaussian", "optimal"))
kknn_train <- train(x, y, method = "kknn", 
                    tuneGrid = tuneGrid, trControl = fitControl)

标签: performanceclassificationcross-validationr-caretknn

解决方案


正如我们在评论中确定的那样,期望这种类型的运行时是合理的。有几个步骤可以减少这种情况;

  1. 运行你的代码parallel
  2. 使用更高效的操作系统;喜欢Linux
  3. 在你的效率更高trainControl(),真的有必要returnResamps=TRUE吗?在控制这些方面有小的收益。

显然,第一个是不费吹灰之力的。对于第二个,我可以找到发誓的计算机工程师和发誓的计算机工程师一样linuxwindows。说服我改用 的Linux,是这个特殊的测试,我希望它能给你带来它给我的东西。

# Calculate distance matrix
test_data <- function(dim, num, seed = 1903) {
    
    set.seed(seed)
    
    dist(
        matrix(
            rnorm(dim * num), nrow = num
        )
    )
    
    
    
}


# Benchmarking
microbenchmark::microbenchmark(test_data(120,4500))

这段代码只是在运行的完全相同的机器上运行得更快Linux。至少这是我的经验。


推荐阅读