运行 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 次迭代(迭代是计算给定结果的概率对于 kmax、distance 和内核)。 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 度量值