从SparkR ML分类函数中提取类概率

时间:2017-01-30 18:29:35

标签: r apache-spark machine-learning sparkr

我想知道是否有可能(使用SparkR的内置功能或任何其他解决方法)来提取SparkR中包含的某些分类算法的类概率。特别感兴趣的是。

  

spark.gbt()
  spark.mlp()
  spark.randomForest()

目前,当我在这些模型上使用预测函数时,我能够提取预测,但不能提取实际概率或“置信度”。

我已经看到了几个与此主题相似的其他问题,但没有一个特定于SparkR的问题,而且许多问题都没有得到关于Spark最新更新的回答。

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,现在关注this回答后使用SparkR:::callJMethod将概率DenseVector(其中R无法反序列化)转换为Array(其中R读为List)。它不是非常优雅或快速,但它可以完成这项工作:

  denseVectorToArray <- function(dv) {
    SparkR:::callJMethod(dv, "toArray")
  }

例如为: 开始你的火花会议

#library(SparkR)
#sparkR.session(master = "local") 

生成玩具数据

data <- data.frame(clicked = base::sample(c(0,1),100,replace=TRUE),
                  someString = base::sample(c("this", "that"),
                                           100, replace=TRUE), 
                  stringsAsFactors=FALSE)

trainidxs <- base::sample(nrow(data), nrow(data)*0.7)
traindf <- as.DataFrame(data[trainidxs,])
testdf <- as.DataFrame(data[-trainidxs,])

训练随机森林并运行预测:

rf <- spark.randomForest(traindf, 
                        clicked~., 
                        type = "classification", 
                        maxDepth = 2, 
                        maxBins = 2,
                        numTrees = 100)

predictions <- predict(rf, testdf)

收集您的预测:

collected = SparkR::collect(predictions)    

现在提取概率:

collected$probabilities <- lapply(collected$probability, function(x)  denseVectorToArray(x))     
str(probs) 

当然,SparkR:::callJMethod周围的函数包装有点矫枉过正。您也可以直接使用它,例如与dplyr:

withprobs = collected %>%
            rowwise() %>%
            mutate("probabilities" = list(SparkR:::callJMethod(probability,"toArray"))) %>%
            mutate("prob0" = probabilities[[1]], "prob1" = probabilities[[2]])