Как правильно использовать функцию ChiSquareTest в Pyspark? - PullRequest
0 голосов
/ 23 сентября 2019

Я просто делаю что-то простое из https://www.mathsisfun.com/data/chi-square-test.html

Какое животное вы предпочитаете?

Значение 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 - женщина

Что я делаю не так?

1 Ответ

1 голос
/ 24 сентября 2019

PySpark ChiSquareTest ожидает входные данные в несколько ином формате.

Если принять следующую кодировку функции:

  • Cat = 0.0
  • Dog =1,0
  • Мужчины = 2,0
  • Женщины = 4,0

И частота каждой функции как:

  • freq (Cat, Men) = 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]|
# +---------------------+----------------+-------------------+
...