2007년 11월 13일
SVM light
SVM(Support Vector Machines)을 구현한 소스는 많이 있는 것 같은데 그 중에서도 요 SVM_light가 많이 쓰이는 듯 하다.
이렇게 training에 사용할 데이터 파일과 모델을 저장할 파일 이름을 argument 로 주면 된다.
이때 train.dat의 파일 구조 형식이 정해져 있는데....
맨 앞에 -1 이 부분은 classification을 할 때 해당 data가 속한 class를 나타낸다. 다른 class를 나타내려면 +1을 사용하면 됨.
그 다음에 나타내는 숫자들은 feature number : value 구조를 띈다. # 부분은 주석임.
위의 예제를 보면 data가 총 9284 dimensions을 나타내는 것이고, 특별히 기록하지 않은 feature들은 모두 0으로 설정된다.
2) Test 단계
Training 단계에서 만들어진 model.dat 파일을 2번째 인자에 넣고, train.dat에 포함되지 않은 새로운 data로 구성된 test.dat를
첫번째 인자로 지정한다. 프로그램이 실행되면 3번째 인자 output.dat 파일이 생성되며 classify 결과값이 저장된다.
test.dat 파일의 구조 역시 train.dat를 만들 때와 동일하다. 만약 test data가 속한 class를 모른다면 class 부분을 0 으로 설정하면
된다. 정답을 알고 있어서 class를 +1/-1로 지정을 하게 되면 model.dat 에 의해서 분류한 결과와 서로 비교하여 화면에 정확도를
계산하여 출력해 준다.
위의 링크는 윈도우용으로 컴파일된 바이너리 파일이고, 솔라리스나 리눅스용은 홈페이지에 가면 구할 수 있다.
압축파일을 받아 압축을 풀면 svm_learn.exe와 svm_classify.exe 파일 2개가 나온다.
svm_learn은 학습을 통하여 모델을 생성하고, 이렇게 생성된 모델을 이용하여 svm_classify.exe 파일로 테스트 과정을
거치게 된다.
1) Training 단계
svm_learn.exe train.dat model.dat
이렇게 training에 사용할 데이터 파일과 모델을 저장할 파일 이름을 argument 로 주면 된다.
이때 train.dat의 파일 구조 형식이 정해져 있는데....
-1 1:0.43 3:0.12 9284:0.2 # abcdef
1 1:1.5 3:0.2 9284:3.2
맨 앞에 -1 이 부분은 classification을 할 때 해당 data가 속한 class를 나타낸다. 다른 class를 나타내려면 +1을 사용하면 됨.
그 다음에 나타내는 숫자들은 feature number : value 구조를 띈다. # 부분은 주석임.
위의 예제를 보면 data가 총 9284 dimensions을 나타내는 것이고, 특별히 기록하지 않은 feature들은 모두 0으로 설정된다.
2) Test 단계
svm_classify test.dat model.dat output.dat
Training 단계에서 만들어진 model.dat 파일을 2번째 인자에 넣고, train.dat에 포함되지 않은 새로운 data로 구성된 test.dat를
첫번째 인자로 지정한다. 프로그램이 실행되면 3번째 인자 output.dat 파일이 생성되며 classify 결과값이 저장된다.
test.dat 파일의 구조 역시 train.dat를 만들 때와 동일하다. 만약 test data가 속한 class를 모른다면 class 부분을 0 으로 설정하면
된다. 정답을 알고 있어서 class를 +1/-1로 지정을 하게 되면 model.dat 에 의해서 분류한 결과와 서로 비교하여 화면에 정확도를
계산하여 출력해 준다.
# by | 2007/11/13 22:27 | CS - 기계학습 | 트랙백 | 덧글(11)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
다름이 아니라 저기 실험을 할 때 svm_classify를 사용하는데요.
그때 대상 파일이 example.txt라고 한다면 example.txt 파일 형식이 어떻게 되는지 알려주실 수 있으신가요..?
참고로 다른 포스팅이나 웹을 검색해봐도 파일 형식이
-1 1:0.43 3:0.12 9284:0.2
1 1:1.5 3:0.2 9284:3.2
(본문내용)
이런식으로 되어 있던데요..가장 앞에 있는 -1, 1을 현재 모르는 상태에서 분류를 해야되는데...저건 어떤 방식으로 분류를 하는건지 정말 궁금합니다..
그리고 SVM에서는 무조건 이진 분류만 되는건가요...
다짜고짜 한번에 여러 질문을 드려서 정말 죄송합니다 ..ㅠ_ㅠ
정말 좋은 내용의 포스팅들이 많이 있어서 많이 배우고 가게되네요....^^
p.s 정말 좋은 자료들이 많아서 RSS 구독 신청을 하고 싶은데 어떻게 하는지 잘 모르겠네요 ㅠ_ㅠ
▒ 1) example.txt 파일 구조는 어떻게
SVM을 이용하여 classification을 하려면 먼저 model을 만들어야 하는데요. 위의 예문에 나온 파일 구조는 모델 학습을 위한
데이터입니다.
그러니깐 train.dat
-1 1:2.0 2:3.0
+1 1:1.0 2:0.5
라고 저장이 되어 있고, 모델을 만들려면 다음과 같이 입력합니다.
svm_learn.exe train.dat model.dat
그러면 model.dat 라는 새로운 파일이 생성이 되는 거죠. 이제 실제 test data에 대한 classification을 하려면
다음과 같이 입력하세요.
svm_classify example.txt model.dat output.dat
그러면 최종적으로 example.txt 안에 들어 있는 data에 대한 분류 결과가 output.dat 에 저장되게 될것입니다.
질문하신 것처럼 example.txt 안에 저장되는 파일 구조도 train.dat 와 똑같고, 대신 해당 data가 어떤 class에 소속되어 있는지
모르기 때문에 -1, 1 대신에 숫자 0 을 입력하면 됩니다.
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒ 2) SVM은 binary classification만 가능한가?
태생적으로 SVM은 two-class classification을 위해 만들어 졌습니다. 하지만 수학적 변형을 통해 2 class 이상의 문제도 풀 수
있습니다. 이때 SVM light 버전은 안되고, multi class 문제를 위한 프로그램이 따로 있습니다.
아래 홈페이지에서 프로그램을 다운 받아 사용하시면 될 것입니다.
http://svmlight.joachims.org/svm_multiclass.html
사용방법은 svm light와 비슷하고 class 분류를 이제 -1, 1 대신에 1,2,3 ... 이렇게 할 수 있을 것입니다.
저도 지식이 얕아 도움이 되었는지 모르겠네요. 그리고 웹쪽은 제가 젬병이라 이글루스에서 RSS를 어떻게 설정하는지
모르겠어요.ㅜㅜ
한번 도움말 좀 뒤져봐야 겠습니다.^^
TRAIN, MODEL, TEST, OUTPUT 파일들의 포맷의 의미를 좀 ....
만약 TRAIN file
------------------------------
-1 1:1 2:2 3:3
-1 1:0.5 2:1 3:1.5
+1 1:-1 2:-2 3:-3
+1 1:-2 2:-4 3:-6
-------------------------------
을 가지고 "svm_learn TRAIN MODEL"을 하면 MODEL 파일
------------------------------------------------------
-0.056437389770723107862426815017898 1:0.5 2:1 3:1.5 #
0.056437389770723107862426815017898 1:-1 2:-2 3:-3 #
------------------------------------------------------
이 나오는데 이것들이 Support벡터이지요?
여기서 숫자 "-0.0564...." 와 "0.0564..."들이 무엇을 뜻하나요?
만약 테스트 파일
-------------------------------------------------------
0 1:1 2:1 3:1
0 1:2 2:2 3:2
------------------------------------------------------
가지고 만약 "svm_classify TEST MODEL OUPTUT" 을 실행하면 OUTPUT파일
------------------------------------------------------
-0.80423281
-1.3121693
------------------------------------------------------
을 얻는데 여기서 숫자 "-0.80423281and "-1.3121693"들이 뜻하는 바가 뭡니까?
sbk@hnu.kr 로 답장주세요.
네.. 해당 벡터는 support vector를 나타내고 "-0.0564...." 와 "0.0564..."은 decision function의 alpha_i * y_i 계수를 나타낸다고
합니다. decision function이 무엇인지는 아래 파일의 식 11.41을 참고하세요.
http://www.cs.cornell.edu/People/tj/publications/joachims_99a.pdf
OUTPUT 파일에서 저 숫자들은 classify한 결과들을 나타냅니다. 그러니깐 부호는 각 테스트 벡터가 소속되어 있는
class(positive class, negative class)를 나타내고, 숫자값은 decision function의 결과값입니다.
위 예에서 보면
0 1:1 2:1 3:1
0 1:2 2:2 3:2
두 벡터 모두 nagative class에 속하는 것으로 결과가 나왔습니다.
꽃받침의 길이, 꽃받침의 넓이, 꽃잎의 길이, 꽃잎의 넓이, 클레스
이 형식으로 데이터가 배열되있는 것인데요
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
6.9,3.1,4.9,1.5,Iris-versicolor
이 데이터를 학습시킬려고 하면, svm light가 읽을수 있게 형식을 바꿔줘야하잖아요
-1 1:5.1 2:3.5 3:1.4 4:0.2 # Iris-setosa
-1 1:4.9 2:3.0 3:1.4 4:0.2 # Iris-setosa
-1 1:4.7 2:3.2 3:1.3 4:0.2 # Iris-setosa
1 1:7.0 2:3.2 3:4.7 4:1.4 # Iris-versicolor
1 1:6.4 2:3.2 3:4.5 4:1.5 # Iris-versicolor
1 1:6.9 2:3.1 3:4.9 4:1.5 # Iris-versicolor
이런형식으로 바꾸는게 맞는 방법인가요??
앞에부분은 클래스를 의미하고 맨뒤는 주석으로 처리하는건 이해가 되는데..
중간에 숫자들중에서 1:*.*에서 1: <<이게 뭘 의미하는지 모르겠습니다.
혹시 꽃받침의 길이를 1: 으로 표시해 준건가요???
1: 부분은 feature vector의 1차원을 의미합니다. 현재 총 4차원의 feature vector를 사용하여 두 꽃의 종류를 분류하려는
문제로 보이는군요.
쉽게 생각해서 1차원은 꽃받침의 길이로 대응시켰다고 봐도 무방합니다.
질문하실 내용이 많은건가요? 간단한 거면 여기에 글 남기시면 될 것같네요.
그렇지 않다면 한번 더 댓글 남겨 주시면 제가 메일 드리겠습니다.
아시겠지만 저 숫자값은 학습을 통해 구해진 hyperplane에서 해당 data가 얼마나 떨어져 있느냐를 거리로 나타낸 거라 할 수 있습니다. 확률 값은 아니기 때문에 해당 data가 80% 확률로 해당 class에 포함된다고 말하기에는 무리가 있습니다.
하지만 응용 분야에서 hyperplane에서 멀리 떨어지는 정도가 무슨 의미를 띈다면 그 땐 저 숫자에 의미가 부여될 것입니다.
그러한 의미 부여도 논문에서 밝혀야할 주장이 아닐런지 싶네요.
아라인 이시군요^^ 연구 잘하셔서 좋은 논문 쓰시기 바랍니다.