2014-09-04 60 views
0

当我尝试使用带有数据的svmlight python package我已经转换为svmlight格式时出现错误。它应该是非常基本的,我不明白发生了什么。下面的代码:加载svmlight格式错误

import svmlight 
training_data = open('thedata', "w") 
model=svmlight.learn(training_data, type='classification', verbosity=0) 

我也试过:

training_data = numpy.load('thedata') 

training_data = __import__('thedata') 
+0

你会得到什么错误?有没有可以发布的回溯? – mhawke 2014-09-04 12:44:04

回答

2

一个明显的问题是,你是截断你的数据文件,当你打开它,因为你是指定写入模式"w"。这意味着将不会有数据可读。

无论如何,如果您的数据文件与此example中的文件类似,则不需要读取该文件,您需要导入它,因为它是一个python文件。这应该工作:

import svmlight 
from data import train0 as training_data # assuming your data file is named data.py 
# or you could use __import__() 
#training_data = __import__('data').train0 

model = svmlight.learn(training_data, type='classification', verbosity=0) 

您可能想比较您的数据与示例。

编辑后的数据文件格式澄清

输入文件需要被解析成这样的元组的列表:

[(target, [(feature_1, value_1), (feature_2, value_2), ... (feature_n, value_n)]), 
(target, [(feature_1, value_1), (feature_2, value_2), ... (feature_n, value_n)]), 
... 
] 

的svmlight包装似乎并不支持读取一个SVM文件格式的文件,并且没有任何解析函数,所以它必须在Python中实现。 SVM文件看起来是这样的:

<target> <feature>:<value> <feature>:<value> ... <feature>:<value> # <info> 

所以这里是从文件格式转换成由svmlight包所需的解析器:

def svm_parse(filename): 

    def _convert(t): 
     """Convert feature and value to appropriate types""" 
     return (int(t[0]), float(t[1])) 

    with open(filename) as f: 
     for line in f: 
      line = line.strip() 
      if not line.startswith('#'): 
       line = line.split('#')[0].strip() # remove any trailing comment 
       data = line.split() 
       target = float(data[0]) 
       features = [_convert(feature.split(':')) for feature in data[1:]] 
       yield (target, features) 

而且你可以使用它像这样:

import svmlight 

training_data = list(svm_parse('thedata')) 
model=svmlight.learn(training_data, type='classification', verbosity=0) 
+0

当我尝试用“r”打开时,我得到'TypeError:文档的预期列表'。 当我尝试导入我得到'-1 0:1.173286269861675 1:0.4524566925178124 2:-0.9622895995173304 3:-0.0323228512901514 4:-0.3883630237637885 5:0.05964858946340369 6:0.4476052015809368 7:0.4476052012718441 8:0.03136114112311881 9:0.4500600446286898 10:0.4492788390876735 11:0.4479268098079717 12:0.4475026647089226 13:0.4479050146233448 14:0.4476815332854934 15:0.4474691649775809 16:0.4565717543476677 17:0.4475921191001453 ^ 语法错误:无效syntax' (以上是在我的数据文件中的一个实例的一个例子) – 2014-09-04 13:31:24

+0

数据文件不是实际上完全相同,因为我没有结构,只是数据。我用scikit学习数组来转换svmlight格式的函数,我不知道如何用一个struct来转换文件中的数据... – 2014-09-04 13:33:03

+0

@PF_learning查看更新回答 – mhawke 2014-09-05 10:52:01