Пакет R Lime для текстовых данных - PullRequest
0 голосов
/ 08 июня 2018

Я изучал использование R lime на наборах текстовых данных для объяснения предсказаний модели черного ящика и наткнулся на пример https://cran.r -project.org / web / packages / lime / vignettes / Understanding_lime.html

Тестировал набор данных обзора ресторанов, но обнаружил, что созданный plot_features не печатает все функции.Мне было интересно, если бы кто-нибудь мог дать мне какой-либо совет / представление о том, почему это происходит, или порекомендовать другой пакет для использования.Помощь здесь очень ценится, так как в Интернете можно найти не так много работы над R lime.Спасибо!

Набор данных: https://drive.google.com/file/d/1-pzY7IQVyB_GmT5dT0yRx3hYzOFGrZSr/view?usp=sharing

# Importing the dataset
dataset_original = read.delim('Restaurant_Reviews.tsv', quote = '', stringsAsFactors = FALSE)

# Cleaning the texts
# install.packages('tm')
# install.packages('SnowballC')
library(tm)
library(SnowballC)
corpus = VCorpus(VectorSource(dataset_original$Review))
corpus = tm_map(corpus, content_transformer(tolower))
corpus = tm_map(corpus, removeNumbers)
corpus = tm_map(corpus, removePunctuation)
corpus = tm_map(corpus, removeWords, stopwords())
corpus = tm_map(corpus, stemDocument)
corpus = tm_map(corpus, stripWhitespace)

# Creating the Bag of Words model
dtm = DocumentTermMatrix(corpus)
dtm = removeSparseTerms(dtm, 0.999)
dataset = as.data.frame(as.matrix(dtm))
dataset$Liked = dataset_original$Liked

# Encoding the target feature as factor
dataset$Liked = factor(dataset$Liked, levels = c(0, 1))

# Splitting the dataset into the Training set and Test set
# install.packages('caTools')
library(caTools)
set.seed(123)
split = sample.split(dataset$Liked, SplitRatio = 0.8)
training_set = subset(dataset, split == TRUE)
test_set = subset(dataset, split == FALSE)

library(caret)
model <- train(Liked~., data=training_set, method="xgbTree")

######
#LIME#
######
library(lime)
explainer <- lime(training_set, model)
explanation <- explain(test_set[1:4,], explainer, n_labels = 1, n_features = 5)
plot_features(explanation)

Мой нежелательный вывод: https://www.dropbox.com/s/pf9dq0kba0d5flt/Udemy_NLP_Lime.jpeg?dl=0

Что я хочу (другой набор данных): https://www.dropbox.com/s/e1472i4yw1owmlc/DMT_A5_lime.jpeg?dl=0

1 Ответ

0 голосов
/ 05 ноября 2018

Мне не удалось открыть ссылки, предоставленные вами для набора данных и вывода.Однако я использую ту же ссылку, которую вы указали https://cran.r -project.org / web / packages / lime / vignettes / Understanding_lime.html .Я использую text2vec, как он есть в ссылке, и пакет xgboost для классификации;и это работает для меня.Чтобы отобразить больше функций, вам может потребоваться увеличить значение n_features в функции объяснения, см. https://www.rdocumentation.org/packages/lime/versions/0.4.0/topics/explain.

library(lime)
library(xgboost)  # the classifier
library(text2vec) # used to build the BoW matrix

# load data
data(train_sentences, package = "lime")  # from lime 
data(test_sentences, package = "lime")   # from lime

# Tokenize data
get_matrix <- function(text) {
  it <- text2vec::itoken(text, progressbar = FALSE)

  # use the following lines if you want to prune vocabulary
  # vocab <- create_vocabulary(it, c(1L, 1L)) %>%   
  # prune_vocabulary(term_count_min = 10, doc_proportion_max = 0.2)
  #   vectorizer <- vocab_vectorizer(vocab )

  # there is no option to prune the vocabulary, but it is very fast for big data
  vectorizer <- hash_vectorizer(hash_size = 2 ^ 10, ngram = c(1L, 1L))
  text2vec::create_dtm(it,vectorizer = vectorizer) # hash_vectorizer())
}

# BoW matrix generation
# features should be the same for both dtm_train and dtm_test 
dtm_train <- get_matrix(train_sentences$text)
dtm_test  <- get_matrix(test_sentences$text) 

# xgboost for classification
param <- list(max_depth = 7, 
          eta = 0.1, 
          objective = "binary:logistic", 
          eval_metric = "error", 
          nthread = 1)

xgb_model <-xgboost::xgb.train(
  param, 
  xgb.DMatrix(dtm_train, label = train_sentences$class.text == "OWNX"),
  nrounds = 100 
)

# prediction
predictions <- predict(xgb_model, dtm_test) > 0.5
test_labels <- test_sentences$class.text == "OWNX"

# Accuracy
print(mean(predictions == test_labels))

# what are the most important words for the predictions.
n_features <- 5 # number of features to display
sentence_to_explain <- head(test_sentences[test_labels,]$text, 6)
explainer <- lime::lime(sentence_to_explain, model = xgb_model, 
                    preprocess = get_matrix)
explanation <- lime::explain(sentence_to_explain, explainer, n_labels = 1, 
                         n_features = n_features)

#
explanation[, 2:9]

# plot
lime::plot_features(explanation)

В вашем коде NA создаются в следующей строке при применении к набору данных train_sentences.Пожалуйста, проверьте ваш код на предмет следующего.

dataset$Liked = factor(dataset$Liked, levels = c(0, 1))

Удаление уровней или изменение уровней для меток работает для меня.

Пожалуйста, проверьте свою структуру данных и убедитесь, что ваши данные не являются нулевыми матрицами из-заэти NA, или это не слишком редко.Это также может вызвать проблему, поскольку он не может найти лучшие n функций.

...