서포트 벡터 머신 SVM(Support Vector Machine) 알고리즘 예제
지난 글에 이어서 이번 글에서는 실제 libsvm예제 사용법에 대해서 설명드리도록 하겠습니다.
소스코드를 다운 받은 뒤에 빌드하여, 예제 스크립트를 이용하여 테스트 파일을 학습하고 평가해 볼 것입니다.
먼저 명령어로 예제 소스코드와 libsvm 라이브리리를 다운 받으실 수 있습니다.
$ git clone https://github.com/cjlin1/libsvm.git
$ cd libsvm && make
그리고 위의 명령어로 소스코드를 다운 받은 뒤에 빌드를 합니다. 성공적으로 빌드되었을 경우 아래의 실행파일이 생성된 것을 확인 하실 수 있습니다.
svm-scale : 학습 또는 테스트 데이터를 스케일링 하는 실행파일
svm-train : SVM 모델을 학습하는 바이너리 실행 파일
svm-predict : 학습된 모델을 이용하여 데이터를 예측하는 실행파일
SVM 모델을 학습 하고 평가하기 위해서는 데이터 파일을 먼저 준비해야 합니다. 그 다음 데이터 파일로 부터 모델을 생성하여 테스트 파일로 모델을 예측하거나 평가 할 수 있습니다.
1. 데이터 파일
먼저 libsvm에서 모델을 학습하고 평가하기 위헤서는 데이터 파일이 필요한데, 학습 데이터 및 평가 데이터 파일의 구조는 동일합니다. libsvm 에서 사용되는 데이터 파일의 구조는 아래와 같습니다.
<label> <index1>:<value1> <index2>:<value2> ...
.
.
.
SVM을 분류 알고리즘으로 사용할 경우 <label>은 분류 알고리즘의 경우 분류하고자 하는 클래스를 정의하고자 하는 것이고, 회귀 알고리즘을 사용하게 될 경우 목표 값입니다. 그리고 <index>는 1부터 시작하는 특징의 차원이고, <value>는 해당 특징의 값입니다.
2. 데이터 스케일링
입력된 테스트파일의 특징을 스케일링 합니다. svm-scale 이라는 바이너리 파일로 특징을 특정한 범위로 스케일링 할 수 있지만 이번 글에서는 직접 실행하지 않고 모델을 생성하고 평가하기 위한 스크립트에서 내부적으로 실행되게 됩니다.
직접 샘플의 특징을 직접 스케일링 할 수도 있기 때문에 사용방법을 첨부해 드립니다.
Usage: svm-scale [options] data_filename
options:
-l lower : x scaling lower limit (default -1)
-u upper : x scaling upper limit (default +1)
-y y_lower y_upper : y scaling limits (default: no y scaling)
-s save_filename : save scaling parameters to save_filename
-r restore_filename : restore scaling parameters from restore_filename
참고로 데이터 스케일링하실 때 주의하실 점은 스케일링된 데이터로 학습했을 경우, 평가할 때도 동일한 범위로 스케일링 된 데이터로 평가를 해야 올바른 평가가 되게 됩니다.
3. 모델 생성
학습 데이터 또는 스케일링 된 데이터에서 모델을 생성하는 단계로 svm-train이라는 바이너리 파일이 사용됩니다.
이번 글에서는 직접 바이너리 파일을 호출하여 테스트 하지 않고, 파이썬 스크립트를 통해서 한 번에 실행될 것입니다.
svm-train 바이너리의 사용 방법은 아래와 같습니다.
Usage: svm-train [options] training_set_file [model_file]
options:
-s svm_type : set type of SVM (default 0)
0 -- C-SVC (multi-class classification)
1 -- nu-SVC (multi-class classification)
2 -- one-class SVM
3 -- epsilon-SVR (regression)
4 -- nu-SVR (regression)
-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)
4 -- precomputed kernel (kernel values in training_set_file)
-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)
-v n: n-fold cross validation mode
-q : quiet mode (no outputs)
4. 모델 예측 및 평가
학습된 모델을 예측하거나 평가하기 위해 사용되는 파일은 svm-predict 파일입니다. 사용방법은 아래와 같습니다.
Usage: svm-predict [options] test_file model_file output_file
options:
-b probability_estimates: whether to predict probability estimates, 0 or 1 (default 0); for one-class SVM only 0 is supported
-q : quiet mode (no outputs)
5. 테스트
위에서 설명해 드린 데이터 스케일링, 학습, 평가 등을 한 번에 할 수 있도록 파이썬 스크립트를 라이브러리에서 제공됩니다.
먼저 라이브러리 디렉토리에서 tools 라는 위치로 이동 후에 아래와 같은 내용의 xor.txt 파일을 생성합니다.
1 1:0 2:1
1 1:1 2:0
0 1:1 2:1
0 1:0 2:0
데이터 파일의 형태를 설명드렸던 것처럼 결과 값(label)이 1또는 0에 따라 각각의 인덱스에 따른 값을 지정한 것입니다.
그 다음 아래와 같이 easy.py 라는 명령어를 실행합니다.
libsvm/tools]$ cat xor.txt
1 1:0 2:1
1 1:1 2:0
0 1:1 2:1
0 1:0 2:0
libsvm/tools]$ python easy.py xor.txt
Scaling training data...
Cross validation...
Best c=0.03125, g=0.0078125 CV rate=0.0
Training...
Output model: xor.txt.model
easy.py 스크립트는 2개의 파라미터를 전달 받는데, 첫번째 파라미터는 학습데이터 파일이고, 두번째 파라미터는 테스트 파일의 경로입니다.
테스트 파일을 지정하지 않고 위와 같이 학습 파일만 지정하게 되면, 테스트는 수행하지 않고 학습된 모델만 생성하게 됩니다.
학습 후에는 xor.txt.model 파일이 생성되는데, 이 모델 파일을 이용하여 svm-predict 으로 예측 하거나 테스트 하실 수 있습니다.
그리고 아래의 명령어로 학습데이터와 테스트 데이터를 한 번에 지정하여 테스트 까지 한 번에 진행 하실 수도 있습니다.
$ python easy.py xor.txt xor.txt
Scaling training data...
Cross validation...
Best c=0.03125, g=0.0078125 CV rate=0.0
Training...
Output model: xor.txt.model
Scaling testing data...
Testing...
Accuracy = 100% (4/4) (classification)
Output prediction: xor.txt.predict
일반적으로 학습데이터와 테스트 데이터를 분리하여 모델을 평가하지만 libsvm 라이브러리의 기능을 확인 하기 위해서 동일한 파일을 입력하였습니다. 입력된 4개의 값이 올바르게 분류한 것을 아실 수 있습니다.
( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)