Sklearn K-Fold Cross Validation Memory Issues
我试图使用一个简单的文本分类器运行一些监督的实验,但是在使用Sklearn中的K Fold生成器时遇到内存问题。我收到的错误是:"您的系统已用完应用程序内存",但是我的数据集只有?245K行x?81K列。大,肯定,但不大。该程序永远不会终止,而是"挂起",直到我手动关闭终端应用程序为止。我已经让它像这样运行了大约30分钟,没有任何进展。
我还用print语句编写了代码,以查看代码在交叉验证for循环中的什么地方卡住了。看起来好像生成了训练和测试集的索引,但是代码从来没有达到使用这些索引为特征和标签切分实际训练和测试集的地步。我正在运行10.9.5的Macbook Pro上运行它。我已运行此命令以关闭除终端机应用程序之外的所有其他应用程序,但没有成功。其他人对此有疑问吗,或者这可能是我的机器特有的?
编辑:我已经使用10倍和5倍交叉验证来运行此程序,每次都遇到相同的问题。
-
一个简单的问题是您运行的是64位版本,还是笔记本电脑上有多少内存?
-
感谢您查看@EdChum。我正在运行64位版本,并具有8 GB的内存。
-
另一个简单的问题-您可以使用CV在训练集上运行它吗?也就是说,是引起问题的简历吗?
-
嘿@AmiTavory。我认为问题在于实际索引到训练和测试集。例如,在我的CV for循环中,如果我只是编写打印语句来为交叉验证的每一折打印出索引数组,那么这没有问题。但是,如果我运行相同的for循环,而尝试使用KFold对象生成的索引来索引用于训练和测试集的数据集,则我的代码永远不会越过交叉验证的第一步。我希望能回答您的问题。
-
@kylerthecreator我的问题有一个错字:我的意思是"您可以在没有简历的情况下运行它吗"。 IIUC,您的回答部分解决了这个问题,因为您说即使是索引编制也是一个问题。不过,只是为了获得更多信息,您也许可以检查是否可以在没有CV的情况下在整个数据集上运行文本分类器。
-
@AmiTavory知道了。索引确实是问题所在。 Ive运行的代码甚至还没有训练分类器,因为我什至还没有将整个数据集划分为训练和测试集(我一直在尝试通过逻辑回归来运行它-没有参数调整,没有花哨的时间)。我使用100K实例的较小数据集运行了CV,但它不起作用。仅运行了1000个实例,它终于奏效了。我想知道大约245K实例是否有太多功能。即使使用train_test_split()函数运行,也无法在完整数据集上运行。
-
@kylerthecreator是的,您正在意识到250K实例有很多功能。您可以这样考虑:250K x 80K矩阵与250M x 80矩阵具有相同数量的元素。现在这对您来说可能听起来更大;)。您能否添加您正在使用的代码,以便我们可以看到您使用的数据结构等?
我认为第一个问题来自这一部分:
my dataset is only ~245K rows x ~81K columns. Large-ish, sure, but not huge.
245K x 80K听起来并不庞大,但让我们做一下数学运算并假设每个元素存储8个字节。如果您的矩阵不是稀疏的(显然是稀疏矩阵),则为245 * 80 * 8 MB需要大约160 GB的空间存储在RAM中。这实际上是巨大的!
您提到了文本分类,所以我猜您的功能是tf-idf或字数统计,而且它非常稀疏。您现在需要警惕的是,保持每一步的稀疏性,仅使用适用于稀疏数据且不会分配大小为n_samples * n_features的密集矩阵的算法。
朴素的贝叶斯分类器(例如,参见sklearn.naive_bayes.MultinomialNB)在文本分类方面取得了不错的成就,我将从这里开始。
只要分类器是稀疏矩阵(当然实际上足够稀疏),这样的分类器就可以轻松处理250K x 80K矩阵。
如果您仍然想减少从tf-idf获得的功能,则有几种选择:
通过停用词列表或将max_df参数设置为0.7或更低的值来删除停用词(这将丢弃文档中超过70%的任何术语)。
在训练分类器之前应用特征选择。此scikit-learn示例显示了如何使用卡方统计量基于稀疏数据选择要素。
应用降维技术,例如SVD(我会研究潜在语义索引,但是我对此并不熟练)。
选项1.和2.组合在一起应该已经可以使您大大减少功能的数量。
让我知道是否有帮助。
-
非常同意。 245K行看起来不错,但81K列太疯狂了。 也许先做降维。