Nano Hash - криптовалюты, майнинг, программирование

model.predictProbabilities() для логистической регрессии в Spark?

Я запускаю многоклассовую логистическую регрессию (с LBFGS) со Spark 1.6.

учитывая x и возможные метки {1.0,2.0,3.0}, окончательная модель будет только выводить лучший прогноз, скажем, 2.0 .

Если мне интересно узнать, какой прогноз был вторым лучшим прогнозом, скажем, 3.0, как я могу получить эту информацию?

В NaiveBayes я бы использовал функцию model.predictProbabilities(), которая для каждой выборки выводит вектор со всеми вероятностями для каждого возможного результата.


Ответы:


1

Есть два способа выполнить логистическую регрессию в Spark: spark.ml и spark.mllib.

С DataFrames вы можете использовать spark.ml:

import org.apache.spark
import sqlContext.implicits._

def p(label: Double, a: Double, b: Double) =
  new spark.mllib.regression.LabeledPoint(
    label, new spark.mllib.linalg.DenseVector(Array(a, b)))

val data = sc.parallelize(Seq(p(1.0, 0.0, 0.5), p(0.0, 0.5, 1.0)))
val df = data.toDF

val model = new spark.ml.classification.LogisticRegression().fit(df)
model.transform(df).show

Вы получаете необработанные прогнозы и вероятности:

+-----+---------+--------------------+--------------------+----------+
|label| features|       rawPrediction|         probability|prediction|
+-----+---------+--------------------+--------------------+----------+
|  1.0|[0.0,0.5]|[-19.037302860930...|[5.39764620520461...|       1.0|
|  0.0|[0.5,1.0]|[18.9861466274786...|[0.99999999431904...|       0.0|
+-----+---------+--------------------+--------------------+----------+

С RDD вы можете использовать spark.mllib:

val model = new spark.mllib.classification.LogisticRegressionWithLBFGS().run(data)

Эта модель не предоставляет необработанных прогнозов и вероятностей. Вы можете взглянуть на predictPoint. Он умножает векторы и выбирает класс с самым высоким прогнозом. Веса общедоступны, поэтому вы можете скопировать этот алгоритм и сохранить прогнозы, а не просто возвращать самый высокий.

08.02.2016
  • Спасибо за ответ. Хотя я изо всех сил пытаюсь понять, как использовать ProbabilisticClassificationModel. 1) Я не уверен, что LogisticRegressionWithLBFGS является подклассом ProbabilisticClassificationModel. 2) В Интернете нет примера использования ProbabilisticClassificationModel 3) Какой кадр данных будет передан функции преобразования? Учебный набор, который я использовал для логистической регрессии? Извините за большую путаницу. 08.02.2016
  • Вы правы, это совсем не очевидно. Я вернусь с полным примером через несколько часов! 08.02.2016
  • Да, извините, я заснул :). Итак, похоже, что есть два класса с именами LogisticRegressionModel, один в spark.ml и один в spark.mllib. Только первый дает вам необработанные прогнозы. Я переписал ответ, чтобы объяснить это. Кажется, что проще всего просто использовать spark.ml, но если вы согласны с копированием кода из Spark, вы также можете сделать это с помощью spark.mllib. 09.02.2016
  • @DanielDarabos Не могли бы вы рассказать, что здесь означает столбец rawPrediction, а также как мы узнаем, какая вероятность принадлежит какому классу? Спасибо 13.06.2017
  • rawPrediction находится перед softmax. (github.com/apache/spark/blob/v2.1.1/mllib/src/main/scala/org/) Вероятности находятся в том же порядке, что и классы. 17.06.2017

  • 2

    Следуя предложениям @Daniel Darabos:

    1. Я попытался использовать функцию LogisticRegression из ml вместо mllib. К сожалению, она не поддерживает мультиклассовую логистическую регрессию, а только бинарную.
    2. Я взглянул на PredictedPoint и изменил его так, чтобы он печатал все вероятности для каждого класса. Вот как это выглядит:
        def predictPointForMulticlass(featurizedVector:Vector,weightsArray:Vector,intercept:Double,numClasses:Int,numFeatures:Int) : Seq[(String, Double)] = {
    
            val weightsArraySize = weightsArray.size
            val dataWithBiasSize = weightsArraySize / (numClasses - 1)
            val withBias = false
    
            var bestClass = 0
            var maxMargin = 0.0
            var margins = new Array[Double](numClasses - 1)
            var temp_marginMap = new HashMap[Int, Double]()
            var res = new HashMap[Int, Double]()
    
            (0 until numClasses - 1).foreach { i =>
              var margin = 0.0
              var index = 0
              featurizedVector.toArray.foreach(value => {
                if (value != 0.0) {
                  margin += value * weightsArray((i * dataWithBiasSize) + index)
                }
                index += 1
              }
              )
            // Intercept is required to be added into margin.
            if (withBias) {
                margin += weightsArray((i * dataWithBiasSize) + featurizedVector.size)
            }
            val prob = 1.0 / (1.0 + Math.exp(-margin))
            margins(i) = margin
    
            temp_marginMap += (i -> margin)
    
            if(margin > maxMargin) {
                maxMargin = margin
                bestClass = i + 1
              }
            }
    
            for ((k,v) <- temp_marginMap){
              val calc =probCalc(maxMargin,v)
              res += (k -> calc)
            }
    
          return res
        }
    

    где probCalc() просто определяется как:

          def probCalc(maxMargin:Double,margin:Double) :Double ={
            val res = 1.0 / (1.0 + Math.exp(-(margin - maxMargin)))
            res
          }
    

    Я возвращаю Hashmap[Int, Double], но это можно изменить по вашему желанию.

    Надеюсь, это поможет!

    11.02.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..