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.
왜 목록/튜플 대신 사전에 데이터를 제공합니까? 또한 libsvm 버전은 무엇입니까? – highBandWidth
기본적으로 libsvm은 정확도 (TP + TN)/ALL을 극대화합니다. 이는 하나의 클래스에서 나오는 대부분의 샘플에 대한 바이너리 문제로 인해 모든 데이터에 하나의 레이블로 라벨이 지정됩니다. 대신 F 점수 (2 * 정밀도 * 리콜)/(정밀도 + 리콜)를 극대화하십시오. – matcheek
나는 해결책을 찾아 냈다. 어떤 이유로 libsvm (libsvm 3.0은 내가 사용하는 버전입니다.)은 원래 test_data로 예측하려고 할 때 잘못된 클래스 레이블을 예측합니다. 모든 것을 1로 예측합니다. 그러나 확장 된 test_data로 예측하려고하면 올바른 값을 예측합니다 (easy.py를 실행 한 출력에서 예상 한대로). @highbandwidth : 저는 libsvm 3.0을 사용합니다 (3.1이 나와 있지만). 필자는 테스트 벡터를 각 dict이 특징 벡터를 나타내는 dicts 목록으로 읽습니다. 같은 튜토리얼을 사용하여 웹에서 찾았으므로 동일한 작업을 수행했습니다. – garak