如何正确使用 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]|
# +---------------------+----------------+-------------------+
我只是在做一些来自 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]|
# +---------------------+----------------+-------------------+