XGBoost 和交叉验证并行

Posted

技术标签:

【中文标题】XGBoost 和交叉验证并行【英文标题】:XGBoost and cross-validation in parallel 【发布时间】:2019-11-16 04:38:12 【问题描述】:

我看到XGBClassifier()sklearn.model_selection.RandomizedSearchCV() 都有参数n_jobs。我执行了 CV,我看到通过设置 n_jobs = -1(在两者中)我利用了我拥有的 16 个工人:

Fitting 5 folds for each of 30 candidates, totalling 150 fits
[Parallel(n_jobs=-1)]: Using backend LokyBackend with 16 concurrent workers.
[Parallel(n_jobs=-1)]: Done   9 tasks      | elapsed: 13.7min
[Parallel(n_jobs=-1)]: Done  18 tasks      | elapsed: 20.4min
[Parallel(n_jobs=-1)]: Done  29 tasks      | elapsed: 23.7min
[Parallel(n_jobs=-1)]: Done  40 tasks      | elapsed: 28.7min
[Parallel(n_jobs=-1)]: Done  53 tasks      | elapsed: 36.1min
[Parallel(n_jobs=-1)]: Done  66 tasks      | elapsed: 43.4min
[Parallel(n_jobs=-1)]: Done  81 tasks      | elapsed: 47.6min
[Parallel(n_jobs=-1)]: Done  96 tasks      | elapsed: 50.8min
[Parallel(n_jobs=-1)]: Done 113 tasks      | elapsed: 60.0min
[Parallel(n_jobs=-1)]: Done 135 out of 150 | elapsed: 73.1min remaining: 8.1min
[Parallel(n_jobs=-1)]: Done 150 out of 150 | elapsed: 85.7min finished

我现在不能重复分析,但我假设发生并行化是因为RandomizedSearchCV() 中的n_jobs=1

我对并行计算知之甚少。我知道RandomizedSearchCV() 独立运行每个参数设置,但是在并行化时它是如何具体工作的?那么n_jobs=-1XGBClassifier() 呢?两个函数都设置这个参数有意义吗?

【问题讨论】:

【参考方案1】:

问:在两个函数中都设置这个参数有意义吗?

一个简短的版本:不,它没有。

较长的版本需要了解一下 n_jobs 的实际处理方式。

拥有一些昂贵的资源(对,CPU 内核本身,最快和最昂贵的 CPU 内核本地缓存层次结构元素(在此不深入研究缓存行及其各自的关联性) level ) 和更便宜且速度更慢的 RAM-memory ),n_jobs = -1 指令在执行的第一个调用签名中将简单地一次获取所有这些资源。

这意味着,对于任何“更深”级别的尝试使用-再次-“尽可能多的资源”作为物理可用的资源(n_jobs = -1 确实如此),将不会有合理的“免费”资源并再次遵守这一点,但是没有第一个未使用的“免费”,在极度“超额订阅”(对于这么少的真实任务超载队列(因此​​绝不是免费的)中只会造成严重破坏。任何不久的将来)资源来利用)O / S的并发任务调度器的调度尝试映射/驱逐/映射/驱逐/映射/驱逐因此在相同的真实(并且已经非常繁忙)硬件元素上进行更多处理作业。

通常即使是第一次尝试也可能在 RAM 分配方面产生麻烦,因为大型模型将需要在进程实例化期间在所有 RAM 数据结构中进行多次复制(有效地使用所有对象制作整个副本,使用或未使用,复制到每个新进程中),因为 CPU 核心的数量“决定”。由此产生的内存交换绝对是您永远不想重复的事情。

享受模型 HyperParameters 的调优 - 这是机器学习实践的精华。值得擅长。

【讨论】:

非常感谢您的回复。我仍然不清楚在RandomizedSearchCV()XGBClassifier() 之间分配不同比例的工人是否会有任何区别。不幸的是,我现在无法运行这个测试,但即使是它的直觉也会受到赞赏。 总是欢迎,@Alessandro 重点是,鉴于您的代码坚持使用所有资源,实际上是所有资源来处理任务 A,将没有资源可用于处理任务 B。类比是,使用资源拆分对于为任务-B(搜索)保留部分资源没有意义,因为任务-B 取决于已完成任务-A(学习者已完成的 .fit()-phase ) .因此,减少第一次完成任务 A 的资源也没有任何好处( .fit() 尽快执行,因为人们无法在 .fit() 之前在“外部”*CV() 测试中对其进行测试完成)

以上是关于XGBoost 和交叉验证并行的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用交叉验证训练 xgboost 模型时跟踪进度?

R语言构建xgboost模型:交叉验证(cross validation)训练xgboost模型

R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能

在 SciKit-Learn 中使用 XGBoost 交叉验证进行网格搜索和提前停止

将 XGBoost eval_metric 交叉验证计算与权重匹配

使用带有管道和 GridSearch 的 cross_val_score 进行嵌套交叉验证