sparkR 1.6: как предсказать вероятность при моделировании с помощью glm (семейство биномов)

Я только что установил sparkR 1.6.1 на CentOS и не использую hadoop. Мой код для моделирования данных с дискретными значениями TARGET выглядит следующим образом:

# 'tr' is a R data frame with 104 numeric columns and one TARGET column
#    TARGET column is either 0 or 1
# Convert 'tr' to spark data frame

train <- createDataFrame(sqlContext, tr)

# test is an R dataframe without TARGET column
# Convert 'test' to spark Data frame
te<-createDataFrame(sqlContext,test)
# Using sparkR's glm model to model data
model <- glm(TARGET ~ . , data = train, family = "binomial")
# Make predictions
predictions <- predict(model, newData = te )

Я могу оценить успех или неудачу следующим образом (надеюсь, я прав):

modelPrediction <- select(predictions, "prediction")
head(modelPrediction)

  prediction
1          0
2          0
3          0
4          0
5          0
6          0

Но когда я хочу оценить вероятность, я получаю результат следующим образом:

modelPrediction <- select(predictions, "probability")
head(modelPrediction)

                probability
1 <environment: 0x6188e1c0>
2 <environment: 0x61894b88>
3 <environment: 0x6189a620>
4 <environment: 0x618a00b8>
5 <environment: 0x618a5b50>
6 <environment: 0x618ac550>

Пожалуйста, помогите мне получить вероятностные значения тестовых событий. Благодарю.

 SpiritusPrana26 июн. 2016 г., 15:24
пожалуйста, можете ли вы включить результаты головы (прогноз)

Ответы на вопрос(1)

Решение Вопроса

Справочная информация: когда ваш R-код запрашивает результат некоторого вычисления из бэкэнда Spark, Spark выполняет вычисление и сериализует результат. Этот результат затем десериализуется на стороне R, и вы получаете ваши объекты R.

Теперь он работает на бэкэнде Spark - если он показывает, что тип возвращаемого объекта - один изCharacter, String, Long, Float, Double Integer, Boolean, Date, TimeStamp или ихArray и т. д., затем он сериализует объект. Но если он обнаруживает, что тип не соответствует ни одному из них, он просто присваивает объекту идентификатор, сохраняет его в памяти для этого идентификатора и отправляет этот идентификатор клиенту R. (JVMObjectTracker вRBackendHandler отвечает за отслеживание объекта jvm на бэкэнде искры.) Затем он десериализуется вjobj класс на стороне R. (Вы можете посмотреть наwriteObject методSerDe.scala чтобы получить полную картину того, что сериализовано заранее, а что нет.)

Теперь на стороне R, если вы посмотрите на объекты вprobability колонка вашегоpredictions фрейм данных, вы увидите, что их классjobj, Как уже упоминалось, объекты этого класса действуют как прокси для реальных объектов Java, хранящихся в кластере Spark. В этом конкретном случае вспомогательный Java-классorg.apache.spark.mllib.linalg.DenseVector, Это вектор, поскольку он содержит вероятность для каждого класса. И поскольку этот вектор не относится к сериализованному типу, поддерживаемому классом SerDe, бэкэнд-искра просто возвращаетjobj прокси и хранит этиDenseVector объект в памяти, чтобы позволить будущие операции над ними.

С этим фоном - вы должны иметь возможность получать значения вероятностей на вашем R-интерфейсе, вызывая методы для этихDenseVector объекты. На данный момент, я думаю, что это единственный путь. Ниже приведен код, который работает для набора данных радужной оболочки -

irisDf <- createDataFrame(sqlContext, iris)
irisDf$target <- irisDf$Species == 'setosa'
model <- glm(target ~ . , data = irisDf, family = "binomial")
summary(model)
predictions <- predict(model, newData = irisDf)
modelPrediction <- select(predictions, "probability")
localPredictions <- SparkR:::as.data.frame(predictions)

getValFrmDenseVector <- function(x) {
    #Given it's binary classification there are just two elems in vector
    a <- SparkR:::callJMethod(x$probability, "apply", as.integer(0))
    b <- SparkR:::callJMethod(x$probability, "apply", as.integer(1))
    c(a, b)
}

t(apply(localPredictions, 1, FUN=getValFrmDenseVector))

с этим я получаю следующий вероятностный вывод для двух классов -

        [,1]         [,2]
1   3.036612e-15 1.000000e+00
2   5.919287e-12 1.000000e+00
3   7.831827e-14 1.000000e+00
4   7.712003e-13 1.000000e+00
5   4.427117e-16 1.000000e+00
6   3.816329e-16 1.000000e+00
[...]

Замечания:SparkR::: Префиксные функции не экспортируются в пространство имен пакета SparkR. Так что имейте в виду, что вы кодируете против частной реализации пакета. (Но я не вижу, как это можно достичь иначе, если только Spark не предоставит для этого публичную поддержку API.)

 Sachin Tyagi27 июн. 2016 г., 18:29
Хорошо, спасибо. Я тоже посмотрю на функцию showDF. (Но это все же не позволяет мне ссылаться на значения вероятности из кода вместо их печати).
 user328277727 июн. 2016 г., 18:31
Вы на 100% правы.
 user328277727 июн. 2016 г., 18:07
Спасибо за ваше подробное объяснение. Предлагаемое решение работает. И, как вы правильно заметили, callJMethod () не помогает в оболочке sparkR. Это часть sparkRBackend.R. Тем временем я также смог получить результаты, используя этот код: modelPrediction <- select (предсказания, «вероятность»); раковина ("abc.txt"); modelPrediction%>% showDF (numRows = 78000, truncate = FALSE); раковина ()

Ваш ответ на вопрос