Python – 超越RAM限制?

我在尝试分析文本,但我的Mac只有8GB的内存,RidgeRegressor在一段时间后就停止了,显示Killed: 9。我认为这是因为它需要更多的内存。

有没有办法禁用堆栈大小限制器,让算法可以使用某种交换内存?


回答:

你需要手动进行操作。

这里可能有两个不同的核心问题:

  • A:保存训练数据
  • B:训练回归器

对于A,你可以尝试使用numpy的memmap,它可以抽象掉交换操作。作为替代方案,你可以考虑将数据准备成HDF5格式或某种数据库。对于HDF5,你可以使用h5pypytables,这两者都支持类似numpy的使用方式。

对于B:最好使用一些支持离线核心算法的算法。在scikit-learn中,这些算法支持partial_fit

请记住,这个训练过程至少分解为两个新的元素:

  • 在内存方面的效率
    • 交换很慢;你不希望使用在学习过程中需要N^2辅助内存的东西
  • 有效的收敛

上面链接中的那些算法在这两方面应该都合适。

SGDRegressor可以参数化成类似于RidgeRegression。

另外:可能需要手动使用partial_fit,遵守算法的规则(通常为了收敛证明需要某种随机排序)。抽象掉交换的问题在于:如果你的回归器在每个epoch中进行排列,而不知道这有多昂贵,你可能会遇到麻烦!

由于这个问题本身相当困难,因此有一些专门为此构建的库,而sklearn则需要如上所述的更多手动操作。其中一个最极端的库(有很多疯狂的技巧)可能是vowpal_wabbit(其中IO通常是瓶颈!)。当然,还有其他流行的库,比如pyspark,服务于稍微不同的目的(分布式计算)。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注