如何在 sklearn ElasticNet 中设置“n_jobs”
Posted
技术标签:
【中文标题】如何在 sklearn ElasticNet 中设置“n_jobs”【英文标题】:How to set `n_jobs` in sklearn ElasticNet 【发布时间】:2021-12-28 03:55:35 【问题描述】:我正在尝试在具有多个 CPU 的机器上运行来自 scikit-learn
的 ElasticNet function。但是,我需要 ElasticNet 拟合仅使用一个 CPU,因为我需要在剩余的 CPU 上并行运行其他拟合例程。每当包含ElasticNet
的线程开始拟合时,它就会迅速接管所有CPU 上的任何空闲空间,而不仅仅是它所调用的那个。因为其他代码例程已经在这些机器上运行,ElasticNet
超额订阅了机器并大大减慢了一切,包括它自己。我需要这些例程并行运行,所以我不能只提前连续运行ElasticNet
fit。
与sklearn
中的其他回归函数(线性、逻辑...)不同,ElasticNet
没有 n_jobs
参数。读取the documentation,似乎ElasticNet
默认为joblib.parallel_backend
中指定的n_jobs
,而joblib.parallel_backend
本身默认为n_jobs=-1
,这是所有可用的CPU。
我正在尝试找出在parallel_backend
中指定n_jobs
的正确方法,以便它将覆盖ElasticNet
的默认值。以下是更改 n_jobs
的三项尝试,但目前尚未奏效。
尝试 1
from joblib import parallel_backend
from sklearn.linear_model import ElasticNet
with parallel_backend('loky', n_jobs=1):
model = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, fit_intercept=False,
normalize=False, copy_X=True, max_iter=10000, tol=10,
random_state=42, precompute=False, warm_start=False,
positive=False, selection='cyclic')
model.fit(predictors, response)
尝试 2
from sklearn.utils import parallel_backend
from sklearn.linear_model import ElasticNet
with parallel_backend('loky', n_jobs=1):
model = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, fit_intercept=False,
normalize=False, copy_X=True, max_iter=10000, tol=10,
random_state=42, precompute=False, warm_start=False,
positive=False, selection='cyclic')
model.fit(predictors, response)
尝试 1 和尝试 2 都没有抛出任何错误,而且似乎也没有改变 n_jobs
使用每个可用 CPU 的默认值。 ElasticNet
仍然接管所有 CPU 上的所有可用 CPU 空间,并迅速超额订阅机器。
尝试 3
这是我第一次直接使用joblib
,所以我一直在阅读the documentation 关于joblib 的并行化。大多数放在parallel_backend
容器中的示例例程都以Parallel()
helper class 开头。
根据示例,我通过以下方式修改了尝试 1:
from joblib import parallel_backend
from sklearn.linear_model import ElasticNet
with parallel_backend('loky', n_jobs=1):
model = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, fit_intercept=False,
normalize=False, copy_X=True, max_iter=10000, tol=10,
random_state=42, precompute=False, warm_start=False,
positive=False, selection='cyclic')
Parallel(n_jobs=1)(model.fit(predictors, response))
但是在运行尝试 3 时,我收到以下错误消息:
TypeError: 'ElasticNet' object is not iterable
有谁知道如何为sklearn的ElasticNet
设置n_jobs=1
?必须有某种方法可以做到这一点,因为ElasticNetCV
有n_jobs
作为可能的参数。非常感谢您提供任何帮助!
【问题讨论】:
here 接受的答案可以帮助吗? 谢谢阿米奥拉!我想不出一种设置全局变量的方法,因为我在所有机器上都运行 python,而且我不想强制这些作业只在一台机器上连续运行。 【参考方案1】:除了第一种方案,可以手动设置MKL_NUM_THREADS=1
by
import mkl
mkl.set_num_threads(1)
【讨论】:
以上是关于如何在 sklearn ElasticNet 中设置“n_jobs”的主要内容,如果未能解决你的问题,请参考以下文章
Python使用sklearn构建ElasticNet回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型
如何在 sklearn 0.14 版中设置“class_weight”?