我遇到了同样的问题,并且按照
this的答案,现在使用
SparkR:::callJMethod
将概率
DenseVector
(无法反序列化)转换为
Array
(R将其读取为
List
)。这并不是非常优雅或快速,但它完成了工作。
denseVectorToArray <- function(dv) {
SparkR:::callJMethod(dv, "toArray")
}
开始你的Spark会话。
生成玩具数据。
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]])