如何解决如何使用大数据集执行高效的 K 折 CV?
我正在尝试在 R 中执行情绪分析。我的问题是我创建的折叠不适用于更大的数据集(4 百万)。下面是更详细的说明。
我有以下数据集 x
,其中包含带标签的文档。它包含一个包含字符串的列 Text
。 Sentiment
是第二列,包含将单个文本分类为“正面”或“负面”的因素。
kf <- 10 #Set number of folds
pos_sentiment <- data.table(x[x$Sentiment=="Positive",],rname = rownames(x[x$Sentiment=="Positive",]))
neg_sentiment <- data.table(x[x$Sentiment=="Negative",rname = rownames(x[x$Sentiment=="Negative",]))
pos_index <- split(pos_sentiment$rname,sample(1:kf,length(pos_sentiment$rname),replace=T))
bear_index <- split(neg_sentiment$rname,length(neg_sentiment$rname),replace=T))
folds <- lapply(1:kf,function(y) as.numeric(c(pos_index[[y]],neg_index[[y]])))
folds_data <- lapply(folds,function(y) x[y,])
我认为效率低下来自以下部分。该代码实际上生成了 10 组大小相同的数据集,这对于较大的数据集会产生问题。
data_prep_list<-function(data_set){
tests<-c(1:kf)
groups <- list()
#for each test set,construct a respective list with all combinations of train sets
for(i in seq_along(tests)){
#get train and validation sets for the given test set
train<-tests[!(tests %in% tests[i])]
#separate train and validation
tr<-combn(train,(kf-1))
#create list for train and validation sets
#first create a list of 8 for the train data
training <- list()
for(k in seq_len(ncol(tr))){
train <- data_set[tr[,k]]
train_table <- data.table()
for (b in 1:length(train)){
train_table <- rbind(train_table,train[[b]])
}
}
groups[[i]] <- list(training=train_table,test=data_set[[i]])
}
groups
}
此代码的结果是 groups
,在本例中包含 10 次迭代的 10 倍 CV。
从这里我生成文档-术语矩阵。
raw_kfolds <- data_prep_list(folds_data)
train_dtm_kfold <- lapply(1:kf,function(x) DocumentTermMatrix(Corpus(VectorSource(raw_kfolds[[x]]$training$Text))))
test_dtm_kfold <- lapply(1:kf,function(x) DocumentTermMatrix(Corpus(VectorSource(raw_kfolds[[x]]$test$Text))))
将上述内容插入朴素贝叶斯算法(例如使用 fnb.bernoulli()
)后,我收到以下错误:
NB_classifier <- lapply(1:kf,function(x) fnb.bernoulli(train_dtm_kfold[[x]],train_sentiment[[x]],sparse = TRUE))
Error: cannot allocate vector of size 1665.0 Gb
关于如何解决这个问题有什么建议吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。