Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sklearn K-Fold交叉验证内存问题_Python_Memory_Scikit Learn_Cross Validation - Fatal编程技术网

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

Python Sklearn K-Fold交叉验证内存问题,python,memory,scikit-learn,cross-validation,Python,Memory,Scikit Learn,Cross Validation,我试图用一个简单的文本分类器进行一些有监督的实验,但在使用Sklearn中的K Fold生成器时遇到了内存问题。我得到的错误是:“您的系统已耗尽应用程序内存”,但我的数据集只有~245K行x ~81K列。当然是大的,但不是大的。程序从未终止,而是“挂起”,直到我手动关闭终端应用程序。我让它像这样运行了大约30分钟,没有任何进展 我还编写了print语句,以查看代码在交叉验证for循环中的何处被卡住。看起来像是生成了训练集和测试集的索引,但是代码从来没有切掉使用这些索引的特性和标签的实际训练集和测

我试图用一个简单的文本分类器进行一些有监督的实验,但在使用
Sklearn
中的
K Fold
生成器时遇到了内存问题。我得到的错误是:“您的系统已耗尽应用程序内存”,但我的数据集只有~245K行x ~81K列。当然是大的,但不是大的。程序从未终止,而是“挂起”,直到我手动关闭终端应用程序。我让它像这样运行了大约30分钟,没有任何进展

我还编写了
print
语句,以查看代码在交叉验证for循环中的何处被卡住。看起来像是生成了训练集和测试集的索引,但是代码从来没有切掉使用这些索引的特性和标签的实际训练集和测试集。我在运行10.9.5的MacBookPro上运行这个。除了终端应用程序,我已经关闭了所有其他应用程序,但没有成功。是否有其他人对此有问题,或者这可能是我的机器特有的问题


编辑:我已经用10倍和5倍交叉验证运行了这个,每次都遇到相同的问题。

我认为第一个问题来自这一部分:

我的数据集只有约245K行x约81K列。当然是大的,但不是大的

245K x 80K听起来不算大,但让我们做一个计算,假设每个元素存储8个字节。如果你的矩阵不是稀疏矩阵(显然在你的例子中它是稀疏矩阵),那将是245*80*8MB,因此大约160GB,需要存储在RAM中。这实际上是巨大的

你提到了文本分类,所以我猜你的特征是tf idf或字数,而且非常稀疏。您现在需要注意的是,在每一步都要保持稀疏性,并且只使用处理稀疏数据的算法,并且不会分配大小为
n个样本*n个特征的密集矩阵

NaiveBayes分类器(例如参见
sklearn.Naive_bayes.MultinomialNB
)在文本分类方面取得了不错的成功,我将从这里开始

这样的分类器可以轻松处理250K x 80K矩阵,只要它是稀疏矩阵(当然,实际上足够稀疏)

如果您仍想减少tf idf提供的功能数量,您有以下几种选择:

  • 使用停止字列表或通过将
    max_df
    参数设置为0.7左右或更低的值来删除停止字(这将丢弃超过70%文档中的任何术语)
  • 在训练分类器之前应用特征选择。演示如何使用卡方统计信息基于稀疏数据选择特征
  • 应用诸如SVD之类的降维技术(我会研究,但我并不精通)
  • 选项1。二,。组合应该已经允许您显著减少功能的数量


    如果有帮助,请告诉我。

    一个简单的问题是,您是否运行64位版本,以及您的笔记本电脑上有多少内存?谢谢您查找@EdChum。我运行的是64位版本,内存为8GB。另一个简单的问题是,你能用CV在训练集上运行它吗?也就是说,是CV导致了问题吗?嘿@AmiTavory。我认为问题在于实际索引到训练集和测试集。例如,在我的CV For循环中,如果我只编写print语句来打印交叉验证每次折叠的索引数组,那么这不会有问题。但是,如果我运行相同的for循环,而是尝试使用
    KFold
    对象生成的索引将训练集和测试集索引到数据集中,那么我的代码永远不会通过第一次交叉验证。我希望这能回答你的问题。@Kyler创建者我的问题有一个拼写错误:我的意思是“你能在没有简历的情况下运行它吗?”。IIUC,你的回答部分解决了这个问题,正如你所说的,即使索引也是一个问题。不过,为了获得更多信息,您可以检查是否可以在不使用CV的情况下在整个数据集上运行文本分类器。245K行看起来不错,但81K列太疯狂了。也许先做降维。