如何解释h2o.predict()的结果的概率(p0,p1)

时间:2018-09-12 23:21:39

标签: r machine-learning deep-learning h2o glm

我想了解H2o R-package中h2o.predict()函数的值(结果)的含义。我意识到,在某些情况下,当predict列为1时,p1列的值比列p0的值低。我对p0p1列的解释是指每个事件的概率,因此我希望predict=1的概率p1的概率应高于相反事件的概率(p0),但并非总是如下面的示例所示:使用prostate dataset

这是可执行的示例:

library(h2o)
h2o.init(max_mem_size = "12g", nthreads = -1)
prostate.hex <- h2o.importFile("https://h2o-public-test-data.s3.amazonaws.com/smalldata/prostate/prostate.csv")
prostate.hex$CAPSULE  <- as.factor(prostate.hex$CAPSULE)
prostate.hex$RACE     <- as.factor(prostate.hex$RACE)
prostate.hex$DCAPS    <- as.factor(prostate.hex$DCAPS)
prostate.hex$DPROS    <- as.factor(prostate.hex$DPROS)

prostate.hex.split = h2o.splitFrame(data = prostate.hex,
  ratios = c(0.70, 0.20, 0.10), seed = 1234)
train.hex     <- prostate.hex.split[[1]]
validate.hex  <- prostate.hex.split[[2]]
test.hex      <- prostate.hex.split[[3]]

fit <- h2o.glm(y = "CAPSULE", x = c("AGE", "RACE", "PSA", "DCAPS"),
  training_frame = train.hex,
  validation_frame = validate.hex,
  family = "binomial", nfolds = 0, alpha = 0.5)

prostate.predict = h2o.predict(object = fit, newdata = test.hex)
result <- as.data.frame(prostate.predict)
subset(result, predict == 1 & p1 < 0.4)

对于subset函数的结果,我得到以下输出:

   predict        p0        p1
11       1 0.6355974 0.3644026
17       1 0.6153021 0.3846979
23       1 0.6289063 0.3710937
25       1 0.6007919 0.3992081
31       1 0.6239587 0.3760413

对于来自test.hex数据集的所有上述观察结果,预测为1,但预测为p0 > p1

predict=1p1 < p0处的总观察值为:

>   nrow(subset(result, predict == 1 & p1 < p0))
[1] 14

相反,没有predict=0,其中p0 < p1

>   nrow(subset(result, predict == 0 & p0 < p1))
[1] 0

以下是table的{​​{1}}信息表:

predict

我们使用具有以下值的决策变量> table(result$predict) 0 1 18 23

CAPSULE

有什么建议吗?

注意:具有类似主题的问题:How to interpret results of h2o.predict不能解决这个特定问题。

2 个答案:

答案 0 :(得分:4)

您所描述的阈值为0.5。实际上,将使用不同的阈值,该阈值可最大化某个指标。默认指标为F1(*);如果您打印模型信息,则可以找到每个指标使用的阈值。

有关此问题的更多信息,请参见问题:How to understand the metrics of H2OModelMetrics Object through h2o.performance?(您的问题有所不同,这就是为什么我没有将其标记为重复)。

据我所知,您无法将F1默认设置更改为h2o.predict()h2o.performance()。但是,您可以使用h2o.confusionMatrix()

给出模型fit,并改用max F2:

h2o.confusionMatrix(fit, metrics = "f2")

您也可以直接使用h2o.predict()“ p0”列(使用自己的阈值)来代替“预测”列。 (这是我之前所做的。)

*:定义在这里:https://github.com/h2oai/h2o-3/blob/fdde85e41bad5f31b6b841b300ce23cfb2d8c0b0/h2o-core/src/main/java/hex/AUC2.java#L34在该文件的最下方还显示了如何计算每个指标。

答案 1 :(得分:3)

似乎(另请参见here)将F1 score数据集上的validation最大化的阈值用作h2o.glm()分类的默认阈值。我们可以观察到以下内容:

  1. 在验证数据集上最大化F1 score的阈值为0.363477
  2. 所有预测p1概率小于此阈值的数据点都归为0类(预测为0类的数据点具有最高p1概率= 0.3602365 <0.363477)。
  3. 所有预测p1概率大于此阈值的数据点都归为1类(预测为1类的数据点具有最低{{1} }概率= p1> 0.3644026)。

    0.363477