如何在Spark中使用Dataframes进行相关性分析?

8

Spark 2.2.0 adds相关性支持到数据框架中。 有关更多信息,请参见pull request

MLlib 基于DataFrame的API中新增了一些算法:

SPARK-19636: 基于DataFrame的API中的相关性(Scala/Java/Python)

然而,如何使用此更改或与以前版本相比发生了什么变化完全不清楚。

我期望得到类似于:

df_num = spark.read.parquet('/dataframe')
df_cat.printSchema()
df_cat.show()
df_num.corr(col1='features', col2='fail_mode_meas')

root
 |-- features: vector (nullable = true)
 |-- fail_mode_meas: double (nullable = true)


+--------------------+--------------+
|            features|fail_mode_meas|
+--------------------+--------------+
|[0.0,0.5,0.0,0.0,...|          22.7|
|[0.9,0.0,0.7,0.0,...|           0.1|
|[0.0,5.1,1.0,0.0,...|           2.0|
|[0.0,0.0,0.0,0.0,...|           3.1|
|[0.1,0.0,0.0,1.7,...|           0.0|
...

pyspark.sql.utils.IllegalArgumentException: 'requirement failed: Currently correlation calculation for columns with dataType org.apach
e.spark.ml.linalg.VectorUDT not supported.'

有人能解释一下如何利用Spark 2.2.0中的数据帧相关性新功能吗?

2个回答

1

没有一种直接可用的方法来实现你想要的。在 pyspark.ml.stat 中有实现 SPARK-19636 方法的 Python 封装程序:

from pyspark.ml.stat import Correlation

Correlation.corr(df_cat, "features")

但是这种方法用于计算单个Vector列的相关矩阵。
您可以:
- 使用VectorAssembler组装featuresfail_mode_meas,然后应用pyspark.ml.stat.Correlation,但它会计算一些过时的值。 - 展开向量列并使用pyspark.sql.functions.corr,但对于大量列来说会很昂贵,并且在与Python udf一起使用时会增加显着的开销。

非常感谢。将特征向量与另一列一起组装以进行相关性分析是最佳选择。即使有开销,它也比将DF转换为pandas更快。另一方面,扩展向量列则非常缓慢。 - y.selivonchyk
1
@yauheni_selivonchyk - 你能否请发一下你是如何实现的。这会是一个很大的帮助。谢谢。基本上是使用VectorAssembler组装特征和失败模式测量值 – 这一部分。 - Satya
org.apache.spark.sql.AnalysisException: 给定输入列无法解析“features”。 - DachuanZhao

0

尝试使用以下方法获取所有变量之间的相关性-

from pyspark.mllib.stat import Statistics
corr_mat=Statistics.corr(features, method="pearson")

从Spark 2.2.0开始可用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接