аккуратные прогнозы и путаница с glmnet - PullRequest
0 голосов
/ 12 октября 2018

Рассмотрим этот пример:

library(quanteda)
library(caret)
library(glmnet)
library(dplyr)

dtrain <- data_frame(text = c("Chinese Beijing Chinese",
                              "Chinese Chinese Shanghai",
                              "Chinese Macao",
                              "Tokyo Japan Chinese"),
                     doc_id = 1:4,
                     class = c("Y", "Y", "Y", "N"))

# now we make the dataframe bigger 
dtrain <- purrr::map_df(seq_len(100), function(x) dtrain)

Давайте создадим разреженную матрицу-термин документа и запустим некоторую glmnet

> dtrain <- dtrain %>% mutate(class = as.factor(class))
> mycorpus <- corpus(dtrain,  text_field = 'text')
> trainingdf <- dfm(mycorpus)
> trainingdf
Document-feature matrix of: 400 documents, 6 features (62.5% sparse).

И теперь мы, наконец, обратимся к модели лассо

mymodel <- cv.glmnet(x = trainingdf, y =dtrain$class, 
                     type.measure ='class',
                     nfolds = 3,
                     alpha = 1,
                     parallel = FALSE,
                     family = 'binomial') 

У меня два простых вопроса.

Как добавить прогнозы к исходным данным dtrain?На самом деле, простой вывод

mypred <- predict.cv.glmnet(mymodel, newx = trainingdf, 
                         s = 'lambda.min', type = 'class')

выглядит УЖАСНО, НЕ ТОРГОВО:

> mypred
    1  
1   "Y"
2   "Y"
3   "Y"

Как я могу использовать caret::confusionMatrix в этой настройке?Просто использование следующего создает ошибку:

confusion <- caret::confusionMatrix(data =mypred, 
+                                     reference = dtrain$class)
Error: `data` and `reference` should be factors with the same levels.

Спасибо!

1 Ответ

0 голосов
/ 12 октября 2018

В каждой модели классификации класс для вашей целевой переменной должен быть factor.

Например:

my_data - это набор данных, на котором вы обучаете модель, и my_target является предиктором.

Обратите внимание, что as.factor(my_data$my_target) автоматически найдет правильный levels для вас.

Под этим я подразумеваю, что вам не нужно указывать levels с помощьюрука, но R сделает это за вас.

См. здесь разницу, когда мы позвоним target:

target <- c("y", "n", "y", "n")
target
#[1] "y" "n" "y" "n" # this is a simple char
as.factor(target)
# [1] y n y n
# Levels: n y # this is a correct format, a factor with levels

Это важно, потому что даже если ваши прогнозы (или данные испытаний) будутпокажите только один из двух классов в target, модель будет знать, что фактическое levels может быть больше.

Вы, конечно, можете установить их:

my_pred <- factor(mypred, levels = c("Y", "N"))

Длядобавить их в данные, вы можете использовать

my_data$newpred <- my_pred

или

library(dplyr)
my_data %>% mutate(newpred = my_pred)
...