使用特征对序列计算Spark上的卡方

时间:2018-07-09 04:12:19

标签: apache-spark pyspark chi-squared

实际上,我在这一挑战中停留了几天,我想了解您对此的想法。我在pyspark中有一个大数据框,具有约150个功能。每行属于一个人,每个单元格的值是0或1。我有兴趣知道这些功能之间是否存在任何关联。由于这些功能是分类的,因此我选择了卡方独立性检验。

对于每对,我都使用Crosstab创建了列联表,然后将corsstab输出转换为密集矩阵,并计算每对的p值。对于小规模,它可以工作,但对于大数据量,代码可以长时间运行,并且我认为效率不高。问题在于,由于我需要所有功能的组合,因此计算量会成倍增加。

您建议采用哪种方法来获得更好的性能?

def calculate_chi(df, col1, col2):
   test = df.crosstab(col2, col1) 
   vals = test.rdd.map(lambda x:[x[1],x[2]]).flatMap(lambda y: y).collect()
   Matrix = Matrices.dense(2, 2, vals)
   return Statistics.chiSqTest(Matrix).pValue

if __name__=="__main__":
   spark = SparkSession.builder.getOrCreate()
   df=spark.read.option("header",True).csv("s3a://*.csv")
   df = df.select(selected_cols)
   data = []
   cols =  combinations(df.columns,2)
   for c in cols:
      data.append((str(c), calculate_chi(df, c[0],c[1])))
   df_results = spark.createDataFrame(data, ["feature_pair","pvalue"])
   df_results.coalesce(1).write.format('csv').options(header='true').save("s3a://chiSqTest")

1 个答案:

答案 0 :(得分:0)

IMO,问题出在函数calculate_chi的第3行。您使用的矩阵表示形式不是分布式的,因此就内存和CPU而言,驱动程序节点是算法的瓶颈。我建议您考虑使用here中的分布式矩阵表示形式。由于可以分别对每列进行χ 2 测试,因此我认为您应该能够更好地利用群集的功能。