【问题标题】:Sklearn K-Fold Cross Validation Memory IssuesSklearn K-Fold 交叉验证内存问题
【发布时间】:2015-09-26 15:33:27
【问题描述】:

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

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

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

【问题讨论】:

  • 简单的问题是您运行的是 64 位版本,您的笔记本电脑有多少内存?
  • 感谢您关注@EdChum。我正在运行 64 位版本并拥有 8 GB 内存。
  • 另一个简单的问题——你能用 CV 在训练集上运行它吗?也就是说,是 CV 导致了问题吗?
  • 嘿@AmiTavory。我认为问题在于实际上索引到训练和测试集。例如,在我的 CV for 循环中,如果我只是编写打印语句来打印出交叉验证的每个折叠的索引数组,这没有问题。但是,如果我运行相同的 for 循环,而是尝试使用 KFold 对象生成的索引为训练和测试集编制索引,我的代码永远不会通过交叉验证的第一折。我希望这能回答你的问题。
  • @kylerthecreator 我的问题有一个错字:我的意思是“你能在没有简历的情况下运行它吗”。 IIUC,您的回答部分解决了这个问题,正如您所说,即使是索引也是一个问题。不过,为了获得更多信息,也许您可​​以检查是否可以在没有 CV 的情况下在整个数据集上运行文本分类器。

标签: python memory scikit-learn cross-validation


【解决方案1】:

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

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

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 获得的功能数量,您有多种选择:

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

选项 1. 和 2. 结合起来应该已经可以让您显着减少功能的数量。

如果有帮助,请告诉我。

【讨论】:

  • 非常同意。 245K 行看起来不错,但 81K 列太疯狂了。也许先做一个降维。
猜你喜欢
  • 2016-10-21
  • 1970-01-01
  • 2019-02-19
  • 2011-10-01
  • 2018-09-11
  • 2020-10-25
  • 1970-01-01
  • 2020-07-30
  • 2018-04-25
相关资源
最近更新 更多