>

블랙 박스 모델 예측을 설명하기 위해 텍스트 데이터 세트에서 R 라임을 사용하는 방법을 모색하고 있으며 https://cran.r-project.org/web/packages/lime/vignettes/Understanding_lime.html

레스토랑 리뷰 데이터 셋을 테스트했지만 plot_features가 모든 기능을 인쇄하지는 않는다는 것을 발견했습니다. 왜 이런 일이 발생하는지 또는 다른 패키지를 사용하도록 권유하는지에 대한 조언이나 통찰력을 누군가가 제공 할 수 있는지 궁금합니다. R 라임에 대한 많은 작업이 온라인에서 찾을 수 없기 때문에 여기에서 도움을 주시면 감사하겠습니다. 감사합니다!

데이터 세트 : 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

    데이터 세트 및 출력에 제공 한 링크를 열 수 없습니다. 그러나 https://cran.r-project.org/web/packages/lime/vignettes/Understanding_lime.html 제공 한 동일한 링크를 사용하고 있습니다. 링크에있는 것처럼 text2vec를 사용하고 분류를 위해 xgboost 패키지를 사용합니다. 그리고 그것은 나를 위해 작동합니다. 더 많은 기능을 표시하려면 Explain 기능에서 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로 인해 데이터가 0 행렬이 아니거나 너무 희박하지 않은지 확인하십시오. 상위 n 기능을 찾을 수 없으므로 문제가 발생할 수도 있습니다.

  • 이전 python - 더 pythonic은 무엇입니까 - 사소한 람다 또는 없음?
  • 다음 c++ - Clang은 지원되지 않는 __declspec 속성에 대해 경고합니다