본문 바로가기
Machine Learning

31. SVM (Support Vector Machine) 사용하기

by 대소니 2016. 8. 15.


SVM을 사용할때 선택해야 하는 내용이 두가지 있습니다.

하나는 prarmeter C를 선택해야 하고 또 하나는 kernel을 선택해야 합니다. 커널이 없는 경우는 linear kernel이라고 하며 이것은 f 함수(similarity function)을 사용하지 않고 x features 를 사용하는 것입니다. 주로 n 이 크고 m이 작은 즉 features는 많은데 dataset 사이즈가 적은 경우에 사용이 됩니다.

그리고 우리가 배운 Gaussian kernel을 사용하는 경우에는 앞에서 배운것처럼 아래 그림의 하단 공식과 같이 표현이 가능하며 이때에는 sigma^2 값을 선택해야 합니다. 이것은 n 이 작고 m 이 큰  non-linear 에서 유용하게 사용이 됩니다. 



SVM에서 Kernel function은 f = k(x1, x2)로 표현이 되며 x2가 landmark 역할을 합니다. 이것을 수학적인 공식으로 표현하면 아래 그림의 공식과 같이 되며 분자에 식을 다시 하단의 공식과 같이 풀어 쓸 수 있습니다.

||x - l||^2 = (x1-l1)^2 + (x2-l2)^2 + ... + (xn-ln)^2

이것을 이용해서 Gaussian Kernel을 이용하기 전에 각 features들을 scaling을 해주어야 합니다. 각각의 features들의 수치가 단위에 따라서 다른 크기를 가지기 때문입니다.



보편적으로 SVM에서 liner kernel 이나 Gaussian kernel을 사용합니다. 이를 구현할때 Mercer's Theorem 의 조건을 만족하기만 하면 SVM 패키지들은 global minimum을 찾는 것을 보장해주도록 여러가지 수학적인 tricks을 사용하도록 되어있습니다. 이외에도 다양한 다른 kernel들이 존재하는데 몇가지 간단하게 알아보겠습니다.

polynomial kernel 은 기본 공식에서 상수값이 더해지고 고차항의 승수가 적용이 됩니다. 아래 그림의 중간부분의 공식과 같습니다. 이 이들 두가지를 선택해야 하며 공식으로 표현하면 다음과 같습니다.

(xT l+Constant) ^ degree

String kernel은 입력값이 text string인 경우에 사용이 되며 문자열들을 분류할때 사용이 됩니다.

그외 다른 kernel들도 있지만 Gaussian Kernel이 가장 좋은 성능을 나타내기에 그다지 유용하게 사용할 일이 없다고 합니다.



당연하겠지만 SVM도 multi-class classifacation이 가능합니다. 비슷한 방식으로 one vs all method를 사용하고 있습니다. y의 값이 1에서 부터 k 까지 존재한다면 세타도 1에서 부터 k 까지 생성이 되며 각각의 세타는 y의 값과 매칭이 됩니다.



features의 수인 n과 dataset 사이즈인 m에 따라서 알고리즘을 적절하게 선택하여 적용하는 것이 좋습니다. 

만약에 n 이 m에 비해서 큰 dataset의 경우에는 logistic regression 이나 SVM linear kernel을 사용하는 것이 좋습니다. (n = 10,000, m = 10~1000)

또 n 이 작고 m 이 중간정도 크기의 dataset의 경우에는 SVM Gaussian kernel을 사용하는 것이 좋습니다. (n = 1~1000,  m = 10~10,000)

마지막으로 n 이 작고 m 이 큰 dataset의 경우에는 더 많은 features을 추가하고 logistic regression 이나 SVM linear kernel을 사용하는 것이 좋습니다. 

이렇게 기본적으로 logsitic regression 과 SVM linear kernel을 비슷한 방식으로 동작으로 하며 성능도 비슷합니다. NN도 가능하지만 SVM이 더 좋은 성능을 나타냅니다. 그리고 이전에도 살펴보았듯이 알고리즘의 선택이 더 좋은 결과를 결정하는 것은 아닙니다. 더 많은 데이터와 적절한 features를 사용하고 얼마나 error analysis를 잘하는가, 그리고 debugging을 잘 활용하는 것이 더 중요함을 기억해야 하겠습니다.


댓글