Как напрямую построить ROC объекта модели H2O в R

Приношу свои извинения, если я упускаю что-то очевидное. В последние несколько дней я получил огромное удовольствие от работы с h2o с помощью интерфейса R. Я хотел бы оценить мою модель, скажем случайный лес, построив ROC. Документация, кажется, предполагает, что есть простой способ сделать это:

Интерпретация модели DRF

  • По умолчанию отображается следующий вывод:
  • Параметры модели (скрыто)
  • График истории оценок (количество деревьев в сравнении с MSE обучения)
  • График кривой ROC (TPR против FPR)
  • График значений переменных ...

Я также видел, что в python вы можете применить функцию roc здесь. Но я не могу найти способ сделать то же самое в интерфейсе R. В настоящее время я извлекаю прогнозы из модели с помощью h2o.cross_validation_holdout_predictions, а затем использую пакет pROC из R для построения ROC. Но я хотел бы иметь возможность делать это напрямую из объекта модели H2O или, возможно, из объекта H2OModelMetrics.

Большое спасибо!


person Ophiothrix    schedule 17.05.2017    source источник


Ответы (4)


Наивное решение - использовать универсальную функцию plot() для построения объекта H2OMetrics:

logit_fit <- h2o.glm(colnames(training)[-1],'y',training_frame =
    training.hex,validation_frame=validation.hex,family = 'binomial')
plot(h2o.performance(logit_fit),valid=T),type='roc')

Это даст нам сюжет:

введите описание изображения здесь

Но его сложно настроить, особенно изменить тип линии, поскольку параметр type уже принят как roc. Также я не нашел способа построить кривые ROC нескольких моделей вместе на одном графике. Я придумал метод извлечения истинных положительных и ложных положительных результатов из объекта H2OMetrics и использую ggplot2 для построения кривых ROC на одном графике самостоятельно. Вот пример кода (использует много синтаксиса tidyverse):

# for example I have 4 H2OModels
list(logit_fit,dt_fit,rf_fit,xgb_fit) %>% 
  # map a function to each element in the list
  map(function(x) x %>% h2o.performance(valid=T) %>% 
        # from all these 'paths' in the object
        .@metrics %>% .$thresholds_and_metric_scores %>% 
        # extracting true positive rate and false positive rate
        .[c('tpr','fpr')] %>% 
        # add (0,0) and (1,1) for the start and end point of ROC curve
        add_row(tpr=0,fpr=0,.before=T) %>% 
        add_row(tpr=0,fpr=0,.before=F)) %>% 
  # add a column of model name for future grouping in ggplot2
  map2(c('Logistic Regression','Decision Tree','Random Forest','Gradient Boosting'),
        function(x,y) x %>% add_column(model=y)) %>% 
  # reduce four data.frame to one
  reduce(rbind) %>% 
  # plot fpr and tpr, map model to color as grouping
  ggplot(aes(fpr,tpr,col=model))+
  geom_line()+
  geom_segment(aes(x=0,y=0,xend = 1, yend = 1),linetype = 2,col='grey')+
  xlab('False Positive Rate')+
  ylab('True Positive Rate')+
  ggtitle('ROC Curve for Four Models')

Тогда кривая ROC будет:

введите описание изображения здесь

person Zhirui Wang    schedule 02.10.2017

вы можете получить кривую roc, передав метрики производительности модели в функцию построения графика H2O.

сокращенный фрагмент кода, в котором предполагается, что вы создали модель, назовете ее glm и разбили набор данных на наборы для обучения и проверки:

perf <- h2o.performance(glm, newdata = validation)
h2o.plot(perf)

полный фрагмент кода ниже:

h2o.init()

# Run GLM of CAPSULE ~ AGE + RACE + PSA + DCAPS
prostatePath = system.file("extdata", "prostate.csv", package = "h2o")
prostate.hex = h2o.importFile(path = prostatePath, destination_frame = "prostate.hex")
glm = h2o.glm(y = "CAPSULE", x = c("AGE","RACE","PSA","DCAPS"), training_frame = prostate.hex, family = "binomial", nfolds = 0, alpha = 0.5, lambda_search = FALSE)

perf <- h2o.performance(glm, newdata = prostate.hex)
h2o.plot(perf)

и это приведет к следующему:  введите описание изображения здесь

person Lauren    schedule 14.12.2017
comment
в качестве примечания: в python вы бы сделали model.model_performance (valid = True) model.plot () - person Lauren; 11.01.2018
comment
Возможно, я использую старую версию H2O, но для меня h2o.plot не является функцией. При этом база R plot работала достаточно хорошо. - person Matt Triggs; 08.05.2018

В настоящее время в клиенте H2O R или Python нет функции для прямого построения кривой ROC. Метод roc в Python возвращает данные, необходимые для построения кривой ROC, но не строит саму кривую. Построение кривой ROC непосредственно из R и Python кажется полезным для добавления, поэтому я создал для него билет JIRA: https://0xdata.atlassian.net/browse/PUBDEV-4449

Ссылка на кривую ROC в документации относится к графическому интерфейсу H2O Flow, который автоматически построит кривую ROC для любой модели бинарной классификации в вашем кластере H2O. Однако все остальные элементы в этом списке фактически доступны непосредственно в R и Python.

Если вы обучаете модель в R, вы можете посетить интерфейс Flow (например, localhost: 54321) и щелкнуть биномиальную модель, чтобы увидеть ее кривые ROC (версии для обучения, проверки и перекрестной проверки). Это будет выглядеть так:  введите описание изображения здесь

person Erin LeDell    schedule 17.05.2017

Основываясь на примере @Lauren, после запуска model.performance вы можете извлечь всю необходимую информацию для ggplot из perf@metrics$thresholds_and_metric_scores. Этот код создает кривую ROC, но вы также можете добавить precision, recall к выбранным переменным для построения кривой PR.

Вот пример кода, использующего ту же модель, что и выше.

library(h2o)
library(dplyr)
library(ggplot2)

h2o.init()

# Run GLM of CAPSULE ~ AGE + RACE + PSA + DCAPS
prostatePath <- system.file("extdata", "prostate.csv", package = "h2o")
prostate.hex <- h2o.importFile(
    path = prostatePath, 
    destination_frame = "prostate.hex"
    )
glm <- h2o.glm(
    y = "CAPSULE",
    x = c("AGE", "RACE", "PSA", "DCAPS"), 
    training_frame = prostate.hex, 
    family = "binomial", 
    nfolds = 0, 
    alpha = 0.5, 
    lambda_search = FALSE
)

# Model performance
perf <- h2o.performance(glm, newdata = prostate.hex)

# Extract info for ROC curve
curve_dat <- data.frame(perf@metrics$thresholds_and_metric_scores) %>%
    select(c(tpr, fpr))

# Plot ROC curve
ggplot(curve_dat, aes(x = fpr, y = tpr)) +
    geom_point() +
    geom_line() +
    geom_segment(
        aes(x = 0, y = 0, xend = 1, yend = 1),
        linetype = "dotted",
        color = "grey50"
        ) +
    xlab("False Positive Rate") +
    ylab("True Positive Rate") +
    ggtitle("ROC Curve") +
    theme_bw()

Что производит этот сюжет:

roc_plot

person Daniel Kent    schedule 30.04.2020