我在尝试分析文本,但我的Mac只有8GB的内存,RidgeRegressor在一段时间后就停止了,显示Killed: 9
。我认为这是因为它需要更多的内存。
有没有办法禁用堆栈大小限制器,让算法可以使用某种交换内存?
回答:
你需要手动进行操作。
这里可能有两个不同的核心问题:
- A:保存训练数据
- B:训练回归器
对于A,你可以尝试使用numpy的memmap,它可以抽象掉交换操作。作为替代方案,你可以考虑将数据准备成HDF5格式或某种数据库。对于HDF5,你可以使用h5py或pytables,这两者都支持类似numpy的使用方式。
对于B:最好使用一些支持离线核心算法的算法。在scikit-learn中,这些算法支持partial_fit。
请记住,这个训练过程至少分解为两个新的元素:
- 在内存方面的效率
- 交换很慢;你不希望使用在学习过程中需要N^2辅助内存的东西
- 有效的收敛
上面链接中的那些算法在这两方面应该都合适。
SGDRegressor可以参数化成类似于RidgeRegression。
另外:可能需要手动使用partial_fit
,遵守算法的规则(通常为了收敛证明需要某种随机排序)。抽象掉交换的问题在于:如果你的回归器在每个epoch中进行排列,而不知道这有多昂贵,你可能会遇到麻烦!
由于这个问题本身相当困难,因此有一些专门为此构建的库,而sklearn则需要如上所述的更多手动操作。其中一个最极端的库(有很多疯狂的技巧)可能是vowpal_wabbit(其中IO通常是瓶颈!)。当然,还有其他流行的库,比如pyspark,服务于稍微不同的目的(分布式计算)。