如何正确使用 Pyspark 中的 ChiSquareTest 函数?

How to properly use the ChiSquareTest function in Pyspark?

我只是在做一些来自 https://www.mathsisfun.com/data/chi-square-test.html

的基本操作

你喜欢哪种宠物?

P值为0.043

我得到一个 pValue 数组:[0.157299207050285,0.157299207050285] 我不明白

from pyspark.ml.linalg import Vectors
from pyspark.ml.stat import ChiSquareTest

data = [(0.0, Vectors.dense(207, 282)),
        (1.0, Vectors.dense(231, 242))]
df = spark.createDataFrame(data, ["label", "features"])

r = ChiSquareTest.test(df, "features", "label").head()
print("pValues: " + str(r.pValues))
print("degreesOfFreedom: " + str(r.degreesOfFreedom))
print("statistics: " + str(r.statistics))

0.0 为男性,1.0 为女性

我做错了什么?

PySpark 的 ChiSquareTest 需要格式略有不同的输入数据。

如果我们假设以下特征编码:

  • 猫 = 0.0
  • 狗 = 1.0
  • 男性=2.0
  • 女性 = 4.0

每个特征出现的频率为:

  • 频率(猫,男)= 207
  • 频率(猫,女性)= 231
  • 频率(狗,男人)= 282
  • 频率(狗,女人)= 242

您需要将输入数据框重写为:

data = [(0.0, Vectors.dense(2.0)) for x in range(207)] + [(0.0, Vectors.dense(4.0)) for x in range(231)]\
        + [(1.0, Vectors.dense(2.0)) for x in range(282)] + [(1.0, Vectors.dense(4.0)) for x in range(242)]
df = spark.createDataFrame(data, ["label", "features"])

df.show()

# +-----+--------+
# |label|features|
# +-----+--------+
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# |  0.0|   [2.0]|
# +-----+--------+

如果您随后 运行 ChiSquareTest,您将看到预期的结果。

r = ChiSquareTest.test(df, "features", "label")

r.show(truncate=False)

# +---------------------+----------------+-------------------+
# |pValues              |degreesOfFreedom|statistics         |
# +---------------------+----------------+-------------------+
# |[0.04279386669738339]|[1]             |[4.103526475356584]|
# +---------------------+----------------+-------------------+