python - 在哪里设置 n_job : estimator or GridSearchCV?

标签 python machine-learning scikit-learn gridsearchcv

我经常用 GridSearchCV 用于超参数调整。例如,用于调整正则化参数 CLogistic Regression .每当我使用的估算器有自己的 n_jobs参数我很困惑在哪里设置它,在估计器中还是在 GridSearchCV 中,或两者兼而有之?同样的事情适用于 cross_validate .

最佳答案

这是一个非常有趣的问题。我没有明确的答案,但有一些值得一提的元素可以理解这个问题,不要在评论中冷嘲热讽。

让我们从为什么应该或不应该使用 multiprocessing 开始:

  • 多处理对于独立任务很有用。在 GridSearch 中就是这种情况,其中模型的所有不同变体都是独立的。
  • 在以下情况下,多处理没有用/使事情变慢:
  • 任务太小:创建一个新进程需要时间,如果你的任务真的很小,这个开销会减慢整个代码的执行速度
  • 产生了太多进程:您的计算机的内核数量有限。如果您的进程数多于内核数,负载平衡机制将强制计算机定期切换正在运行的进程。这些切换需要一些时间,导致执行速度较慢。

  • 第一个要点是你不应该在 GridSearch 中使用 n_jobs以及您正在优化的模型,因为您将产生大量进程并最终减慢执行速度。

    现在,很多 sklearn 模型和函数都是基于 Numpy/SciPy 的,而 Numpy/SciPy 通常是用 C/Fortran 实现的,因此已经使用了多处理。这意味着这些不应该与 n_jobs 一起使用>1套在GridSearch .

    如果您假设您的模型尚未并行化,您可以选择设置 n_jobs在模型级别或在 GridSearch等级。一些模型能够完全并行化(例如 RandomForest),但大多数模型可能至少有一些是顺序的(例如 Boosting)。在另一端,GridSearch设计上没有顺序组件,因此设置 n_jobs 是有意义的。在 GridSearch而不是在模型中。

    话虽如此,这取决于模型的实现,如果不为自己的案例进行测试,您将无法获得明确的答案。例如,如果管道由于某种原因消耗了大量内存,则设置 n_jobsGridSearch可能会导致内存问题。

    作为补充,这里有一个很有趣的note on parallelism in sklearn

    关于python - 在哪里设置 n_job : estimator or GridSearchCV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62041999/

    相关文章:

    python - 使用标签传播/传播对具有多个标签的数据帧训练缺失标签

    python - 如何从 JSON 获取字符串对象而不是 Unicode

    performance - Matlab 中的高效分类

    python - 如何将一个数据帧分割成多个,然后将其重新拼接到一个元组中,而无需进行硬编码

    apache-spark - python Spark : narrowing down most relevant features using PCA

    machine-learning - 为什么手写数字分类的主成分过多会导致准确率降低

    Scikit-Learn:在交叉验证期间避免数据泄漏

    python - 如何保存和恢复我的sklearn模型?

    Python没有抛出缩进错误,但没有执行代码

    python - 有没有支持对象消息传递的Python包?