并行勺中的Python线性回归

2024-09-14 18:00:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试并行运行一个超过10000000个数据点(4个特性,1个目标变量)的线性回归,这些数据点是使用Python的Scoop库从正态分布中随机生成的。代码如下:

import pandas as pd
import numpy as np
import random
from scoop import futures
import statsmodels.api as sm
from time import time

def linreg(vals):
    global model
    model = sm.OLS(y_vals,X_vals).fit()
    return model
    print(model.summary())    

if __name__ == '__main__':

random.seed(42)
vals = pd.DataFrame(np.random.normal(loc = 3, scale = 100, size =(10000000,5)))
vals.columns = ['dep', 'ind1', 'ind2', 'ind3', 'ind4']
y_vals = vals['dep']
X_vals = vals[['ind1', 'ind2', 'ind3', 'ind4']]

bt = time()
model_vals = list(map(linreg, [1,2,3]))
mval = model_vals[0]
print(mval.summary())
serial_time = time() - bt

bt1 = time()
model_vals_1 = list(futures.map(linreg, [1,2,3]))
mval_1 = model_vals_1[0]
print(mval_1.summary())
parallel_time = time() - bt1

print(serial_time, parallel_time)`

然而,在这之后,回归摘要确实是通过Python的标准map函数以串行方式生成的,这是一个错误:

Traceback (most recent call last): File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\runpy.py", line 193, in _run_module_as_main "main", mod_spec) File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\runpy.py", line 85, in _run_code exec(code, run_globals) File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\bootstrap__main__.py", line 302, in b.main() File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\bootstrap__main__.py", line 92, in main self.run() File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\bootstrap__main__.py", line 290, in run futures_startup() File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\bootstrap__main__.py", line 271, in futures_startup run_name="main" File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\futures.py", line 64, in _startup result = _controller.switch(rootFuture, *args, **kargs) File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop_control.py", line 253, in runController raise future.exceptionValue File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop_control.py", line 127, in runFuture future.resultValue = future.callable(*future.args, **future.kargs) File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\runpy.py", line 263, in run_path pkg_name=pkg_name, script_name=fname) File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\runpy.py", line 96, in _run_module_code mod_name, mod_spec, pkg_name, script_name) File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\runpy.py", line 85, in _run_code exec(code, run_globals) File "Scoop_map_linear_regression1.py", line 33, in model_vals_1 = list(futures.map(linreg, [1,2,3])) File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\futures.py", line 102, in _mapGenerator for future in _waitAll(*futures): File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\futures.py", line 358, in _waitAll for f in _waitAny(future): File "C:\Users\niccolo.gentile\AppData\Local\Continuum\anaconda3\envs\tensorenviron\lib\site-packages\scoop\futures.py", line 335, in _waitAny raise childFuture.exceptionValue NameError: name 'y_vals' is not defined

是后来制作的。这意味着代码停止在model_vals_1 = list(futures.map(linreg, [1,2,3]))

请注意,为了能够并行运行代码,必须从指定-m scoop参数的命令行启动它,如下所示:

^{pr2}$

实际上,如果它在没有-m scoop参数的情况下启动,它将不会被并行化,并且实际上会运行,但只需使用内置Python的map函数的两倍(因此,串行运行两次),就像警告中报告的那样。也就是说,在启动时没有指定-m scoop参数,期货.map将被map替换,而目标是使用期货.map. 在

这样做是为了避免人们回答说,他们只需启动不带-m scoop参数的代码就解决了问题,正如这里已经发生的那样:

Python Parallel Computing - Scoop

因此,这个问题被错误地搁置了,因为没有更多的可重复性。在

在此之前,我们非常感谢您的宝贵意见。在


Tags: inpylocallineusersappdatafilecontinuum
1条回答
网友
1楼 · 发布于 2024-09-14 18:00:27

解决方案是通过,作为期货.map(但不一定是map),只有[1]。在

实际上,即使linreg函数不使用传递给map的第二个参数,它仍然决定linreg函数将运行多少次。作为一个示例,考虑以下基本示例:

def welcome(x):
    print('Hello world!')

if __name__ == '__main__':
    a = list(map(welcome, [1,2]))

函数welcome实际上不需要任何参数,但输出仍然是

^{pr2}$

重复两次,即作为第二个参数传递的列表的长度。在

在这种特定的情况下,这意味着线性回归将按map运行3次,尽管在map之外调用摘要时回归输出只会出现一次。在

关键是,相反,不可能用期货.map. 问题在于,显然,在第一次运行之后,它实际上删除了使用过的数据集,从中无法继续进行第二次和第三次运行,并且

NameError: name 'y_vals' is not defined

被扔在痕迹的尽头。通过浏览:scoop.futures source code

我没有把所有的问题都讲一遍,但我想问题应该与绿叶菜的转换有关。在

相关问题 更多 >