Computer Science/학부 및 대학원 과목

[인공지능] LIBSVM 사용법 / visual studio 2013 / c++

꾸준희 2016. 7. 18. 16:43
728x90
반응형



svm 개념 참고 ( http://eehoeskrap.tistory.com/45 )




Training Data & Lable

인공지능에서 기계학습의 개념을 말해보자면 기계에게 학습을 시킬 데이터를 즉, Training Data라고 지칭한다.

'사람' 이라는 데이터가 있다고 했을 때, 키, 몸무게, 입고있는 옷, 머리카락 길이 등의 정보는 '사람'이라는 데이터의 Feature 가 된다.

이러한 각각의 Feature들을 지닌 100명의 사람이 있다고 가정하자

100명의 사람들을 분류하고 싶을 때 분류할 수 있는 기준은 여러가지가 존재하게 된다.

이 기준을 정하고 분류 했을 때 가지는 값이 바로 Label 이 된다.

기준을 성별로 한다고 치자, 그러면 A는 여자다. A의 Label 값은 '여자'가 될 것이다.



Class Classification

여기서 성별은 남자, 여자 두가지 밖에 존재하지 않게 된다. 이 때 2개의 클래스를 가지는 것을

2 - Class Classification 라고 한다.



SVM (Support Vector Machine)

이제 컴퓨터에게 학습 데이터가 주어졌다고 하자. 이 데이터를 이용하여 컴퓨터는 학습을 하여 정보를 얻어 낼 수 있는 똑똑한 기계가 되는데,

이러한 학습을 하는데 있어서 다양한 알고리즘이 존재하게 된다.

그 중 하나가 앞서 실행해 볼 SVM ( Support Vector Machine ) 이다. 



Feature Selection

기준을 분류하는데 있어서 다양한 feature들이 존재하게 되는데, 이 특징들 중에 분류를 하는데 있어서 가장 중요한 기준이 되는 것이 있을 수 있다. 

그렇다면 반대로 분류를 하는데 있어서 가장 쓸모없거나, 무의미한 특징들도 존재하게 된다.

이러한 별 의미없는 특징들을 걸러내는 과정을 Feature Selection 이라고 한다.

이러한 Feature Selection은 머신러닝의 성능을 좌지우지하는 가장 중요한 요소라고 할 수 있다.



Model

그리하여 데이터들을 SVM 이라는 머신으로 학습시킨 결과를 Model 이라고 한다. 

Model의 형태는 학습 알고리즘에 따라 다르며, 컴퓨터는 100명의 사람 데이터를 학습했고, 

어떤 특징을 가진 사람이 여자인지 남자인지 '기준'을 세우게 되었다. 이러한 기준이 Model이라고 보면 된다.


이 때 C라는 사람의 데이터가 주어지는데, 이 사람이 여자인지 남자인지는 모르겠지만 feature값들을 알고 있다. 

학습을 하지 않았다면 컴퓨터는 Label을 추측할 수 없었겠지만, 이 컴퓨터는 학습결과인 Model을 가지고 있다.



Predict

마지막으로 이러한 Model로 인하여 C라는 사람의 성별을 알아맞히는 단계를 Predict 과정이라고 한다.






(1) LIBSVM 다운받기



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


사이트에 들어가서 Download LIBSVM 에서 zip file 또는 tar.gz file을 다운 받습니다.

저는 zip file을 다운받았습니다.









(2) Dataset 다운받기


사이트 맨 상단에서 LIBSVM data sets 을 누르고 테스트하고싶은 dataset을 다운해줍니다.

저는 1번 dataset을 다운받았습니다.





아래와 같이 맨 첫번째에 있는 dataset인 a1a을 누르면 다음과 같이 a1a 파일과 a1a.t 파일 두가지를 다운 받을 수 있습니다.




a1a 파일과 a1a.t 파일 두가지를 다운받아줍니다.






a1a을 누르면 아래 그림과 같은 화면이 나오는데 마우스 오른쪽 버튼을 클릭해서 다른이름으로 저장하시면 됩니다 (동일이름으로 / a1a.txt)




이 때 위와 같은 파일의 형식을 잠깐 설명하자면



-1 1:0.43 3:0.12 9284:0.2 # abcdef
1 1:1.5 3:0.2 9284:3.2



맨 앞에 -1 이나 +1 부분은 classification을 할 떄 해당 data가 속한 class를 나타내고, 이와 다른 class를 나타내려면 +1을 사용하면 된다.

그 다음에 나타나는 숫자들은 feature number : value 구조를 띈다.

그리고 주석은 # abcdef 이런 형식으로 나타낼 수 있다.


예시에서 살펴본 것 처럼 data가 총 9284 dimensions을 나타내는 것이고, 특별히 기록하지 않은 feature들은 모두 0으로 설정된다.







(3) SVM 프로젝트 생성 (C++)



C++ 프로젝트를 생성하여 ( Win32 Console Application / 빈프로젝트 체크) 다운받은 LIBSVM 파일을 C++ 프로젝트에 넣어줍니다. 

다운받은 LIBSVM 파일을 압축을 풀게되면 다음과 같은 파일들이 들어있습니다.

여기서 제일 하단부터 차례대로 6개의 파일 (svm.cpp, cvm.def, svm.h, svm-predict.c, svm-scale.c, svb-train.c)을 생성한 프로젝트에 넣어줍니다.



여기서 svm-predict.c / svm-scale.c / svb-train.c 이 세가지 파일은 각각 main 함수가 포함되어 있기 때문에 따로 컴파일을 해야합니다.

저는 아래와 같이 프로젝트에서 파일명에 오른쪽 마우스 클릭을하고 속성에 들어간 뒤, 빌드에서 제외해주었습니다.






(4) 컴파일 해보기 - svm-train.c



먼저 Cross-validation으로 데어터 특징의 성능을 측정하기 위해서 아까 main 함수가 포함되어있다고 했었던 세가지 파일 들 중에서

svm-train.c 파일만 빌드에서 제외 했던 것을 풀어줍니다.


빌드를 하여 컴파일 하게되면 폴더에 실행파일이 생성됩니다. 


visual studio 2013의 경우 4996 에러가 날 수 있습니다.

(ex Error 1 error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead ....)


이러한 경우 에러나는 해당 파일 안에 


#pragma warning(disable: 4996)


warning 코드를 적어주면 에러가 나지 않게 됩니다.




그리고 svm-train.c 소스코드를 살펴보면 if문안에서 쓰이는 cross_validation 값이 정의되어 있지 않습니다.

이 값을 정의해주어야 합니다. 



아래와 같이 코드를 추가로 작성해줍니다.


nr_fold = 5;

cross_validation =1;






코드를 작성해 주고나서, 컴파일을 해주면 실행파일이 생성됩니다.

이 실행파일이 있는 곳에 아까 다운받았던 dataset이였던 파일 두가지를 폴더에 넣어줍니다.




그 다음 커맨드창을 켜서 해당 실행파일과 데이터가 있는 폴더로 접근 하신 후, 

프로젝트이름.exe ./a1a.txt 라고 입력해줍니다.


저는 프로젝트 이름이 svmProject 였기 때문에

svmProject.exe ./a1a.txt  라고 실행하였습니다.




그 결과 Cross Validation Accuravy 값이 82.1184% 가 나왔습니다.

이 값은 데이터의 feature vector 성능에 대한 평가 척도가 됩니다.










(5) 컴파일 해보기 - svm-train.c 으로 모델 만들기



위 작업에서 추가하였던 코드 두줄을 다시 삭제하고 컴파일 해줍니다.

그 다음 아까처럼 똑같이 커맨드창에 프로젝트 실행파일이 들어있는 경로로 이동 후


프로젝트이름.exe ./a1a.txt 라고 치게 되면 다음과 같이 optimization 이 완료되고 폴더에 data model이 생성됩니다.

이 데이터모델은 다음에 들어오게 될 데이터에 대하여 결과를 예측 할 수 있는 모델이 됩니다.











(6) Data model을 이용하여 Test data 판별하기



이번엔 아까 생성되었던 데이터 모델을 이용하여 test data를 예측해보겠습니다.

아래와 같이 svm-train.c 파일을 다시 빌드에서 제외해 주시고, svm-predict.c 파일을 빌드 할 수 있도록 풀어줍니다.



그 다음 다시 컴파일을 하게 되면 다음과 같은 메세지가 뜨게 됩니다.





그 다음 다시 실행파일이 있는 폴더에서 커맨드 창을 켜준 뒤에 


프로젝트이름.exe a1a.t a1a.txt.model a1a.result 


라고 실행해 줍니다. 


(위 단계에서 원래는 svmProject.exe ./a1a 라고 쳤어야 했는데 svmProject.exe ./a1a.txt 라고 쳤기 때문에

data model 명이 a1a.txt.model로 되었습니다. 폴더에서 데이터 모델명 확인 후 명령 실행하시기를 바랍니다. )



실행하면 아래와 같은 화면이 뜨게 됩니다.

첫번째 Dataset 이였던 a1a 내부 안에는 아래와 같이 두가지 분류로 나눠지게 되고, 30,956개의 데이터가 존재하게 됩니다.

또한 features는 123개가 존재하게 됩니다.


  • # of classes: 2
  • # of data: 1,605 / 30,956 (testing)
  • # of features: 123 / 123 (testing)





위와 같은 결과를 얻을 수 있는데, LIBSVM이 예측한 결과인 a1a.result 파일에도 위와 같은 개수의 데이터가 존재 할 것입니다.

또한, SVM으로부터 구해진 결과는 커맨드 창과 같이 약 83% 정도로 동일한 데이터가 존재할 것입니다.









참고자료 




http://sosal.kr/624


http://jangjy.tistory.com/97


http://egloos.zum.com/lsujang/v/1588691


http://m.blog.naver.com/nerrtica/220446453101









728x90
반응형
1 2 3 4 5 6 7 ··· 22