ChiSqSelector выбирает неправильную функцию? - PullRequest
0 голосов
/ 20 февраля 2019

Я копирую вставленный этот пример из документов в моей Spark 2.3.0 оболочке.

import org.apache.spark.ml.feature.ChiSqSelector
import org.apache.spark.ml.linalg.Vectors

val data = Seq(
  (7, Vectors.dense(0.0, 0.0, 18.0, 1.0), 1.0),
  (8, Vectors.dense(0.0, 1.0, 12.0, 0.0), 0.0),
  (9, Vectors.dense(1.0, 0.0, 15.0, 0.1), 0.0)
)

val df = spark.createDataset(data).toDF("id", "features", "clicked")

val selector = new ChiSqSelector()
  .setNumTopFeatures(1)
  .setFeaturesCol("features")
  .setLabelCol("clicked")
  .setOutputCol("selectedFeatures")

val selectorModel = selector.fit(df)
val result = selectorModel.transform(df)
result.show
+---+------------------+-------+----------------+
| id|          features|clicked|selectedFeatures|
+---+------------------+-------+----------------+
|  7|[0.0,0.0,18.0,1.0]|    1.0|          [18.0]|
|  8|[0.0,1.0,12.0,0.0]|    0.0|          [12.0]|
|  9|[1.0,0.0,15.0,0.1]|    0.0|          [15.0]|
+---+------------------+-------+----------------+

selectorModel.selectedFeatures
res2: Array[Int] = Array(2)

ChiSqSelector по ошибке выбирает feature 2 вместо feature 3 (функция 3 должнабудь прав, основываясь на документах и ​​здравом смысле)

1 Ответ

0 голосов
/ 20 февраля 2019

Выбор функции хи-квадрат работает с категориальными данными

ChiSqSelector обозначает выбор функции хи-квадрат.Он работает с помеченными данными с категориальными признаками

Поэтому обе функции одинаково хороши (хотя следует подчеркнуть, что обе функции можно использовать для получения тривиальных совершенных классификаторов, даже если они используются в качестве непрерывных переменных).

import org.apache.spark.mllib.linalg.{Vectors => OldVectors}
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.stat.Statistics

Statistics.chiSqTest(sc.parallelize(data.map { 
  case (_, v, l) => LabeledPoint(l, OldVectors.fromML(v)) 
})).slice(2, 4)
Array[org.apache.spark.mllib.stat.test.ChiSqTestResult] =
Array(Chi squared test summary:
method: pearson
degrees of freedom = 2
statistic = 3.0
pValue = 0.22313016014843035
No presumption against null hypothesis: the occurrence of the outcomes is statistically independent.., Chi squared test summary:
method: pearson
degrees of freedom = 2
statistic = 3.0000000000000004
pValue = 0.22313016014843035
No presumption against null hypothesis: the occurrence of the outcomes is statistically independent..)

и результаты испытаний соответствуют другим инструментам.Например, в R ( используется в качестве ссылки для проверки селектора ):

y <- as.factor(c("1.0", "0.0", "0.0"))
x2 <- as.factor(c("18.0", "12.0", "15.0"))
x3 <- as.factor(c("1.0", "0.0", "0.1"))

chisq.test(table(x2, y))
    Pearson's Chi-squared test

data:  table(x2, y)
X-squared = 3, df = 2, p-value = 0.2231

Warning message:
In chisq.test(table(x2, y)) : Chi-squared approximation may be incorrect
chisq.test(table(x3, y))
    Pearson's Chi-squared test

data:  table(x3, y)
X-squared = 3, df = 2, p-value = 0.2231

Warning message:
In chisq.test(table(x3, y)) : Chi-squared approximation may be incorrect

Поскольку селектор просто сортирует данные по p-значению и sortBy является стабильным , он первым пришел, первым обслужен.Если вы переключите порядок функции, будет выбрана другая.

...