[LibSVM] libsvm을 이용한 2-class classifier (2) - Training/Test (exe파일 이용)
지난번 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)
이제 모델 파일도 다 만들었으니 임의의 데이터를 넣고 이를 svm 으로 분류 시켜 보자
test파일은 train파일과 형태는 똑같이 작성하면 된다.
임의의 데이터를 넣고 어느 클래스인지 찾아주는건 라이브러리를 이용하여 프로젝트 내에서는 사용할 수 있지만
exe 파일을 이용하여 Class 만 리턴 받는 방법은 아직 사용해보질 않아서 잘 모르겠다.
추후 검색하여 추가 하기로 하고
일단은 test 파일에도 학습파일처럼 클래스를 미리 지정 해두고 이 클래스가 svm 결과와 같나 틀리나를 판별하는 것만 소개하기로 한다.
svm-train과 마찬가지로 해당위치에서 명령 프롬프트를 이용하여
파일경로>svm-predict.exe [test_data] [model_file] [result_file]
위와 같은 방법으로 실행한다.
실행결과는 다음과 같이 검출률로 표시가 된다.
이상 간단하게 exe 파일을 이용하여 학습 및 검출테스트를 하는 방법을 봤는데 사실 exe 파일은 학습 모델만들때 사용하지
실제 검출할때는 exe 파일로 잘 실행을 안하지 않나.. 싶은 생각이다.( 사실 잘 모르겠다.. )
다음에는 기본 파라미터로 학습하던 일련의 과정을 최적 파라미터를 찾아 자동으로 학습까지 시켜주는 python script 의 사용법에 대하여 알아보기로 하자.