Классификация текста - randomForest.переменные в обучающих данных, отсутствующих в новых данных - PullRequest
0 голосов
/ 19 сентября 2018

Я совершенно новичок в статистическом обучении и т. Д., Но меня особенно интересует классификация текста.Я следил за лабораторией, которую нашел по этой теме: 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 голосов
/ 19 сентября 2018

Проблема в том, что 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
...