【问题标题】:How to interpret the probabilities (p0, p1) of the result of h2o.predict()如何解释 h2o.predict() 结果的概率 (p0, p1)
【发布时间】:2019-02-17 15:45:57
【问题描述】:

我想了解 H2o R-package 中h2o.predict() 函数的值(结果)的含义。我意识到在某些情况下,当predict 列是1 时,p1 列的值低于p0 列。我对p0p1 列的解释是指每个事件的概率,所以我预计当predict=1p1 的概率应该高于相反事件的概率(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 &gt; p1

predict=1p1 &lt; p0 的总观察结果是:

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

相反,没有predict=0 where p0 &lt; p1

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

这是tablepredict 的信息表:

> table(result$predict)

 0  1 
18 23 

我们使用具有以下值的决策变量CAPSULE

> levels(as.data.frame(prostate.hex)$CAPSULE)
[1] "0" "1"

有什么建议吗?

注意:与主题相似的问题:How to interpret results of h2o.predict 未解决此特定问题。

【问题讨论】:

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


    【解决方案1】:

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

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

      min(result[result$predict==1,]$p1)
      # [1] 0.3644026
      max(result[result$predict==0,]$p1)
      # [1] 0.3602365
      
      # Thresholds found by maximizing the metrics on the training dataset
      fit@model$training_metrics@metrics$max_criteria_and_metric_scores 
      #Maximum Metrics: Maximum metrics at their respective thresholds
      #                        metric threshold    value idx
      #1                       max f1  0.314699 0.641975 200
      #2                       max f2  0.215203 0.795148 262
      #3                 max f0point5  0.451965 0.669856  74
      #4                 max accuracy  0.451965 0.707581  74
      #5                max precision  0.998285 1.000000   0
      #6                   max recall  0.215203 1.000000 262
      #7              max specificity  0.998285 1.000000   0
      #8             max absolute_mcc  0.451965 0.395147  74
      #9   max min_per_class_accuracy  0.360174 0.652542 127
      #10 max mean_per_class_accuracy  0.391279 0.683269  97
      
      # Thresholds found by maximizing the metrics on the validation dataset
      fit@model$validation_metrics@metrics$max_criteria_and_metric_scores 
      #Maximum Metrics: Maximum metrics at their respective thresholds
      #                        metric threshold    value idx
      #1                       max f1  0.363477 0.607143  33
      #2                       max f2  0.292342 0.785714  51
      #3                 max f0point5  0.643382 0.725806   9
      #4                 max accuracy  0.643382 0.774194   9
      #5                max precision  0.985308 1.000000   0
      #6                   max recall  0.292342 1.000000  51
      #7              max specificity  0.985308 1.000000   0
      #8             max absolute_mcc  0.643382 0.499659   9
      #9   max min_per_class_accuracy  0.379602 0.650000  28
      #10 max mean_per_class_accuracy  0.618286 0.702273  11
      
      result[order(result$predict),]
      #   predict          p0        p1
      #5        0 0.703274569 0.2967254
      #6        0 0.639763460 0.3602365
      #13       0 0.689557497 0.3104425
      #14       0 0.656764541 0.3432355
      #15       0 0.696248328 0.3037517
      #16       0 0.707069611 0.2929304
      #18       0 0.692137408 0.3078626
      #19       0 0.701482762 0.2985172
      #20       0 0.705973644 0.2940264
      #21       0 0.701156961 0.2988430
      #22       0 0.671778898 0.3282211
      #24       0 0.646735016 0.3532650
      #26       0 0.646582708 0.3534173
      #27       0 0.690402957 0.3095970
      #32       0 0.649945017 0.3500550
      #37       0 0.804937468 0.1950625
      #40       0 0.717706731 0.2822933
      #41       0 0.642094040 0.3579060
      #1        1 0.364577068 0.6354229
      #2        1 0.503432724 0.4965673
      #3        1 0.406771233 0.5932288
      #4        1 0.551801718 0.4481983
      #7        1 0.339600779 0.6603992
      #8        1 0.002978593 0.9970214
      #9        1 0.378034417 0.6219656
      #10       1 0.596298925 0.4037011
      #11       1 0.635597359 0.3644026
      #12       1 0.552662241 0.4473378
      #17       1 0.615302107 0.3846979
      #23       1 0.628906297 0.3710937
      #25       1 0.600791894 0.3992081
      #28       1 0.216571552 0.7834284
      #29       1 0.559174924 0.4408251
      #30       1 0.489514642 0.5104854
      #31       1 0.623958696 0.3760413
      #33       1 0.504691497 0.4953085
      #34       1 0.582509462 0.4174905
      #35       1 0.504136056 0.4958639
      #36       1 0.463076505 0.5369235
      #38       1 0.510908093 0.4890919
      #39       1 0.469376828 0.5306232
      

    【讨论】:

    • 这个答案和@DarrenCook 提供的答案是对我的问题的有效回答。我将此解决方案标记为最佳解决方案,因为它还根据我发布的具体问题给出了数字解释。两者都是非常有价值的回应。
    【解决方案2】:

    您所描述的是阈值 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 再往下,该文件还显示了每个指标的计算方式。

    【讨论】:

    • 基于@SandipanDey 响应,这似乎是指标:max f1 而不是max f0point5 对于这种情况。 h2o.predict() 没有那么多文档。您能否提供一些提示或链接来为预测函数指定不同的性能指标?我有一个不平衡类,所以比起max f1,我想使用max f2 会更方便,因为它会惩罚更多的FN。我猜如果必须通过... 输入参数指定一些参数。
    • @DavidLeal 我在您发表评论之前更新了我的答案(关于 F1),但您可能已经打开它并且没有看到。使用h2o.confusionMatrix 指定您自己的阈值。
    猜你喜欢
    • 2017-04-25
    • 2018-08-02
    • 1970-01-01
    • 2020-01-14
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多