训练GLM套索模型后对新数据进行预测

时间:2020-04-13 17:29:14

标签: r machine-learning classification quanteda lasso-regression

我在r的glmnet库中使用套索训练了13,000行标签的分类模型。我检查了我的准确性,它看起来还不错,现在我要对数据集的其余部分(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 :(得分:0)

问题出在as.matrix(data_NADfm)上-这使dfm变成了密集的矩阵,从而使其太大而无法处理。

解决方案:保持稀疏:要么删除as.matrix()包装器,要么不喜欢原始dfm输入,则可以将其强制为纯稀疏矩阵(来自 Matrix 包)使用as(data_NADfm, "dgCMatrix")。这应该很好,因为cv.glmnet()及其predict()方法都可以处理稀疏矩阵输入。