如何使用大数据集执行高效的 K 折 CV?

如何解决如何使用大数据集执行高效的 K 折 CV?

我正在尝试在 R 中执行情绪分析。我的问题是我创建的折叠不适用于更大的数据集(4 百万)。下面是更详细的说明。

我有以下数据集 x,其中包含带标签的文档。它包含一个包含字符串的列 TextSentiment 是第二列,包含将单个文本分类为“正面”或“负面”的因素。

以下代码生成 kf 折叠:

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?