Как интерпретировать вероятности (p0, p1) результата h2o.predict () - PullRequest
0 голосов
/ 13 сентября 2018

Я бы хотел понять значение значения (результата) функции h2o.predict () из H2o R-пакета. Я понял, что в некоторых случаях, когда столбец predict равен 1, столбец p1 имеет меньшее значение, чем столбец p0. Моя интерпретация столбцов p0 и p1 относится к вероятностям для каждого события, поэтому я ожидал, когда predict=1 вероятность p1 должна быть выше, чем вероятность противоположного события (p0), но это не всегда происходит, как я могу показать в следующем примере: использование набора данных простаты .

Вот исполняемый пример:

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=1, но p1 < p0:

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

наоборот нет predict=0 где p0 < p1

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

Вот таблица для table информации для predict:

> table(result$predict)

 0  1 
18 23 

Мы используем в качестве переменной решения CAPSULE со следующими значениями:

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

Есть предложения?

Примечание : Вопрос с похожей темой: Как интерпретировать результаты h2o.predict не решает эту конкретную проблему.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Кажется (также см. здесь ), что пороговое значение, которое максимизирует F1 score в наборе данных validation, используется в качестве порогового значения по умолчанию для классификации с h2o.glm().Мы можем наблюдать следующее:

  1. пороговое значение, которое максимизирует F1 score в наборе данных проверки, равно 0.363477.
  2. все точки данных с прогнозируемой p1 вероятностью, меньшей этой пороговой величины, классифицируются как класс 0 (точка данных, прогнозируемая как класс 0, имеет самую высокую p1 вероятность = 0.3602365 <<code>0.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
    
0 голосов
/ 13 сентября 2018

То, что вы описываете, является порогом 0,5.Фактически будет использоваться другой порог, который максимизирует определенный показатель.Показатель по умолчанию - F1 (*);если вы печатаете информацию о модели, вы можете найти пороговые значения, используемые для каждой метрики.

См. вопрос: Как понять метрики объекта H2OModelMetrics через h2o.performance? , чтобы узнать больше об этом (ваш вопрос был другим, поэтому я не пометил его как дубликат).

Насколько я знаю, вы не можете изменить значение по умолчанию F1 на h2o.predict() или h2o.performance().Но вместо этого вы можете использовать h2o.confusionMatrix()

С учетом вашей модели fit и использовать максимум 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 Далее в этом файле также показано, как рассчитывается каждая из метрик.

...