python计算方差膨胀因子_如何通过spark(pySpark)加速VIF(方差膨胀因子)

我需要从数据中减少维度的数量。我想用VIF。我的数据目前是800000+行和300+列。在

我在Azure上使用spark on databricks平台,Python作为我的首选编程语言。不过,如果有R解决方案,我会很高兴的。在

我使用下面的代码来计算VIF。但是,因为它是在for循环中运行的,所以它不是并行运行的。我已经尝试过用rdd映射替换for循环,方法是将列范围存储为rdd,并使用lambda函数并行运行所有线性模型。但是它给了我一个错误,即不能从worker节点调用spark实例。在def vif_cal_iter(inputdata,vif_threshold):

xvar_names = inputdata.columns

vif_max = vif_threshold + 1

def vif_cal(inputdata, xvar_names, vif_max, colnum_max, vif_threshold):

vif_max = vif_threshold

for i in range(2,len(xvar_names)):

train_t = inputdata.rdd.map(lambda x: [Vectors.dense(x[3:i]+x[i+2:]), x[i]]).toDF(['features', 'label'])

lr = LinearRegression(featuresCol = 'features', labelCol = 'label', maxIter=2)

lr_model = lr.fit(train_t)

r_sq = lr_model.summary.r2

vif=1/(1-r_sq)

if vif_max < vif:

vif_max = vif

colnum_max = i

return vif_max, colnum_max

while vif_max > 5:

vif_max, colnum_max = vif_cal(inputdata, xvar_names, vif_max, colnum_max, vif_threshold)

if vif_max > vif_threshold:

print("Start of If Block")

inputdata = inputdata.drop(inputdata[colnum_max])

else:

return inputdata

在当前的形式下,代码运行需要很多时间,仅5%的数据就需要20多个小时。我需要通过VIF函数运行5%以上的数据,以更少的时间。在

提前谢谢你的帮助。在

你可能感兴趣的:(python计算方差膨胀因子)