您好使用Statsmodels创建了OLS回归
我已经编写了一些代码,该代码循环遍历数据框中的每个变量,然后将其输入模型,然后将T Stat记录在新的数据框中,并建立潜在变量的列表。
但是我有20,000个变量,因此每次运行都要花一些时间。
谁能想到更好的方法?
这是我目前的做法
TStatsOut=pd.DataFrame()
for i in VarsOut:
try:
xstrout='+'.join([baseterms,i])
fout='ymod~'+xstrout
modout = smf.ols(fout, data=df_train).fit()
j=pd.DataFrame(modout.pvalues,index=[i],columns=['PValue'])
k=pd.DataFrame(modout.params,index=[i],columns=['Coeff'])
s=pd.concat([j, k], axis=1, join_axes=[j.index])
TStatsOut=TStatsOut.append(s)
答案 0 :(得分:0)
关于您的问题,这就是我所发现的。我的答案使用了var1: '"fred"'
var2: '"barney"'
var3: '"wilma"'
进行分布式计算的方法,并且只是对当前方法进行了一般性的清理。
我制作了一个较小的伪数据集,其中包含1000个变量,一个将是结果,而两个将是dask
,因此实际上有997个变量可以循环。
baseterms
当前代码的基准(20s +-858ms):
import dask
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
#make some toy data for the case you showed
df_train = pd.DataFrame(np.random.randint(low=0,high=10,size=(10000, 1000)))
df_train.columns = ['var'+str(x) for x in df_train.columns]
baseterms = 'var1+var2'
VarsOut = df_train.columns[3:]
为提高可读性创建了一个函数,但仅返回了pval和每个测试的变量而不是一行数据帧的回归系数。
%%timeit
TStatsOut=pd.DataFrame()
for i in VarsOut:
xstrout='+'.join([baseterms,i])
fout='var0~'+xstrout
modout = smf.ols(fout, data=df_train).fit()
j=pd.DataFrame(modout.pvalues,index=[i],columns=['PValue'])
k=pd.DataFrame(modout.params,index=[i],columns=['Coeff'])
s=pd.concat([j, k], axis=1, join_axes=[j.index])
TStatsOut=TStatsOut.append(s)
现在运行时间为(14.1s +-982ms)
def testVar(i):
xstrout='+'.join([baseterms,i])
fout='var0~'+xstrout
modout = smf.ols(fout, data=df_train).fit()
pval=modout.pvalues[i]
coef=modout.params[i]
return pval, coef
使用Dask延迟进行并行处理。请记住,创建的每个延迟任务也会造成轻微的开销,因此有时它可能没有好处,但将取决于您的确切数据集以及回归所需的时间。我的数据示例可能太简单了,无法显示出任何好处。
%%timeit
pvals=[]
coefs=[]
for i in VarsOut:
pval, coef = testVar(i)
pvals.append(pval)
coefs.append(coef)
TStatsOut = pd.DataFrame(data={'PValue':pvals, 'Coeff':coefs},
index=VarsOut)[['PValue','Coeff']]
现在运行997个候选变量,并创建一个延迟了dask的相同数据框。 (18.6s +-588ms)
#define the same function as before, but tell dask how many outputs it has
@dask.delayed(nout=2)
def testVar(i):
xstrout='+'.join([baseterms,i])
fout='var0~'+xstrout
modout = smf.ols(fout, data=df_train).fit()
pval=modout.pvalues[i]
coef=modout.params[i]
return pval, coef
同样,迟钝的延迟会创建更多的开销,因为它将创建要在许多处理器之间发送的任务,因此,性能的提高将取决于数据实际进行回归的时间以及可用的CPU数量。 Dask可以从单个工作站扩展到一组工作站。