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=-1
和XGBClassifier()
呢?两个函数都设置这个参数有意义吗?
【问题讨论】:
【参考方案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 和交叉验证并行的主要内容,如果未能解决你的问题,请参考以下文章
R语言构建xgboost模型:交叉验证(cross validation)训练xgboost模型
R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能
在 SciKit-Learn 中使用 XGBoost 交叉验证进行网格搜索和提前停止