전공관련/기타 etc.

[LibSVM] libsvm을 이용한 2-class classifier (2) - Training/Test (exe파일 이용)

매직블럭 2014. 2. 13. 13:38

지난번 1편에서 SVM 이 무엇인가 그 개념에 대하여 간략하게 살펴 보았다.


[LibSVM] libsvm을 이용한 2-class classifier (1) - SVM이란 무엇인가.


마지막에 이 SVM 을 잘 구현 해 둔 라이브러리 2종을 소개했는데 그중에서 LibSVM 을 이용하여 


Training 및 Test를 하는 방법에 대하여 다뤄보고자 한다.


가장 먼저 할일은 당연히 libsvm 을 다운로드 하는 것.


해당 사이트에서 zip 형식이나 tar 형식의 파일을 바로 다운로드 받을 수 있다. => libsvm 바로가기


받은 파일의 압축을 풀어보면 windows 폴더 안에 svm-train / svm-predict / svm-scale 등의 파일이 있다.


기본적인 학습에서는 저 세가지 파일을 이용하여 학습을 해 보려 한다.


1. 학습데이터 만들기


먼저 학습을 하기위해서는 svm 에서 요구하는 형태로 학습 데이터를 만들어 줘야 한다.


libsvm 에서 요구하는 학습데이터 형태는 아래와 

 <label> <index1>:<value1> <index2>:<value2> ...


여기서 label 이란 class 번호 이고 index는 0번부터 1씩 차례대로 증가 하면 된다. 

그리고 value에 들어가는 값이 feature 의 값이 된다.


예를들어 아래와 같은 형태의 학습 데이터가 있다고 가정을 하자.


 학습 데이터를 만들때 녹색동그라미를 Class0 / 빨간네모를 Class1 이라고 정하고 feature로는 x좌표,y좌표를 이용하기로 하자


그렇다면 학습에 필요한 데이터 파일의 형태는 다음과 같은 형태가 될 것이다.


0 0:1 1:7

0 0:3 1:6

0 0:2 1:4

0 0:1 1:2

1 0:6 1:3

1 0:7 1:1

1 0:5 1:1


0 1:1 2:7

0 1:3 2:6

0 1:2 2:4

0 1:1 2:2

1 1:6 2:3

1 1:7 2:1

1 1:5 2:1


( 수정 : feature index는 1부터 시작 )


지금은 단순히 x,y 좌표만을 이용 하기에 특징 하나당 feature의 차원이 2차원 밖에 되지 않지만


나중에 다른 특징값을 사용한다면 이 차원은 매우 길어 질 수 있다.



2. svm-train 을 이용하여 학습하기


svm-train을 사용하기 위해서는 시작 - 실행 - cmd 를 입력하여 명령프롬프트에서 수행한다.


라이브러리를 이용하여 프로젝트 내에서 사용하는 방법은 나중에 다시.. 하기로 하고


svm-train 을 사용하는 방법은 svm-train.exe 파일이 위치하는 곳으로 이동 한 뒤 아래의 서식대로 명령어를 입력한다.


파일위치>svm-train.exe [option] [training_data] [model_file]


여기서 training_data 는 방금 위에서 미리 만들어둔 학습 데이터이고 model_file은 학습된 svm 파라미터들이 


저장될 파일 명이다. 파일명을 입력하면 해당 이름으로 파일이 생성되고 별도의 입력이 없다면 training_data.model 로 


자동 생성 된다.


option에는 svm 학습을 위한 여라가지 옵션을 입력 할 수 있는데 사용 가능한 옵션은 아래와 같다.


options:
-s svm_type : set type of SVM (default 0)
	0 -- C-SVC
	1 -- nu-SVC
	2 -- one-class SVM
	3 -- epsilon-SVR
	4 -- nu-SVR
-t kernel_type : set type of kernel function (default 2)
	0 -- linear: u'*v
	1 -- polynomial: (gamma*u'*v + coef0)^degree
	2 -- radial basis function: exp(-gamma*|u-v|^2)
	3 -- sigmoid: tanh(gamma*u'*v + coef0)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/num_features)
-r coef0 : set coef0 in kernel function (default 0)
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
-m cachesize : set cache memory size in MB (default 100)
-e epsilon : set tolerance of termination criterion (default 0.001)
-h shrinking: whether to use the shrinking heuristics, 0 or 1 (default 1)
-b probability_estimates: whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)
-wi weight: set the parameter C of class i to weight*C, for C-SVC (default 1)
학습을 수행하면 다음과 같은 식으로 간략하게 파라미터를 보여주고 상세 데이터는 모델파일로 저장된다.



3. scaling 

학습 하기 전에 사용가능한 기능이다.

학습 하고자 하는 학습데이터의 범위를 사용자가 임의의 범위로 Re-Scaling 해 주는 기능이다.

기본 값은 [-1,1] 로 scaling 하게 된다.

libsvm 웹사이트에서 제공하는 guide 파일에서는 이러한 스케일된 셋을 이용하여 학습하는 방법을 다음과 같이 소개하고 있다.

$ ./svm-scale -l -1 -u 1 -s range1 svmguide1 > svmguide1.scale
$ ./svm-scale -r range1 svmguide1.t > svmguide1.t.scale
$ ./svm-train svmguide1.scale
$ ./svm-predict svmguide1.t.scale svmguide1.scale.model svmguide1.t.predict
-> Accuracy = 96.15%

4. predict


이제 모델 파일도 다 만들었으니 임의의 데이터를 넣고 이를 svm 으로 분류 시켜 보자 


test파일은 train파일과 형태는 똑같이 작성하면 된다.


임의의 데이터를 넣고 어느 클래스인지 찾아주는건 라이브러리를 이용하여 프로젝트 내에서는 사용할 수 있지만


exe 파일을 이용하여 Class 만 리턴 받는 방법은 아직 사용해보질 않아서 잘 모르겠다.


추후 검색하여 추가 하기로 하고 


일단은 test 파일에도 학습파일처럼 클래스를 미리 지정 해두고 이 클래스가 svm 결과와 같나 틀리나를 판별하는 것만 소개하기로 한다.


svm-train과 마찬가지로 해당위치에서 명령 프롬프트를 이용하여


파일경로>svm-predict.exe [test_data] [model_file] [result_file]


위와 같은 방법으로 실행한다. 


실행결과는 다음과 같이 검출률로 표시가 된다.



이상 간단하게 exe 파일을 이용하여 학습 및 검출테스트를 하는 방법을 봤는데 사실 exe 파일은 학습 모델만들때 사용하지


실제 검출할때는 exe 파일로 잘 실행을 안하지 않나.. 싶은 생각이다.( 사실 잘 모르겠다.. )


다음에는 기본 파라미터로 학습하던 일련의 과정을 최적 파라미터를 찾아 자동으로 학습까지 시켜주는 python script 의 사용법에 대하여 알아보기로 하자.