Mio*_*Mio 6 python-3.x statsmodels
我目前正在为我们需要逻辑回归的业务流程做一个概念验证.我一直在使用statsmodels glm来对我们的数据集进行分类(如下面的代码所示).我们的数据集包括~10M行和大约80个特征(其中大约70多个是假人,例如基于定义的分类变量的"1"或"0").使用较小的数据集,glm工作正常,但是如果我针对完整的数据集运行它,python会抛出错误"无法分配内存".
glmmodel = smf.glm(formula, data, family=sm.families.Binomial())
glmresult = glmmodel.fit()
resultstring = glmresult.summary().as_csv()
Run Code Online (Sandbox Code Playgroud)
这让我觉得这可能是因为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')
Run Code Online (Sandbox Code Playgroud)
GLM仅通过线性algbra库使用多重处理
以下内容从https://github.com/statsmodels/statsmodels/issues/2914复制了我的FAQ问题描述, 其中包括一些指向其他问题的链接,这些链接在此处显示。
(引用:)
Statsmodels在一些地方使用joblib在我们控制下的并行处理。当前用法主要用于引导程序,并且不直接在模型中使用。
但是,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)
Run Code Online (Sandbox Code Playgroud)