运行 caret::train() 以开发 kknn 模型时的性能预期

Posted

技术标签:

【中文标题】运行 caret::train() 以开发 kknn 模型时的性能预期【英文标题】:Performance expectations when running caret::train() to develop a kknn model 【发布时间】:2021-06-16 09:58:29 【问题描述】:

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

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

了解影响性能的变量数不胜数,如果在配备 8 核 3GHz Intel 处理器和 32GB RAM 的电脑上运行 train 函数,我可以合理地预期需要多长时间? p>

目前每次折叠大约需要 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)

【问题讨论】:

您是在 Widows、OSX 还是 Linux 上运行?另外,为什么不并行运行呢? 编辑另外请记住,tune.grid 运行,例如,kmax = 11 10 次,每个 kernel;这继续。所以我不相信450次迭代是正确的。 它在 Windows 上运行。我想我的问题是,我应该并行运行吗?它似乎并不那么苛刻,除非我误解了幕后发生的事情,当您说 kmax = 11 导致每个内核进行 10 次迭代时,这似乎是您所暗示的。我不确定我是否理解。虽然文档将 kmax 定义为最大邻居数,但 kmax 也可用于指定特定 k 值的范围或序列。因此,我的代码创建的 tuneGrid 有 45 行(条目),列出了每个折叠的 45 种可能的参数组合。 首先,Windows 的定义很慢,除非您使用来自另一个星球的宇宙飞船和组件,Windows 与 R 兼容。无论如何,无论组合如何,您都可以尝试慢慢扩展您的数据。从 1/10 开始,看看需要多长时间。挺折腾的,​​你问我应该并行吧! Serkan,感谢您的想法。 【参考方案1】:

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

    parallel 中运行您的代码 使用更高效的操作系统;喜欢Linux 你的trainControl()更高效,真的有必要returnResamps=TRUE吗?控制这些有小收获。

显然,第一个是显而易见的。对于第二个,我可以找到发誓linux 的计算机工程师与发誓windows 的计算机工程师一样多。说服我切换到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 的同一台机器上运行得更快。至少这是我的经验。

【讨论】:

Serkan,感谢您的建议。我会试试的。在这一点上,我认为我们已经确定并行运行代码会产生重​​大影响,因为我们都没有真正做到这一点。我会试试的。 至于 Linux,我不认为我们已经确定在这种情况下使用 Linux 代替 Windows 会产生重大影响。当您尝试在 Linux 上运行代码时,您的运行时间实际上比我更长,而且系统资源相当。 怎么样?你有 3 Ghz,我有 2.4 ghz - 很明显我会有更长的运行时间!或者我在这里错过了什么? 并行运行 帮助....但是为了出售参数,我将在今晚运行它。在所有核心上 - 只是因为... OK - 所以,我现在开始创建模型。但是,RAM 使用量正在缓慢攀升,所以我非常怀疑它是否会在明天完成。如果它在夜间崩溃我会删除trainControl() 中的冗余参数并在明天晚上再次运行。

以上是关于运行 caret::train() 以开发 kknn 模型时的性能预期的主要内容,如果未能解决你的问题,请参考以下文章

R caret train glmnet 最终模型 lambda 值与指定不符

R:glmnet 的 caret::train 函数可以在固定的 alpha 和 lambda 交叉验证 AUC 吗?

R 理解来自 kernlab 的 caret train(tuneLength = ) 和 SVM 方法

Caret train 方法抱怨出问题了;缺少所有 RMSE 度量值

R - Caret train()“错误:停止”,“并非在新数据中找到的对象中使用的所有变量名称”

在 R 中使用插入符号训练模型的时机