【问题标题】:SVM Light loader for scikit learn用于 scikit 学习的 SVM 轻型加载器
【发布时间】:2012-11-19 20:08:19
【问题描述】:

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

下面是一个示例,我采用 svm light 格式,将 ito 写入 stringio 对象,然后在其上使用 sic 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

【问题讨论】:

    标签: python file machine-learning svm


    【解决方案1】:

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

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

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


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

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

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

    【讨论】:

    • 您好,感谢您尝试帮助我。仍然是一个悬而未决的问题,不确定您的答案是否已解决。 a) sklearn 有自己的 liblinear svm 包装器 b) svm -light 仅是数据格式 c) 目前我正在根据一些预处理要求创建新文件,将文件存储到硬盘然后通过 load_svmlight_file 读取它 -指向磁盘上被覆盖的特定文件。而不是写入磁盘,我想写入我更快的内存并让 load_svm_light 指向存储在内存中的这个文件。
    • 我使用 cstringio 使用文件之类的对象失败了。因此,任何解决此问题的方法都会有所帮助!抱歉,无法将所有这些都放在一条评论中。
    • 我不知道你是否可以写入工作内存并从那里读取,但我没有得到它的必要性。为什么需要这样一个内存效率高的程序?您愿意写入工作内存的文本文件的平均大小是多少?
    • 通常在 2 和 3 之间。基本上我正在尝试一千个模型版本,每次数据预处理步骤都必须改变(以适应模型假设)——这意味着每个模型都有略有不同的数据集。必须有一种方法可以直接连接到缓冲区——这就是我认为 CstringIO 的用途。
    猜你喜欢
    • 2015-07-18
    • 2014-02-02
    • 2018-02-06
    • 2020-12-10
    • 2018-07-07
    • 1970-01-01
    • 2020-04-24
    • 2017-11-26
    • 2018-01-21
    相关资源
    最近更新 更多