2017-07-12 1 views
7

Je veux implémenter LIME sur un modèle créé en utilisant h2o (deep learning) en R. Pour utiliser les données du modèle, j'ai créé h2oFrames et je l'ai converti en dataframe avant de l'utiliser dans LIME (fonction Lime, car la fonction EXPLE de LIME ne peut pas reconnaître un h2oFrame). Ici, je suis en mesure d'exécuter la fonctionImplémentation de LIME sur la modélisation h2o en R

L'étape suivante consiste à utiliser la fonction d'explication sur les données de test pour générer des explications. Ici, R renvoie une erreur pour l'utilisation d'une trame de données ainsi que d'un h2oFrame.

C'est l'erreur générée lors de l'utilisation d'une trame de données:

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

Ceci est l'erreur générée lors de l'utilisation d'un 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) 

Can quelqu'un plaide se me aider à trouver une solution ou un moyen d'utiliser l'expliquer en fonction de CHAUX avec la trame de données appropriée

+0

Veuillez fournir un exemple de code entièrement reproductible ainsi que des informations de version sur les paquets de chaux et de H2O R. –

+1

Vous devez mettre à jour le code dans votre message afin qu'il soit reproductible - il peut s'agir d'un ensemble de données (iris serait bien). Veuillez consulter les directives de débordement de pile à propos de MCVE ici: https://stackoverflow.com/help/mcve Si je ne peux pas copier/coller votre code pour vous aider à déboguer le code, alors ce n'est pas un MCVE. –

+1

@ErinLeDell, merci pour les commentaires, je vais faire les changements. – gattaca

Répondre

4

Le paquet lime sous le capot utilise deux fonctions, predict_model() et model_type() que vous devez configurer pour tous les modèles qui ne sont pas actuellement prise en charge.

Pour votre exemple spécifique, voici ce que vous devez faire.

Étape 1: Configurez une fonction générique model_type pour les modèles de classe H2OMultinomialModel. Tout ce que vous faites ici est de dire lime quel type de modèle vous voulez qu'il exécute comme "classification" ou "régression".

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") 

} 

Étape 2: Configuration d'une fonction générique predict_model pour les modèles de classe H2OMultinomialModel. La clé ici est de comprendre que pour que la chaux fonctionne, il faut des probabilités de classification plutôt que la prédiction (cela m'a pris un peu de temps pour comprendre et il faut faire face à une variable 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])) 

} 

Une fois que vous avez défini ces fonctions correctement, vous pouvez exécuter vos scripts 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) 
+0

Notez que le paquet 'lime' a depuis été mis à jour pour intégrer' h2o'. Vous devrez peut-être télécharger la version GitHub ici: https://github.com/thomasp85/lime –