Проблема прогнозирования libsvm с использованием сгенерированной модели

1

У меня есть вопрос относительно точности прогнозирования libsvm. Я создал файл модели svm, используя easy.py. Теперь, когда я пытаюсь предсказать тестовые векторы программно в python, он показывает ошибочно предсказанные метки (все 1), тогда как, используя easy.py, я получаю точность 91%.

Каждая строка моих данных теста и поезда имеет следующий формат:

1 1:255 2:246 3:218 4:198 5:186 6:168 7:177 8:218 9:255 10:255 11:255 12:255 13:255 14:255 15:255 16:255 17:255 18:255 19:255 20:255 21:255 22:255 23:255 24:255 25:255 26:219 27:185 28:162 29:145 30:144 31:255 32:253 33:228 34:197

Код выглядит следующим образом, я делаю что-то неправильно здесь?

wimn_model = svm.svm_model("newtraindata.txt.model")
#load model
wimn_f_test=open('newtestdata.txt','r');
#load test data and train data
wimn_f_train=open('newtraindata.txt','r');

ii=0
for eachline in wimn_f_test:
        vec=eachline
        v=vec.split()
        vector={}
        ii=ii+1
        #print v[0]
        wimn_test_labels.append(int(v[0]))
        for i in range(1,len(v)):
                s=v[i].split(":")
                #print s[1]
                vector[i]=int(s[1])
        wimn_test_vectors.append(vector)
print "wimn test "+str(len(wimn_test_vectors))
# get the training and testing vectors and labels.
ii=0        
for eachline in wimn_f_train:
        vec=eachline
        v=vec.split()
        vector={}
        ii=ii+1
        wimn_train_labels.append(int(v[0]))
        #print v[0]
        for i in range(1,len(v)):
                s=v[i].split(":")
                #print s[1]
                vector[i]=int(s[1])
        wimn_train_vectors.append(vector)
print "wimn train "+str( len(wimn_train_vectors))

s=len(wimn_train_labels)
for i_s in range(0,s):
        #print i_s
        ww.append(wimn_model.predict(wimn_train_vectors[i_s]))

# wrongly predicted labels are in ww. correct labels are in wimn_train_labels, wimn_test_labels.
  • 0
    Почему вы даете данные в формате dict вместо списка / кортежа? Кроме того, какая у вас версия libsvm?
  • 1
    по умолчанию libsvm максимизирует точность (TP + TN) / ALL, что в двоичной проблеме с большинством выборок из одного класса приводит к маркировке всех данных одной меткой. Максимизируйте F-оценка (2 * точность * отзыв) / (точность + отзыв), вместо этого.
Показать ещё 1 комментарий
Теги:
libsvm

1 ответ

0

Нужно загрузить масштабированные входные значения, чтобы получить предсказанные значения. Проблема решена.

Но, похоже, существует некоторая несовместимость между easy.py генерируемыми прогнозируемыми метками и теми, которые я загружаю моделью и предсказываю метки.

В Интернете нет соответствующей документации по libsvm.

  • 0
    Я использовал libsvm несколько раз, и мой опыт показывает, что вы должны следовать руководству, csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf, прежде чем начать экспериментировать с ним. Я быстро понял, что не хочу использовать никакие обертки, и вызвал основные процедуры прямо из bash. Вам нужно будет изменить код cpp, если вы хотите использовать другие метрики оценки или запустить его в любом случае параллельно. Я даже написал письмо проф. Chih-Jen Lin и получил ответ менее чем за час. Подводя итог: следуйте руководству libsvm и попробуйте вызвать подпрограммы c ++ напрямую.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню