Hi I was working on using R explain on the LIME model. All is fine when I run this portion.
# Library
library(tm)
library(SnowballC)
library(caTools)
library(RWeka)
library(caret)
library(text2vec)
library(lime)
# Importing the dataset
dataset_original = read.delim('Restaurant_Reviews.tsv', quote = '', stringsAsFactors = FALSE)
dataset_original$Liked = as.factor(dataset_original$Liked)
# Splitting the dataset into the Training set and Test set
set.seed(123)
split = sample.split(dataset_original$Liked, SplitRatio = 0.8)
training_set = subset(dataset_original, split == TRUE)
test_set = subset(dataset_original, split == FALSE)
#Create & clean corpus
#clean corpus function
clean_text <- function(text) {
corpus = VCorpus(VectorSource(text))
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)
return(corpus)
}
#ngram function
BigramTokenizer <- function(x){NGramTokenizer(x, Weka_control(min=1,max=2))}
#create dtm
dtm <- function(text){
corpus = VCorpus(VectorSource(text))
dtm = DocumentTermMatrix(corpus, control = list(weighting=weightTfIdf, tokenize=BigramTokenizer))
dataset = as.data.frame(as.matrix(dtm))
dataset = dataset[,order(names(dataset))]
return(dataset)
}
#cleaning train & test text
for (i in seq(nrow(training_set))) {
training_set$clean_text[i] = as.character(clean_text(training_set$Review)[[i]])
print(i)
}
for (i in seq(nrow(test_set))) {
test_set$clean_text[i] = as.character(clean_text(test_set$Review)[[i]])
print(i)
}
#Create document term matrix
dataset_train <- dtm(training_set$clean_text)
dataset_test <- dtm(test_set$clean_text)
#Drop new words in test set & ensure same number of columns as train set
test_colname <- colnames(dataset_test)[colnames(dataset_test) %in% colnames(dataset_train)]
test_colname <- test_colname[!is.na(test_colname)] #Remove NA
new_test_colname <- colnames(dataset_train)[!(colnames(dataset_train) %in% test_colname)] #Columns in train not in test
dataset_test <- dataset_test[,test_colname]
dataset_test[new_test_colname] <- 0
dataset_test = dataset_test[,order(names(dataset_test))]
dataset_train = as.matrix(dataset_train)
dataset_test = as.matrix(dataset_test)
#xgboost caret model
set.seed(123)
model <- train(dataset_train, training_set$Liked, method="xgbTree")
predict(model, newdata=dataset_test)
However when I run this part:
######
#LIME#
######
explainer <- lime(training_set$Review, model, preprocess = dtm)
explanation <- explain(training_set$Review[1], explainer, n_labels = 1, n_features = 5)
plot_features(explanation)
It says:
Error in predict.xgb.Booster(modelFit, newdata) :
Feature names stored in `object` and `newdata` are different!
I ensured that my train and test data had the same column names and numbers before running this. I have also looked around and found that my problem is similar to this post but I still lack understanding the link to this. R: LIME returns error on different feature numbers when it's not the case
I spent weeks working on this and searching online but to no avail so any help or guidance as to what I should do is greatly appreciated!
My data:
Dataset: https://drive.google.com/file/d/1-pzY7IQVyB_GmT5dT0yRx3hYzOFGrZSr/view?usp=sharing