【发布时间】:2015-10-25 08:47:44
【问题描述】:
我正在使用 scikit-learn 构建一个分类器,该分类器适用于(有点大的)文本文件。我目前需要一个简单的词袋特征,因此我尝试使用 TfidfVectorizer/HashingVectorizer/CountVectorizer 来获取特征向量。
但是,一次处理整个训练数据以获得特征向量会导致 numpy/scipy 中的内存错误(取决于我使用的向量化器)。所以我的问题是:
从原始文本中提取文本特征时:如果我将数据以块的形式拟合到矢量化器中,这是否与一次拟合整个数据相同?
用代码来说明这一点,如下:
vectoriser = CountVectorizer() # or TfidfVectorizer/HashingVectorizer
train_vectors = vectoriser.fit_transform(train_data)
与以下不同:
vectoriser = CountVectorizer() # or TfidfVectorizer/HashingVectorizer
start = 0
while start < len(train_data):
vectoriser.fit(train_data[start:(start+500)])
start += 500
train_vectors = vectoriser.transform(train_data)
在此先感谢,如果这个问题完全迟钝,我们深表歉意。
【问题讨论】:
-
代码中是否有任何地方可以释放内存,例如通过摆脱对已解析文本数据的引用?或者您是否可以切换到 64 位 Python 和/或不同的操作系统(例如,Windows 会限制分配给每个进程的内存,Ubuntu 不会)。
-
@AleksanderLidtke,感谢您的评论。回答您的问题: 1. 我无法释放更多内存。我不会将整个文本文件加载到内存中,我只会将文件名传递给 scikit-learn 矢量化器。这意味着如果可以在 scikit-learn 内部进行任何内存使用优化。 2. 换成其他操作系统会有问题。 3.我不认为问题是因为使用了太多的内存。我以前见过我的 python 应用程序使用高达 1.8GB 的 RAM,而现在它在大约 500MB 时崩溃。我应该打开另一个问题并发布我收到的异常跟踪吗?
-
没问题。没错,我明白了。我不知道 scikit 的底层工作原理,我只使用了它的一部分。也许您可以自己读取数据,然后提取相关位,并使用那些具有 scikit 内存效率更高功能的位?还是写信给开发商?此外,内存不足的进程可能是 Python 进程的子进程。查看运行脚本时是否有任何东西占用大量内存。
-
@DarkMatter scikit-learn 使用我的所有 8GB RAM(以及更多)没有问题。您可能会遇到内存错误,因为它想在内存中分配一个巨大的矩阵。所以 RAM 实际上从未使用过,但您仍然有内存问题。对我来说,这似乎是一个合理的问题;)。
标签: python python-2.7 scikit-learn