Major Study./Bioinformatics

c++ 개발환경에서 libsvm 사용하기 / visual studio

sosal 2014. 7. 21. 15:05
반응형

/*

 * http://sosal.kr/

 * made by so_Sal

 */

 

 

 

0. 서론

1. LIBSVM 다운받기

2. 튜토리얼용 Dataset 다운받기

3. C++ 프로젝트 생성하여 libsvm 사용하기

3.1 Cross-validation으로 데이터 feature의 성능 측정하기

3.2 Training으로 모델 만들기

3.3 Model을 이용하여 test 데이터 판별하기

 

 

 

 

 

0. 서론

libsvm은 supervised-machine learning으로, 학습용으로 주어진 데이터들로부터 모델을 만들고

모델에 없는 데이터셋에 대해서 정답 (classification: 1 or 0)을 예측하는 도구중 하나입니다. 

 - SVM: Support Vector Machine

 

SVM에서 model을 만들기 위한 데이터의 구성은 정답(class)과 피쳐벡터(feature vector)로 표현됩니다.

ex)

class Feature vector

1 186 132 162 ....

0 192 138 281 ....

SVM은 주어진 Feature vector와 class를 이용해 학습을 하여 모델을 생성하고

모델을 기반으로 주어진 input data에 대해 class를 예측합니다.

input data는 당연히 정답(class)을 모르며, SVM은 주어진 input에 대한 정답을 예측하는 역할을 수행합니다.

 

training: 모델을 생성하는 과정

scale: 데이터 정제

predict: 생성된 모델을 이용하여 test set (input data) 결과 예측하기

 

 

1. LIBSVM 다운받기

http://www.csie.ntu.edu.tw/~cjlin/libsvm/

 

사이트에 들어가서 libsvm을 다운받습니다.

 

 

페이지 검색(ctrl+F)로 download 검색하면 금방 찾으실 수 있습니다. / zip file을 다운받으시면 완료

 

 

 

2. 튜토리얼용 Dataset 다운받기



1번에서 언급된 같은페이지 맨 위에 data sets를 다운받을 수 있습니다.

LIBSVM data sets에 들어가시면 많은 데이터들이 있는데, 저는 첫번째 데이터를 사용하기로 했습니다.

 

name source type class training size testing size feature

a1a UCI classification 2 1,605 30,956 123


a1a와 a1a.t 두개의 파일을 다운받았습니다.

a1a는 모델을 생성하기 위한 데이터 파일이며

a1a.t는 테스트 파일입니다.

 

 

3. C++ 프로젝트 생성하여 libsvm 사용하기

 

 

 

C++ 프로젝트를 생성하여 (console 빈파일로 만들었습니다.)

다운받은 libsvm 파일을 C++ 프로젝트에 넣고 추가하세요.

 

svm과 관련된 모든 작업은 svm.hsvm.cpp 파일이 기본적으로 필요합니다.

 

 

 

위와 같이 파일을 추가하여 SVM (svm.h / svm.cpp) 을 사용합니다.

3가지 작업 (training, scale, predict) 에 따라서 파일을 추가 / 제외합니다.

위 3가지 파일에 대해서는 main함수가 포함되어 따로 컴파일 하셔야 ㅎ

 

3.1 Cross-validation으로 데이터 feature의 성능 측정하기

 

 

 

train.c 파일에 main함수가 있습니다. 여기서 cross-validation과 model을 만들 수 있는데,

일단 컴파일을 하셔서 빌드가 되는지 확인하시고 컴파일 에러가 나온다면

프로젝트 생성에 문제가 발생한것이므로 확인해주셔야 합니다.

 

cross-validation이 무엇인지 모르신다면 다음의 링크에서 정보를 확인하세요 - LINK

svm-train.c 파일에 main함수를 잘 살펴봅니다.

main함수 파라미터 (**argv / argc) 를 이용해 input을 받는것인데, 이것은 여기서 설명하지 않겠습니다.

 - 커맨드창에서 exe 파일을 실행할 때 파라미터로 받는 방법입니다.

 

svm-train.c 파일에서 main함수 안을 보시면 기본적으로 소스코드는 다음과 같이 되어있습니다.

 

        if(cross_validation)

{

do_cross_validation();

}

else

{

... // trainning~~~

}

 

cross_validation 값이 true여야, cross validation을 수행 하도록 되어있지만

이 값이 정의되어있지 않으니까 cross validation을 수행하지 않습니다.

 

nr_fold는 cross-validation에서 몇개로 나누어 정확도를 측정할지에 대한 변수인데 저는 5로 값을 주었습니다.

 

따라서 다음과 같이 소스를 수정해줍니다.

 

 

- svm-train.c의 main 함수

 

위와 같이 소스코드를 수정한 후 컴파일을 하여 exe 파일을 생성시킵니다.

그리고 exe파일에 위치한 폴더에 a1a와 a1a.t 파일을 옮깁니다.

 

해당 풀더에서 커맨드창을 켜신 후 livsvm.exe ./a1a 라고 실행합니다.

(프로젝트 이름이 다르다면 해당 프로젝트이름.exe ./a1a)

 



Cross validation의 성능 -

이 수치는 데이터의 feature vector 성능이 얼마나 '좋으냐' 에 대한 평가 척도가 됩니다.

 

 

 

3.2 Training으로 모델 만들기

cross-validation 작업에서 바꿨던 변수를 모두 삭제하여 (기본상태로 돌아오셔서)
컴파일 해주신 후 3.1과 같이 프로그램을 실행하면 됩니다.



 

a1a 데이터에 해당되는 model이 생성되었습니다.

이 모델은 다음에 들어올 테스트 데이터에 대한 결과를 예측합니다.

 


3.3 Model을 이용하여 test 데이터 판별하기

 



 

svm-train.c를 프로젝트에서 제외한 후 svm-predict.c 파일을 추가합니다.

 

 

그리고 컴파일을 한 후

 

테스트 파일을 input으로 넣으시면 끝 -

 

svm-predict.c로 컴파일하여 완성된 exe파일을 일단 실행해보면

prediction의 parameter에 대한 설명이 나옵니다.

 


 

 

Filename.exe [options] test_file model_file output_file

 

option에 아무것도 넣지 않으면 default 값으로 실행되기 때문에 아래와 같이 실행하였습니다.

cpp_libsvm.exe a1a.t a1a.model a1a.result

 

 

 

- a1a.t 파일 안에는 31956개의 인풋 데이터가 존재합니다.

생성되는 a1a.result 파일 안에도 31956개의 해답(svm이 예측한)이 존재 할것이고

a1a.t에 적혀있는 해답과 a1a.result (svm에서부터 구해진)의 결과는 약 83.5864% 만큼 동일할것입니다.

a1a.t 파일에 해답이 있기때문에 결과 성능까지 나온것입니다.