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

Sklearn K-Fold Cross Validation Memory Issues

我正在尝试 运行 使用简单的文本分类器进行一些监督实验,但我 运行 在 [=11] 中使用 K Fold 生成器时遇到内存问题=].我得到的错误是状态:"Your system has run out of application memory",但我的数据集只有 ~245K 行 x ~81K 列。大 ish,当然,但不是很大。该程序永远不会终止,而是 "hangs" 直到我手动关闭终端应用程序。我已经这样 运行 了大约 30 分钟,没有任何进展。

我还编写了 print 语句来查看代码在交叉验证 for 循环中的哪个位置卡住了。看起来训练和测试集的索引已经生成,但是代码永远不会使用这些索引来切分特征和标签的实际训练和测试集。我在 Macbook Pro 运行ning 10.9.5 上 运行ning 这个。我已经 运行 关闭了除终端应用程序之外的所有其他应用程序,但没有成功。有没有其他人遇到过这个问题,或者这可能是我的机器特有的问题?

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

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

my dataset is only ~245K rows x ~81K columns. Large-ish, sure, but not huge.

245K x 80K 听起来并不大,但让我们算一下,假设每个元素 8 个字节 stored.If 你的矩阵不是稀疏的(显然在你的情况下它是一个稀疏矩阵),那将是245 * 80 * 8 MB 大约 160 GB 需要存储在您的 RAM 中。这实际上是巨大的!

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

朴素贝叶斯分类器(参见 sklearn.naive_bayes.MultinomialNB 例如)在文本分类方面取得了不错的成功,我将从这里开始。

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

如果您仍想减少从 tf-idf 获得的功能数量,您有多种选择:

  1. 删除停用词,使用停用词列表或将 max_df 参数设置为大约 0.7 或更低的值(这将丢弃超过 70% 的文档中的任何术语)。
  2. 在训练分类器之前应用特征 selection。 This scikit-learn example 展示了如何使用卡方统计数据来处理基于稀疏数据的 select 特征。
  3. 应用降维技术,例如 SVD(我会研究 Latent semantic indexing,但我并不精通)。

选项 1. 和 2. 的组合应该已经可以让您显着减少特征的数量。

如果有帮助请告诉我。