Я изучал использование 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





Мне не удалось открыть ссылки, которые вы предоставили для набора данных и вывода. Однако я использую ту же ссылку, которую вы предоставили 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 основных функций.
Спасибо за ваш вклад. Однако причина, по которой я не использовал метод text2vec с xgboost, заключается в том, что я не хотел использовать трюк с хешированием, и я хотел попробовать использовать другие пакеты в «поезде» (например, randomforest, knn и т. д.). Я до сих пор не смог решить эту проблему, используя для этого другие пакеты, кроме xgboost.
Спасибо за очень информативный вопрос и комментарий. Пакет text2vec или tm предназначен для создания матрицы-терминов документа, то есть dtm_train и dtm_test. Затем мы можем использовать любые методы классификации (например, методы, упомянутые в rdrr.io/cran/caret/man/models.html для классификации) с использованием пакета каретки, как вы это сделали в своем сообщении, model <- train (dtm_train, train_sentences $ class.text, method = "svmLinear").
См. Ссылку ниже и решение с пакетом tm: stackoverflow.com/questions/51296577/….
Просто небольшое обновление. Все еще не могу решить эту проблему, но я предполагаю, что проблема связана с разреженностью матрицы. По-прежнему нужна помощь с этим.