我需要减少数据中的维数。我想为此使用VIF。我的数据目前是800,000+行和300+列。
我在Azure的databricks平台上使用Spark作为首选编程语言。但是,如果有R解决方案,我将感到满意。
我使用以下代码来获取VIF计算。但是,由于它在for循环中运行,因此不能并行运行。我已经尝试通过将列范围存储为rdd并使用lambda函数并行运行所有线性模型来用rdd映射替换loop。但是,这给了我一个错误,您无法从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%的数据。
预先感谢您的帮助。