0

当我尝试将svmlight python 包与已转换为 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')
4

1 回答 1

2

一个明显的问题是,您在打开数据文件时会截断它,因为您指定的是 write mode "w"。这意味着将没有要读取的数据。

无论如何,如果您的数据文件与本例中的数据文件类似,则不需要像那样读取文件,因为它是一个 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)
于 2014-09-04T12:52:40.493 回答