如何在 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?必须有某种方法可以做到这一点,因为ElasticNetCVn_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逻辑回归中设置样本权重?

sklearn中的逻辑回归

如何在 sklearn 0.14 版中设置“class_weight”?

Lasso_ElasticNet_PolynomialFeatures算法介绍---人工智能工作笔记0032

Python 3:NameError:未定义名称“sklearn”