关于python:Sklearn K折叠交叉验证记忆问题

Sklearn K-Fold Cross Validation Memory Issues

我试图使用一个简单的文本分类器运行一些监督的实验,但是在使用Sklearn中的K Fold生成器时遇到内存问题。我收到的错误是:"您的系统已用完应用程序内存",但是我的数据集只有?245K行x?81K列。大,肯定,但不大。该程序永远不会终止,而是"挂起",直到我手动关闭终端应用程序为止。我已经让它像这样运行了大约30分钟,没有任何进展。

我还用print语句编写了代码,以查看代码在交叉验证for循环中的什么地方卡住了。看起来好像生成了训练和测试集的索引,但是代码从来没有达到使用这些索引为特征和标签切分实际训练和测试集的地步。我正在运行10.9.5的Macbook Pro上运行它。我已运行此命令以关闭除终端机应用程序之外的所有其他应用程序,但没有成功。其他人对此有疑问吗,或者这可能是我的机器特有的?

编辑:我已经使用10倍和5倍交叉验证来运行此程序,每次都遇到相同的问题。


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

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.组合在一起应该已经可以使您大大减少功能的数量。

    让我知道是否有帮助。