如何在Pyspark中正确使用ChiSquareTest函数?
我只是在做一些基本的事情 你喜欢哪种宠物 p值为0.043 我得到一个pValues数组:[0.157299207050285,0.157299207050285] 我不明白如何在Pyspark中正确使用ChiSquareTest函数?,pyspark,p-value,chi-squared,Pyspark,P Value,Chi Squared,我只是在做一些基本的事情 你喜欢哪种宠物 p值为0.043 我得到一个pValues数组:[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))] d
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希望输入数据的格式略有不同 如果我们假设以下特征编码:
- Cat=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]|
# +---------------------+----------------+-------------------+
PySpark的ChiSquareTest希望输入数据的格式略有不同 如果我们假设以下特征编码:
- Cat=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]|
# +---------------------+----------------+-------------------+
好的,所以ChiSquareTest也会对元素进行计数。谢谢,如果我想按比例计算,然后在其他地方计算呢?数百万行?就可扩展性而言,Spark可以处理数百万行。我经常在一台机器上处理数十亿行的Spark计算。如果在其他地方进行计数,那么最好使用类似于
scipy.stats.chi2\u意外事件的替代实现。很可能你的列联表太大了,以至于scipy无法处理。谢谢你,我很感激。好的,ChiSquareTest也可以计算元素。谢谢,如果我想按比例计算,然后在其他地方计算呢?数百万行?就可扩展性而言,Spark可以处理数百万行。我经常在一台机器上处理数十亿行的Spark计算。如果在其他地方进行计数,那么最好使用类似于scipy.stats.chi2\u意外事件的替代实现。你不太可能有这么大的列联表,以至于scipy无法处理。谢谢你,我很感激。