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

kyl*_*tor 2 python memory scikit-learn cross-validation

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

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

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

ldi*_*rer 5

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

我的数据集只有 ~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. 在训练分类器之前应用特征选择。这个 scikit-learn 示例展示了如何使用卡方统计数据来选择基于稀疏数据的特征。
  3. 应用降维技术,例如 SVD(我会研究潜在语义索引,但我对此并不精通)。

选项 1. 和 2. 组合应该已经允许您显着减少功能的数量。

如果这有帮助,请告诉我。