performance - 运行 caret::train() 以开发 kknn 模型时的性能预期
问题描述
我正在使用caret::train()函数开发一个加权 knn 分类模型 (kknn),它具有 10 倍交叉验证和一个tuneGrid ,其中包含 15 个kmax值、一个distance值和 3 个kernel值。
如果我正确理解了这个过程,那就是 450 次总迭代(迭代是计算给定kmax、distance和kernel组合的给定结果的概率)。 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)
解决方案
正如我们在评论中确定的那样,期望这种类型的运行时是合理的。有几个步骤可以减少这种情况;
- 运行你的代码
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
。至少这是我的经验。
推荐阅读
- python - 在 Django 模型实例中初始化附加对象并传递模型实例
- php - Alwaysdata如何获取数据库主机的IP地址?
- mapreduce - 如何检索文档的不同属性
- django-rest-framework - 使用 super().update() 更新对象
- python - 斐波那契记忆:无法理解 TypeError 的原因
- node.js - 如何修复 throw new Error('Can\'t set headers after they are sent.')
- apostrophe-cms - 如何根据 3rd 方 API 响应添加小部件字段?
- c++ - 将 chrono::duration 与整数进行比较
- gradle - 在 gradle 项目中设置 Allure 测试报告时出错
- python - 在 Python 2.7.6 中返回格式化列表的语法无效