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

时间:2018-09-19 15:23:45

标签: r r-caret text-classification

我是统计学学习等的新手,但对文本分类特别感兴趣。我正在追踪在这里找到关于该主题的实验室: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),在此之前没有错误消息发生。

1 个答案:

答案 0 :(得分:0)

问题在于,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