Ошибка загрузки формата svmlight

Когда я пытаюсь использовать пакет Py thon 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')

1 ответ

Решение

Одна очевидная проблема заключается в том, что вы усекаете свой файл данных при открытии, потому что вы указываете режим записи "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)
Другие вопросы по тегам