文本分类 - randomForest。新数据中缺少训练数据中的变量

Text classification - randomForest. variables in the training data missing in newdata

我对统计学习等完全陌生,但对文本分类特别感兴趣。我正在关注我在此处找到的关于该主题的实验室:https://cfss.uchicago.edu/text_classification.html#fnref1。不幸的是,实验室在训练模型可以用于新数据之前就结束了,所以我试图弄清楚如何自己完成它。

我已经训练了我的模型,我正在使用随机森林。当我尝试对新数据使用 predict() 时,它会引发错误:Error in predict.randomForest(modelFit, newdata) : variables in the training data missing in newdata

这在我看来没有意义,因为测试数据实际上是原始数据的子集。我 假设 这个错误与我构建模型的方式与测试数据的数据结构有关,但老实说我没有足够的能力弄清楚如何解决错误或在哪里它实际上什至源于(尽管我认为我犯了一些荒谬的错误)。

还有其他帖子也有同样的错误,但我认为他们的错误来源与我的不同,我一整天都在努力寻找解决办法!

我在下面使用的完整代码:

library(tidyverse)
library(tidytext)
library(stringr)
library(caret)
library(tm)

data(USCongress, package = "RTextTools")
test <- congress[1:100, ]
congress <- congress[100:nrow(congress), ]

(congress <- as_tibble(USCongress) %>%
    mutate(text = as.character(text)))
(congress_tokens <- congress %>%
    unnest_tokens(output = word, input = text) %>%
    # remove numbers
    filter(!str_detect(word, "^[0-9]*$")) %>%
    # remove stop words
    anti_join(stop_words) %>%
    # stem the words
    mutate(word = SnowballC::wordStem(word)))
(congress_dtm <- congress_tokens %>%
    # get count of each token in each document
    count(ID, word) %>%
    # create a document-term matrix with all features and tf weighting
    cast_dtm(document = ID, term = word, value = n))
congress_dtm <- removeSparseTerms(congress_dtm, sparse = .99)
congress_rf <- train(x = as.matrix(congress_dtm),
                     y = factor(congress$major),
                     method = "rf",
                     ntree = 200,
                     trControl = trainControl(method = "oob"))
final_predictions <- predict(congress_rf, newdata = test)

最后一行(final_predictions <- predict(congress_rf, newdata = test)是出现错误的地方,之前没有出现错误信息。

问题是 test 不是您用来拟合模型的数据的子集 (congress_dtm)。如果您创建 congress_dtm 的子集,它确实有效:

#....
congress_dtm <- removeSparseTerms(congress_dtm, sparse = .99)
test <- congress_dtm[100, ]
congress_rf <- train(x = as.matrix(congress_dtm),
                     y = factor(congress$major),
                     method = "rf",
                     ntree = 200,
                     trControl = trainControl(method = "oob"))
final_predictions <- predict(congress_rf, newdata = test)
final_predictions
#> [1] 12
#> Levels: 1 2 3 4 5 6 7 8 10 12 13 14 15 16 17 18 19 20 21 99