【发布时间】:2015-11-21 10:54:14
【问题描述】:
我有一个庞大的数据集,我希望对其进行 PCA。我受到 RAM 和 PCA 计算效率的限制。 因此,我转而使用迭代 PCA。
数据集大小-(140000,3504)
documentation 声明 This algorithm has constant memory complexity, on the order of batch_size, enabling use of np.memmap files without loading the entire file into memory.
这真的很好,但不确定如何利用它。
我尝试加载一个 memmap,希望它能以块的形式访问它,但我的 RAM 崩溃了。 我下面的代码最终使用了大量 RAM:
ut = np.memmap('my_array.mmap', dtype=np.float16, mode='w+', shape=(140000,3504))
clf=IncrementalPCA(copy=False)
X_train=clf.fit_transform(ut)
当我说“我的 RAM 爆炸”时,我看到的 Traceback 是:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\sklearn\base.py", line 433, in fit_transfo
rm
return self.fit(X, **fit_params).transform(X)
File "C:\Python27\lib\site-packages\sklearn\decomposition\incremental_pca.py",
line 171, in fit
X = check_array(X, dtype=np.float)
File "C:\Python27\lib\site-packages\sklearn\utils\validation.py", line 347, in
check_array
array = np.array(array, dtype=dtype, order=order, copy=copy)
MemoryError
如何在不影响准确性的情况下通过减少批量大小来改进这一点?
我的诊断思路:
我查看了sklearn 源代码,在fit() 函数Source Code 中可以看到以下内容。这对我来说很有意义,但我仍然不确定我的情况出了什么问题。
for batch in gen_batches(n_samples, self.batch_size_):
self.partial_fit(X[batch])
return self
编辑: 在最坏的情况下,我将不得不为 iterativePCA 编写自己的代码,该代码通过读取和关闭 .npy 文件来进行批处理。但这会破坏利用已经存在的黑客的目的。
编辑2:
如果我能以某种方式删除一批已处理的memmap file。这很有意义。
编辑3: 理想情况下,如果 IncrementalPCA.fit() 只是使用批处理,它不应该使我的 RAM 崩溃。发布整个代码,只是为了确保我之前没有将 memmap 完全刷新到磁盘时出错。
temp_train_data=X_train[1000:]
temp_labels=y[1000:]
out = np.empty((200001, 3504), np.int64)
for index,row in enumerate(temp_train_data):
actual_index=index+1000
data=X_train[actual_index-1000:actual_index+1].ravel()
__,cd_i=pywt.dwt(data,'haar')
out[index] = cd_i
out.flush()
pca_obj=IncrementalPCA()
clf = pca_obj.fit(out)
令人惊讶的是,我注意到out.flush 并没有释放我的记忆。有没有办法使用del out 完全释放我的内存,然后有人将文件的指针传递给IncrementalPCA.fit()。
【问题讨论】:
-
相信this answer会给你一些提示
-
1) 为什么不指定转换后所需的特征数量?我的意思是在转换之后你可能会得到相同的数据集,但是在 RAM 中(因为它是由转换生成的),因此它会消耗大量的 RAM。在构造函数中指定 n_components 参数。 2)即使您指定了 n_components (必须小于或等于数据集中的特征数),它也可能不适合内存,因为您正在尝试一次性计算转换后的数据集。可能需要批量转换,每批次调用transform方法,将转换后的数据保存到HDD。
-
@Olologin 感谢您的评论!我只尝试了
clf = IncrementalPCA().fit(X_train_mmap),它使我的 RAM 崩溃了。我热衷于节省 98% 的方差。 -
@AbhishekBhatia,尝试使用 IncrementalPCA(n_components=1).fit(X_train_mmap)。是否成功完成?
-
您在问题中遗漏了一些非常重要的信息——这使得@Olologin 很难提供帮助。首先-您说“炸毁了我的RAM”。你应该把完整的追溯。说
MemoryError在调用fit时立即发生也会很有帮助——而不是经过一些繁重的处理。我知道您正在尝试通过节省空间并表明您已经考虑过问题可能出在哪里来提供帮助,但始终要追溯。您能否检查我在您的问题中编辑的 Traceback 是否与您看到的相符?
标签: python numpy scikit-learn pca