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

如何在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

我只是在做一些基本的事情

你喜欢哪种宠物

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))]
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无法处理。谢谢你,我很感激。