Реализация LIME для моделирования воды в R

Я хочу реализовать LIME на модели, созданной с использованием h2o (глубокое обучение) в R. Для использования данных в Модель, я создал h2oFrames и преобразовал ее обратно в фрейм данных перед использованием в LIME (функция Lime, потому что функция объяснения LIME не может распознать h2oFrame). Здесь я могу запустить функцию

Следующим шагом является использование функции объяснения тестовых данных для генерации объяснений. Здесь R выдает ошибку при использовании кадра данных, а также h2oFrame.

Это ошибка, возникающая при использовании фрейма данных:

Error in chk.H2OFrame(x) : must be an H2OFrame

Это ошибка, возникающая при использовании h2oframe:

Error in UseMethod("permute_cases") : 
  no applicable method for 'permute_cases' applied to an object of class "H2OFrame"
if(!require(pacman))  install.packages("pacman")
pacman::p_load(h2o, lime, data.table, e1071)

data(iris)
h2o.init( nthreads = -1 )
h2o.no_progress()

# Split up the data set
iris <- as.h2o(iris)

split <- h2o.splitFrame( iris, c(0.6, 0.2), seed = 1234 )
iris_train <- h2o.assign( split[[1]], "train" ) # 60%
iris_valid <- h2o.assign( split[[2]], "valid" ) # 20%
iris_test  <- h2o.assign( split[[3]], "test" )  # 20%


output <- 'Species'
input <- setdiff(names(iris),output)


model_dl_1 <- h2o.deeplearning(
  model_id = "dl_1", 
  training_frame = iris_train, 
  validation_frame = iris_valid,
  x = input,
  y = output,
  hidden = c(32, 32, 32),
  epochs = 10, # hopefully converges earlier...
  score_validation_samples = 10000, 
  stopping_rounds = 5,
  stopping_tolerance = 0.01
)

pred1 <- h2o.predict(model_dl_1, iris_test)
list(dimension = dim(pred1), pred1$predict)

#convert to df from h2ofdataframe

train_org<-as.data.frame(iris_train) 
#converting train h2oframe to dataframe
sapply(train_org,class) #checking the class of train_org
test_df <- as.data.frame(iris_test) 
#converting test data h2oFrame to dataframe
test_sample <- test_df[1:1,] 

#works
#lime is used to get explain on the train data
explain <- lime(train_org, model_dl_1, bin_continuous = FALSE, n_bins = 
                  5, n_permutations = 1000)


# Explain new observation
explanation <- explain(test_sample, n_labels = 1, n_features = 1)
h2o.shutdown(prompt=F)

Может ли кто-нибудь помочь мне найти решение или способ использовать функцию объяснения LIME с соответствующим фреймом данных


person gattaca    schedule 12.07.2017    source источник
comment
Пожалуйста, предоставьте полностью воспроизводимый пример кода, а также информацию о версии пакетов lime и h2o R.   -  person Erin LeDell    schedule 12.07.2017
comment
Вам нужно обновить код в своем сообщении, чтобы он был воспроизводимым - это может быть любой набор данных (подойдет ирис). См. Рекомендации по переполнению стека для MCVE здесь: stackoverflow.com/help/mcve Если я не могу скопировать / вставить ваш код, чтобы помочь вы отлаживаете код, тогда это не MCVE.   -  person Erin LeDell    schedule 12.07.2017
comment
@ErinLeDell, спасибо за отзыв, я внесу изменения.   -  person gattaca    schedule 12.07.2017
comment
@ErinLeDell, я выложил полный код. Пожалуйста, посмотрите. Спасибо за уделенное время   -  person gattaca    schedule 12.07.2017
comment
Можете ли вы уточнить, какое из двух ваших сообщений об ошибке происходит с кодом, который вы опубликовали, и в какой строке это происходит?   -  person Darren Cook    schedule 29.08.2017


Ответы (1)


Пакет lime под капотом использует две функции, predict_model() и model_type(), которые необходимо настроить для любых моделей, которые в настоящее время не поддерживаются.

Для вашего конкретного примера вот что вам нужно сделать.

Шаг 1: настройте общую model_type функцию для моделей класса H2OMultinomialModel. Все, что вы здесь делаете, это указываете lime, какой тип модели вы хотите, чтобы она выполнялась, например, «классификацию» или «регрессию».

model_type.H2OMultinomialModel <- function(x, ...) {
    # Function tells lime() what model type we are dealing with
    # 'classification', 'regression', 'survival', 'clustering', 'multilabel', etc
    #
    # x is our h2o model

    return("classification")

}

Шаг 2: настройте общую predict_model функцию для моделей класса H2OMultinomialModel. Ключевым моментом здесь является понимание того, что для работы лайма нужны вероятности классификации, а не прогноз (мне потребовалось некоторое время, чтобы понять, и он должен иметь дело с переменной lime:::output_type(explaination)).

predict_model.H2OMultinomialModel <- function(x, newdata, type, ...) {
    # Function performs prediction and returns dataframe with Response
    #
    # x is h2o model
    # newdata is data frame
    # type is only setup for data frame

    pred <- h2o.predict(x, as.h2o(newdata))

    # return classification probabilities only
    return(as.data.frame(pred[,-1]))

}

После того, как вы правильно настроите эти функции, вы сможете запускать свои lime сценарии.

# Lime is used to get explain on the train data
explainer <- lime(train_org, model_dl_1, bin_continuous = FALSE, n_bins = 5, n_permutations = 1000)

# Explain new observation
explanation <- explain(test_sample, explainer, n_labels = 1, n_features = 1)
person Matt Dancho    schedule 17.09.2017
comment
Обратите внимание, что пакет lime был обновлен для интеграции h2o. Вам может потребоваться загрузить версию GitHub здесь: github.com/thomasp85/lime - person Matt Dancho; 27.10.2017