0

我正在运行一堆实验,其中几乎每次迭代的预处理都会发生变化。一旦我获得了某种格式的数据,我需要从 scikits (liblinear) 运行一个分类器。我可以将数据转换为 svm light 格式。我知道有一个模块可以将其转换为 scikits 标准。问题是我不想将文件写入磁盘。我有 48 gigs 的内存,更愿意在内存中进行转换。

下面是一个示例,我采用 svm light 格式,将 ito 写入 stringio 对象,然后在其上使用 svm light loader。不幸的是,装载机拒绝被切碎(它的工作原理是其他的)。有什么建议么?我正在运行超过 1000 个不同的预处理管道,但我无法继续写入磁盘。

样本 svm 光数据位于: http ://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/a1a

我的代码

 import numpy as np
 from sklearn.datasets import svmlight_format

 import cStringIO

 bufFile = cStringIO.StringIO()
 with open('C:/Users/theDesktop/Desktop/sampleData.txt') as a:
        p = a.readlines()
        a.close()

 bufFile.writelines(p)

 X_train, y_train = svmlight_format.load_svmlight_file(bufFile)

我的错误:

Traceback (most recent call last):

File "C:\Users\theDesktop\Desktop\module1.py", 
line 25, in <module> X_train, y_train=svmlight_format.load_svmlight_file(bufFile)

File "C:\Python27\lib\site-packages\sklearn\datasets\svmlight_format.py", 
line 97, in load_svmlight_file zero_based))

File "C:\Python27\lib\site-packages\sklearn\datasets\svmlight_format.py", 
line 177, in load_svmlight_files for _, indices, _, _ in r):

File "C:\Python27\lib\site-packages\sklearn\datasets\svmlight_format.py", 
line 177, in <genexpr> for _, indices, _, _ in r):

File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", 
line 1895, in amin return amin(axis, out)

ValueError: zero-size array to minimum.reduce without identity
4

1 回答 1

1

再看一遍,我想我在下面回答了一个不同的问题(如果您有兴趣可以查看)=) 您正在寻找一种内存高效的格式转换器和一个新的视角。首先,拥有 48 GB 的内存有什么问题?除非您正在处理包含数百万个文档的语料库,否则它对于文本处理来说已经足够了。其次,如果 sklearn 在不同的实例中将文件作为不同的文件写入磁盘,那么您可以将其调整为覆盖,最后您可以删除最后一次迭代。或者,您可以使用os连接终端,然后使用rm命令从那里删除您喜欢的任何文件,在每次迭代中或一次全部删除。

如果问题是 python 在每次迭代中创建一个新对象,那么覆盖又是一种内存效率的解决方案。

我正在努力帮助你;如果我误导或误解了您,请发表评论,以免其他阅读本文的人感到困惑。


表有点晚了,但据我了解,您使用 sklearn 作为 python 和 svm-light 之间的接口。我不知道你想要什么输出;但如果只是对不同预处理方法的精度测量,那么您可以使用ospython 库作为命令行之间的接口,然后在安装后可以从那里调用 svm-light。然后通过使用grep或类似工具,您可以提取准确性或其他所需信息,因为 svm-light 的学习和分类脚本确实将日志信息打印到 std 输出。另请注意,svm-light 在训练和分类后输出模型文件和其他文件,因此您需要rm在每次迭代中使用或其他工具删除它们,或者可能只是一次又一次地覆盖它们并最终删除它们。

通过这种方式,您可以按照您所说的那样保存内存,并且也许(?)可以获得比使用 sklearn 更多的信息。最后,我不确定此解决方法的复杂性:它可能更耗时,如果时间对您来说是一个限制,请检查它。

我不知道这是否是一种可能且有效的解决方法,我相信您已经克服了这种情况,因为它已经 3 个月了;但是如果您发表评论,这可能会对其他人有所帮助。

于 2013-03-19T08:19:38.170 回答