实际上,我在这一挑战中停留了几天,我想了解您对此的想法。我在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")
答案 0 :(得分:0)
IMO,问题出在函数calculate_chi
的第3行。您使用的矩阵表示形式不是分布式的,因此就内存和CPU而言,驱动程序节点是算法的瓶颈。我建议您考虑使用here中的分布式矩阵表示形式。由于可以分别对每列进行χ 2 测试,因此我认为您应该能够更好地利用群集的功能。