Sklearn K-Fold交叉验证内存问题

3

我试图使用简单文本分类器进行一些有监督的实验,但在使用Sklearn中的K Fold生成器时遇到了内存问题。我收到的错误信息是:"Your system has run out of application memory",但我的数据集只有约245K行x81K列。虽然有点大,但并不是很巨大。程序从未终止,而是一直“挂起”,直到我手动关闭终端应用程序。我让它这样运行了约30分钟,没有任何进展。

我还编写了print语句,以查看代码在交叉验证循环的哪个位置被卡住了。看起来已经生成了训练和测试集的索引,但代码从未到达使用这些索引切片实际的特征和标签的训练和测试集的点。我正在运行这个程序的Macbook Pro上,它运行的是10.9.5操作系统。我尝试过关闭除Terminal应用程序之外的所有其他应用程序,但没有成功。还有其他人遇到过这种问题吗?还是这可能是我的机器上出现的特定问题?

编辑:我使用10倍和5倍交叉验证运行了此程序,并且每次都遇到了同样的问题。


简单的问题,你是否在运行64位版本,并且你的笔记本电脑有多少内存? - EdChum
感谢查看@EdChum。我正在运行64位版本,并拥有8 GB的内存。 - kylerthecreator
另一个简单的问题 - 你能在训练集上运行它并进行交叉验证吗?也就是说,是交叉验证导致了问题吗? - Ami Tavory
@kylerthecreator 我的问题打错了:我是指“你能在没有CV的情况下运行它吗?”如果我理解正确,你的答案部分地回答了这个问题,因为你说即使索引也是一个问题。但是,为了获得更多信息,也许你可以检查一下是否可以在整个数据集上运行文本分类器而不使用CV。 - Ami Tavory
@kylerthecreator 是的,你意识到有很多功能可以用于250K个实例。你可以这样考虑:一个250K x 80K矩阵与一个250M x 80矩阵具有相同数量的元素。现在这可能听起来对你来说有点更大 ;)。你能否添加你正在使用的代码,以便我们可以看到你正在使用的数据结构等? - ldirer
显示剩余2条评论
1个回答

8
我认为第一个问题源于这部分内容:
我的数据集只有大约245K行x81K列。确实很大,但不算巨大。
245K x 80K听起来不是很大,但是我们假设每个元素存储需要8字节。如果您的矩阵不是稀疏矩阵(显然在您的情况下是稀疏矩阵),那么需要在RAM中存储大约160GB。这实际上是非常大的!
您提到文本分类,所以我猜测您的特征是tf-idf或单词计数,并且非常稀疏。现在需要注意的是保持每个步骤的稀疏性,并仅使用适用于稀疏数据的算法,并且不会分配大小为n_samples * n_features的密集矩阵。
朴素贝叶斯分类器(例如,请参见sklearn.naive_bayes.MultinomialNB)已经在文本分类方面取得了不错的成绩,我建议从这里开始。
只要它是稀疏矩阵(当然也足够稀疏),这样的分类器就可以轻松处理250K x 80K矩阵。
如果你仍然想减少从tf-idf获取的特征数,你有几个选择:
  1. 使用停用词列表或将max_df参数设置为约0.7或更低的值来删除停用词(这将丢弃任何在超过70%的文档中出现的术语)。
  2. 在训练分类器之前应用特征选择。这个scikit-learn示例展示了如何基于稀疏数据使用卡方统计量来选择特征。
  3. 应用降维技术,如SVD(我会查看潜在语义索引,但我不精通此技术)。
选项1和2结合起来应该已经可以显著减少特征数量。
如果有帮助,请告诉我。

非常同意。245K行看起来不错,但81K列太疯狂了。也许先进行降维处理。 - Jianxun Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接