Наивное байесовское тестирование на невидимых данных

Я построил классификатор Байеса (из пакета bnlearn, так как я хочу сделать полиномиальную модель Байеса) для набора данных, содержащего текстовые сообщения.

Мой тренировочный набор выглядит следующим образом: я должен отнести данное сообщение к определенному КЛАССУ.

message                
Worth reading mums;;;hope we too could
Musical bonding classes for a 9 month old- Yay or Nay? Should we start or wait for a few more months?
Girls...what plans for valentine...?.

CLASS
1
2
3

dataset <- read.csv("Traindataset.csv",header = TRUE, sep = ",", stringsAsFactors = FALSE)
df <- Corpus(VectorSource(dataset$message))
df1 <- tm_map(df, stripWhitespace)
df1 <- tm_map(df1, tolower)
df1 <- tm_map(df1, removePunctuation)
df1 <- tm_map(df1, removeNumbers)
df1 <- tm_map(df1, removeWords, stopwords("english"))
dtm <- DocumentTermMatrix(df1)
dtm1 <- as.matrix(dtm)
dtm1 <- as.data.frame(cbind(dtm1, CLASS = dataset$CLASS))
dtm1 <- as.data.frame(lapply(dtm1, as.factor))
bn <- naive.bayes(dtm1, "CLASS")
pred = predict(bn, dtm1)

Когда я предсказываю те же данные, он работает нормально, не выдавая никаких ошибок. Проблема, с которой я сталкиваюсь, заключается в том, что когда я тестирую модель bn на невидимых данных tst, она дает мне ошибку, что сеть и данные имеют разное количество переменных. Нужна помощь в этом.

tst <- read.csv("TestDataset.csv",header = TRUE, sep = ",", stringsAsFactors = FALSE)   
df <- Corpus(VectorSource(tst$message))    
df1 <- tm_map(df, stripWhitespace)
df1 <- tm_map(df1, tolower)
df1 <- tm_map(df1, removePunctuation)
df1 <- tm_map(df1, removeNumbers)
df1 <- tm_map(df1, removeWords, stopwords("english"))    
dtmtest <- DocumentTermMatrix(df1)    
dtmtest1 <- as.matrix(dtmtest)
dtmtest1 <- as.data.frame(cbind(dtmtest1, CLASS = tst$CLASS))
dtmtest1 <- as.data.frame(lapply(dtmtest1, as.factor))

> pred = predict(bn, dtmtest1)
Error in check.bn.vs.data(x, data) : 
  the network and the data have different numbers of variables.

РЕДАКТИРОВАТЬ:

> names(bn$tables) %in% names(dtmtest1)
logical(0)
> s <- names(bn$nodes) %in% names(dtmtest1)
> length(s)
[1] 6077
> sum(names(bn$nodes) %in% names(dtmtest1))
[1] 6057
> length(bn$nodes)
[1] 6077

> length(names(dtmtest1))
[1] 12509
> dtmtest1


> dtmtest
A document-term matrix (2309 documents, 12508 terms)

Non-/sparse entries: 51826/28829146
Sparsity           : 100%
Maximal term length: 123 
Weighting          : term frequency (tf)

> dtm
A document-term matrix (872 documents, 6076 terms)

Non-/sparse entries: 17041/5281231
Sparsity           : 100%
Maximal term length: 123 
Weighting          : term frequency (tf)
> 

person user1946217    schedule 11.06.2014    source источник
comment
Каков результат names(bn$tables) %in% names(dtmtest1)?   -  person jbaums    schedule 11.06.2014
comment
Отредактировал сообщение, чтобы включить результаты по вашему запросу.   -  person user1946217    schedule 11.06.2014
comment
Извините, я неправильно прочитал ваш пост и подумал, что вы используете naiveBayes из e1071 (вы можете удалить эту информацию о bn%tables). В любом случае, я думаю, что сообщение об ошибке довольно ясное — dtmtest1 не включает в себя точно такой же набор переменных, как и обучающие данные. Я считаю, что sort(names(dtmtest1)) должно соответствовать sort(names(dtm1)).   -  person jbaums    schedule 11.06.2014
comment
есть только 6057 терминов, которые совпадают в обучении и тестировании... Так что у меня все еще нет такого же количества переменных в моем тестовом наборе... как я могу справиться с этим   -  person user1946217    schedule 11.06.2014
comment
Для прогнозирования с помощью bnlearn требуются полные данные (неотсутствующие и одинаковые переменные). В качестве альтернативы вы можете делать прогнозы в сети bnlearn на основе доступных данных, используя gRain. Это может помочь вам начать, но вам нужно будет обернуть шаги в функции, чтобы применить ее к вашему полному набору данных проверки.   -  person user20650    schedule 11.06.2014