3

Недавно я использовал классификатор Bag-of-Words для создания матрицы документов с 96% -ными сроками. Затем я использовал Дерево решений для обучения по модели на сумке ввода слов, чтобы предсказать, важно ли предложение или нет. Модель действительно хорошо работала в тестовом наборе данных, но когда я использовал набор данных для выборки, он не может предсказать. Вместо этого он дает ошибку.Использование мешков классификатора слов в наборе данных без выборки

Вот модель, которую я сделал в R

library('caTools') 
library('tm') 
library('rpart') 
library(rpart.plot) 
library(ROCR) 

data= read.csv('comments.csv', stringsAsFactors = FALSE) 
corpus = Corpus(VectorSource(data$Word)) 

# Pre-process data 
corpus <- tm_map(corpus, tolower) 
corpus <- tm_map(corpus, stemDocument) 

# Create matrix 
dtm = DocumentTermMatrix(corpus) 

# Remove sparse terms 
#dtm = removeSparseTerms(dtm, 0.96) 
# Create data frame 
labeledTerms = as.data.frame(as.matrix(dtm)) 

# Add in the outcome variable 
labeledTerms$IsImp = data$IsImp 

#Splitting into train and test data using caTools 

set.seed(144) 

spl = sample.split(labeledTerms$IsImp , 0.60) 

train = subset(labeledTerms, spl == TRUE) 
test = subset(labeledTerms, spl == FALSE) 

#Build CART Model 
CART = rpart(IsImp ~., data=train, method="class") 

Это работает совершенно отлично от тестирования набора данных, который точность около 83%. Однако, когда я использую эту модель корзины для прогнозирования на основе набора данных образца, это дает мне ошибку.

head(train) 
terms A B C D E F..............(n terms) 
Freqs 0 1 2 1 3 0..............(n terms) 

head(test) 
terms A B C D E F..............(n terms) 
Freqs 0 0 1 1 1 0..............(n terms) 


data_random = read.csv('comments_random.csv', stringsAsFactors = FALSE) 

head(data_random) 
terms A B D E F H..............(n terms) 
Freqs 0 0 1 1 1 0..............(n terms) 

Ошибка, которую я получаю, это «не удается найти C» в data_random. Я не знаю, что я должен сделать, чтобы сделать эту работу. Здесь лаплас сглаживает путь?

+4

Эта ошибка не является [воспроизводимой] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), потому что у нас нет «comments.csv». См. Встроенную ссылку для получения советов по созданию полных, минимальных воспроизводимых примеров, чтобы вам было легче помочь. – MrFlick

ответ

1

Проблема в том, что C является частью вашего учебного набора. Поэтому он рассматривается для модели. Это означает, что для прогнозирования требуется, чтобы было значение C.

В вашем тестовом наборе нет C. Вам нужно добавить столбец, в котором указано, что в тестовом наборе имеется 0 C.

0

Очень хорошо, что эта «ошибка» адресована. Поскольку @Felix предполагает, что эта ошибка возникает просто потому, что вам не хватает переменной в наборе данных прогнозирования. Поэтому ошибка довольно избыточна, и ее исправление не имеет никакого отношения к исправлениям лапласа и т. Д. Вам просто нужно убедиться, что у вас есть одинаковые переменные в вашем учебном наборе данных и в вашем наборе данных прогнозирования. Это может fx. быть сделано с:

names(trainingdata) %in% names(predictiondata)

... А какой-то дополнительный код

Теперь, причина, почему я считаю, что ошибка интересно потому, что она затрагивает фундаментальной дискуссии о том, как чтобы фактически подходить к моделированию текстовых данных. Поскольку, если вы просто добавляете переменные, которые отсутствуют для данных прогнозирования (т. Е. C), и заполняет ячейки нулями, вы получаете полностью избыточную переменную, которая заполняет пространство и память. Это означает, что вы можете также вывести переменную из данных ТРЕНИРОВКИ вместо данных предсказания.

Однако лучший способ подойти к проблеме состоит в том, чтобы генерировать слова слов, основанные как на данных обучения, так и на данных прогнозирования, и в дальнейшем разделять данные на обучающий набор и набор прогнозов. Это позаботится о вашей проблеме И в то же время будет более теоретически «правильным», потому что вы основываете свои слова на большей части общей популяции образцов (т.е. текстов)

Это мой прием в теме. Я надеюсь, что это помогает!