我目前正在为我们需要逻辑回归的业务流程之一做概念验证。我一直在使用statsmodels glm对我们的数据集进行分类(按照下面的代码)。我们的数据集包含约1000万行和大约80个要素(其中,根据定义的分类变量,近70个是假人,例如“1”或“0”)。使用较小的数据集,glm可以正常工作,但是如果我对完整的数据集运行它,python将抛出错误“无法分配内存”。
glmmodel = smf.glm(formula, data, family=sm.families.Binomial())
glmresult = glmmodel.fit()
resultstring = glmresult.summary().as_csv()
这让我想到这可能是由于statsmodels被设计为利用所有可用的cpu内核,并且下面的每个子进程都将数据集的副本创建到RAM中(如果我弄错了,请更正我)。现在的问题是,是否有办法让glm仅使用最少数量的内核?我并不热衷于性能,而只是希望能够对完整的数据集运行glm。
供引用,以下是机器配置和一些其他信息(如果需要)。
CPU: 10 cores
RAM: 40 GB (usable/free ~25GB as there are other processes running on the
same machine)
swap: 16 GB
dataset size: 1.4 GB (based on Panda's DataFrame.info(memory_usage='deep')
最佳答案
GLM仅通过线性algbra库使用多重处理
以下内容从https://github.com/statsmodels/statsmodels/issues/2914复制了我的常见问题解答说明
它包括一些指向其他问题的链接,这些问题在此处显示。
(引用:)
Statsmodels在一些地方使用joblib在我们控制下的并行处理。当前用法主要用于 bootstrap ,并且不直接在模型中使用。
但是,一些numpy/scipy中的基础Blas/Lapack库也使用多核。这对于具有大数组的线性代数可能是有效的,但也会减慢运算速度,尤其是当我们想在更高级别上使用并行处理时。
我们如何限制线性代数库使用的核数?
这取决于使用哪个线性代数库。请参阅邮件列表线程
https://groups.google.com/d/msg/pystatsmodels/Lz9-In0pgPk/BtcYsj_ABQAJ
openblas:尝试设置环境变量OMP_NUM_THREADS = 1
在OSX上加速,设置VECLIB_MAXIMUM_THREADS
Anaconda中的mkl:
import mkl
mkl.set_num_threads(1)
关于python-3.x - 减少statsmodels glm的多处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47770106/