Пакет R Lime для текстовых данных

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

Просто небольшое обновление. Все еще не могу решить эту проблему, но я предполагаю, что проблема связана с разреженностью матрицы. По-прежнему нужна помощь с этим.

Lacri Mosa 09.06.2018 13:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
294
1

Ответы 1

Мне не удалось открыть ссылки, которые вы предоставили для набора данных и вывода. Однако я использую ту же ссылку, которую вы предоставили 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.

Lacri Mosa 07.11.2018 06:28

Спасибо за очень информативный вопрос и комментарий. Пакет text2vec или tm предназначен для создания матрицы-терминов документа, то есть dtm_train и dtm_test. Затем мы можем использовать любые методы классификации (например, методы, упомянутые в rdrr.io/cran/caret/man/models.html для классификации) с использованием пакета каретки, как вы это сделали в своем сообщении, model <- train (dtm_train, train_sentences $ class.text, method = "svmLinear").

Sam S 08.11.2018 13:49

См. Ссылку ниже и решение с пакетом tm: stackoverflow.com/questions/51296577/….

Sam S 09.11.2018 04:14

Другие вопросы по теме