我想知道是否有可能(使用SparkR的内置功能或任何其他解决方法)来提取SparkR中包含的某些分类算法的类概率.特别感兴趣的是.
spark.gbt()
spark.mlp()
spark.randomForest()
目前,当我在这些模型上使用预测函数时,我能够提取预测,但不能提取实际概率或“置信度”.
我已经看到了几个与此主题相似的其他问题,但没有一个特定于SparkR的问题,而且很多关于Spark的最新更新都没有得到解答.
最佳答案 我遇到了同样的问题,现在跟随
this回答使用SparkR ::: callJMethod将概率DenseVector(其中R不能反序列化)转换为数组(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]])