2011-04-22 2 views
1

libsvm 예측 정확도에 대한 질문이 있습니다. 나는 easy.py를 사용하여 svm 모델 파일을 생성했다. 이제, 파이썬에서 테스트 벡터를 프로그램 적으로 예측하려고 시도 할 때 잘못 예측 된 레이블 (모두 1)을 표시하지만 easy.py를 사용하면 91 %의 정확도를 얻습니다.생성 된 모델을 사용한 libsvm 예측 문제

내 테스트 및 기차 데이터의 각 행 형식은 다음과 같습니다

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

왜 목록/튜플 대신 사전에 데이터를 제공합니까? 또한 libsvm 버전은 무엇입니까? – highBandWidth

+1

기본적으로 libsvm은 정확도 (TP + TN)/ALL을 극대화합니다. 이는 하나의 클래스에서 나오는 대부분의 샘플에 대한 바이너리 문제로 인해 모든 데이터에 하나의 레이블로 라벨이 지정됩니다. 대신 F 점수 (2 * 정밀도 * 리콜)/(정밀도 + 리콜)를 극대화하십시오. – matcheek

+0

나는 해결책을 찾아 냈다. 어떤 이유로 libsvm (libsvm 3.0은 내가 사용하는 버전입니다.)은 원래 test_data로 예측하려고 할 때 잘못된 클래스 레이블을 예측합니다. 모든 것을 1로 예측합니다. 그러나 확장 된 test_data로 예측하려고하면 올바른 값을 예측합니다 (easy.py를 실행 한 출력에서 ​​예상 한대로). @highbandwidth : 저는 libsvm 3.0을 사용합니다 (3.1이 나와 있지만). 필자는 테스트 벡터를 각 dict이 특징 벡터를 나타내는 dicts 목록으로 읽습니다. 같은 튜토리얼을 사용하여 웹에서 찾았으므로 동일한 작업을 수행했습니다. – garak

답변

0

예측 된 값을 얻기 위해 스케일 된 입력 값을로드해야합니다. 문제가 해결되었습니다.

그러나 예상되는 생성 된 예측 된 레이블과 모델을로드하고 레이블을 예측할 때의 유사성이 다소있는 것으로 보입니다.

웹의 libsvm에 대한 적절한 설명서가 없습니다.

+0

나는 여러 번 libsvm을 사용했는데 실험을 시작하기 전에 가이드를 따라야한다는 것이 내 경험이다. http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf 그것. 필자는 래퍼를 사용하고 싶지 않고 bash에서 직접 주요 루틴을 호출하기를 금방 알았다. 다른 평가 메트릭을 사용하거나 병렬로 실행하려는 경우 cpp 코드를 변경해야합니다. 나는 교수님 한테 전자 메일을 썼다. Lin Chih Jen이 한 시간 안에 응답을 받았습니다. 정리하자면, libsvm 가이드를 따라 C++ 루틴을 직접 호출 해보십시오. – matcheek