我在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")
答案 0 :(得分:0)
问题出在as.matrix(data_NADfm)
上-这使dfm变成了密集的矩阵,从而使其太大而无法处理。
解决方案:保持稀疏:要么删除as.matrix()
包装器,要么不喜欢原始dfm输入,则可以将其强制为纯稀疏矩阵(来自 Matrix 包)使用as(data_NADfm, "dgCMatrix")
。这应该很好,因为cv.glmnet()
及其predict()
方法都可以处理稀疏矩阵输入。