Сделайте прогнозы на новые данные после обучения модели GLM Lasso - PullRequest
0 голосов
/ 13 апреля 2020

Я обучил модель классификации на 13 000 рядов этикеток с помощью лассо в библиотеке r's gl mnet. Я проверил свою точность, и она выглядит прилично, теперь я хочу сделать прогнозы для остальной части набора данных, который составляет 300 000 строк. Мой подход состоял в том, чтобы маркировать остальные строки, используя обученную модель. Я не уверен, что это самая эффективная стратегия для приблизительной маркировки. Но, когда я пытаюсь пометить остальные данные, я сталкиваюсь с этой ошибкой:

Error in asMethod(object) : Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105

Даже если я разбью набор данных на 5000 строк для прогнозов, я все равно получаю ту же ошибку. Вот мой код:

library(glmnet)
#the subset of original dataset
data.text <- data.text_filtered %>% filter(!label1 == "NA")

#Quanteda corpus
data_corpus <- corpus(data.text$text, docvars =  data.frame(labels = data.text$label1))

set.seed(1234)  

dataShuffled <- corpus_sample(data_corpus, size = 12845)

dataDfm <- dfm_trim( dfm(dataShuffled, verbose = FALSE), min_termfreq = 10)

#model to train the classifier
lasso <- cv.glmnet(x = dataDfm[1:10000,], y = trainclass[1:10000], 
    alpha = 1, nfolds = 5, family = "binomial")

#plot the lasso plot
plot(lasso)

#predictions
dataPreds <- predict(lasso, dataDfm[10000:2845,], type="class")
(movTable <- table(dataPreds, docvars(dataShuffled, "labels")[10000:2845]))

делает прогнозы для остальной части набора данных. Этот набор данных имеет 300 000 строк.


data.text_NAs <- data.text_filtered %>% filter(label1 == "NA")

data_NADfm <- dfm_trim( dfm(corpus(data.text_NAs$text), verbose = FALSE), min_termfreq = 10)

data.text_filtered <- data.text_filtered %>% mutate(label = predict(lasso, as.matrix(data_NADfm), type="class", s="lambda.1se")

enter image description here Большое спасибо за любую помощь.

1 Ответ

0 голосов
/ 15 апреля 2020

Проблема заключается в as.matrix(data_NADfm) - это превращает dfm в плотную матрицу, что делает его слишком большим для обработки.

Решение: Держите его разреженным: либо удалите оболочку as.matrix(), либо если ему не нравится необработанный ввод dfm, вы можете привести его к простой разреженной матрице (из пакета Matrix ), используя as(data_NADfm, "dgCMatrix"). Это должно быть хорошо, так как cv.glmnet() и его метод predict() могут обрабатывать разреженные матричные входы.

...