如何通过Spark(pySpark)加快VIF(方差膨胀因子)

时间:2019-06-25 00:19:52

标签: python apache-spark pyspark

我需要减少数据中的维数。我想为此使用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%的数据。

预先感谢您的帮助。

0 个答案:

没有答案