Как интерпретировать столбец вероятности в прогнозировании искровой логистической регрессии?

Я получаю прогнозы через spark.ml.classification.LogisticRegressionModel.predict. Ряд строк имеют столбец prediction как 1.0 и столбец probability как .04. model.getThreshold равно 0.5, поэтому я предполагаю, что модель классифицирует все, что превышает 0.5 порог вероятности, как 1.0.

Как мне интерпретировать результат с 1,0 prediction и probability 0,04?


person Walrus the Cat    schedule 18.05.2017    source источник


Ответы (1)


Столбец вероятности выполнения LogisticRegression должен содержать список той же длины, что и количество классов, где каждый индекс дает соответствующую вероятность для этого класса. Для иллюстрации я сделал небольшой пример с двумя классами:

case class Person(label: Double, age: Double, height: Double, weight: Double)
val df = List(Person(0.0, 15, 175, 67), 
      Person(0.0, 30, 190, 100), 
      Person(1.0, 40, 155, 57), 
      Person(1.0, 50, 160, 56), 
      Person(0.0, 15, 170, 56), 
      Person(1.0, 80, 180, 88)).toDF()

val assembler = new VectorAssembler().setInputCols(Array("age", "height", "weight"))
  .setOutputCol("features")
  .select("label", "features")
val df2 = assembler.transform(df)
df2.show

+-----+------------------+
|label|          features|
+-----+------------------+
|  0.0| [15.0,175.0,67.0]|
|  0.0|[30.0,190.0,100.0]|
|  1.0| [40.0,155.0,57.0]|
|  1.0| [50.0,160.0,56.0]|
|  0.0| [15.0,170.0,56.0]|
|  1.0| [80.0,180.0,88.0]|
+-----+------------------+

val lr = new LogisticRegression().setMaxIter(10).setRegParam(0.3).setElasticNetParam(0.8)
val Array(testing, training) = df2.randomSplit(Array(0.7, 0.3))

val model = lr.fit(training)
val predictions = model.transform(testing)
predictions.select("probability", "prediction").show(false)


+----------------------------------------+----------+
|probability                             |prediction|
+----------------------------------------+----------+
|[0.7487950501224138,0.2512049498775863] |0.0       |
|[0.6458452667523259,0.35415473324767416]|0.0       |
|[0.3888393314864866,0.6111606685135134] |1.0       |
+----------------------------------------+----------+

Вот вероятности, а также окончательный прогноз, сделанный алгоритмом. Класс, который в конечном итоге имеет самую высокую вероятность, - это тот, который был предсказан.

person Shaido    schedule 19.05.2017
comment
Привет, Шайдо. Как связать каждую вероятность с соответствующим классом? Как мы видим, здесь prob [0] фактически принадлежит к классу 0, а prob [1] - к классу 1. Где говорится, что prob [0] не соответствует классу 1? - person Kenny; 13.12.2019
comment
Хороший вопрос. Кажется, что в задаче двоичной классификации некоторые алгоритмы по умолчанию связывают вероятность, превышающую определенный порог, с классом 0. Что в принципе бесполезно ... - person guiotan; 24.06.2020
comment
@guiotan: В случае бинарной классификации предсказанный класс всегда будет с большей вероятностью. То есть в приведенном выше коде prediction 0.0 и 1.0 соответствуют меткам 0.0 и 1.0, в то время как соответствующая вероятность для каждого прогноза будет самой высокой в ​​столбце probability. - person Shaido; 24.06.2020
comment
есть ли метод, который дает 1 значение от 0 до 1 для столбца вероятности? Как другой столбец ('common_probability '), который приводит к вероятности ниже 0,5 для первых двух прогнозов и 0,5 или выше для последней строки? - person sAguinaga; 24.10.2020
comment
@sAguinaga: вы можете просто взять первый элемент (или второй, если вы хотите другой порядок) массива, чтобы получить то, что вы хотите. - person Shaido; 24.10.2020