서포트 벡터 머신


서포트 벡터 머신(이하 SVM)은 머신러닝의 지도학습에서 분류를 위해 사용하는 알고리즘 모델로, 결정 경계(Decision Boundary)를 찾기 위해 사용된다. 

 

 

결정 경계란 위 그림에서 원과 별을 분류하기 위한 빨간 실선이며, 양 옆의 검은 실선은 Margin이라 한다.  SVM의 주 목적은 두 Margin의 거리를 최대화 시킬 수 있는 즉, GAP을 최대화 시킬 수 있는 지점을 찾는 것이다. 

 

만약 feature가 두 개만 존재할 경우 다음과 같이 Dicision Boundary는 아래와 같이 간단한 실선 형태가 될 것이다.

 

하지만 feature가 3개로 늘어난다면 다음과 같이 3차원으로 나타내야 한다(아래는 실제로 feature가 3개가 아님)

이 때 결정 경계는 선이 아니라 위와 같이 평면으로 변하게 된다. 하지만 만약 feature가 3개가 아니라 4개, 5개 늘어나서 무한개의 feature를 분류해야하는 상황에 마주하면 어떻게 될까? 인간은 3차원까지 인식할 수 있기 때문에 시각화하여 나타낼 수 없다. 따라서 이러한 부분은 방사 기저 함수(RBF: Radical Bias Function)로 해결할 수 있는데 추후 아래에서 설명할 것이다.

 

SVM 모델 장점

Suppor Vector는 결정 경계와 가장 가까이 있는 클래스의 데이터 포인트를 의미한다. SVM에서는 결정 경계를 찾는 것이 결국 Support Vector이기 때문에 데이터 포인트 중에서 Support Vector만 잘골라낸다면 나머지 쓸 데 없는 수 많은 데이터 포인트들을 무시할 수 있다. 따라서 매우 빠르다.

 

 

이상치(Outlier) 허용


분류하고자 하는 데이터 포인트의 분포가 늘 고르게 있는 것이 아니기 때문에 아래와 같은 경우가 있을 수 있다. 이러한 Outlier를 허용 여부에 따라 Hard margin과 Soft Margin으로 나뉠 수 있다.

Hard Margin의 경우 이상치 데이터를 허용하지 않는 것을 의미하며 이렇게 될 경우 Support Vector와 Dicision Boundary간의 거리가 좁아 진다. 이렇게 될 경우 개별적인 데이터를 학습하여 분류의 정확도를 올리려다가 오히려 아래의 예시와 같이 오버피팅 문제가 발생할 수 있다.

 

모든 데이터를 학습하여 분류의 정확도는 올라갔으나 이후에 있을 데이터에 대해서는 조금만 벗어나도 예측에 어려움이 있다.

 

Soft Margin의 경우 이상치 데이터를 어느정도 허용하는 것을 의미하며 이렇게 될 경우 어느정도 오버피팅 문제를 완화시켜줄 수 있다. 하지만 여기에도 데이터 학습을 제대로 하지 못하는 언더피팅 문제가 발생할 수 있기 때문에 적절한 margin 파라미터를 찾는 것이 중요하며, sikit-learn에서는 C 라는 파라미터를 사용하여 margin을 결정한다.

 

classifier = SVC(C = 0.01)

 

위의 C 값이 클수록 Hard Margin에 가깝고, 작을수록 Soft Margin에 가깝다. 기본 값은 1이다. C의 값은 데이터에 따라 다르기 때문에 최적의 C 값을 찾는 과정이 필요하다.

 

커널 (Kernel)


위의 예시들에서는 모두 선형으로 Dicison Boundary를 그을 수 있는 형태였으나 만약 아래와 같은 선형으로 분리할 수 없는 경우에는 어떨까?

이러한 경우 다항식(Polynomial) 커널을 사용하여 해결할 수 있으며, 이는 2차원의 점을 3차원으로 계산함으로써 가능하다.  계산은 다음과 같은 식에 따라 3차원으로 표시한다.

 

$(x,y) → (\sqrt 2xy, x^2, y^2)$

 

예컨데 [1,2] 점이 있다고 할 경우 다음과 같이 3차원으로 계산한다.

 

$(1, 2) → (2\sqrt 2, 1, 4)$

 

이후 다항식 커널로 계산한 데이터 포인트들을 3차원으로 시각화하면 다음과 같은 모양이 나타난다.

방사 기저 함수


방사 기저 함수(RBF: Radical Bias Function)이란 RBF 커널 또는 가우시안 커널이라 부르기도 하며, 이 함수가 앞서 언급한 3차원을 넘는(feature가 3개가 넘는) 데이터에 대해 분류를 하기 위해 사용된다. 

 

방사 기저 함수를 사용하기 위해서는 scikit-learn에서 다음과 같이 사용할 수 있으며 이는 kernel로 사용할 linear, poly, sigmod 등을 입력하지 않을 경우 디폴트 값으로 rbf가 지정된다.

 

from sklearn.svm import SVC
classifier = SVC(kernel='rbf')

 

이러한 방사 기저 함수에는 gamma라고 하는 파라미터가 있어 Dicison Boundary를 얼마나 유연하게 그을 것인지에 대해 설정하는 것으로 파라미터 C와 유사하게 볼 수 있다.

 

classifier = SVC(kernel = "rbf", C = 2, gamma = 0.5)

 

Reference


[1] http://hleecaster.com/ml-svm-concept/

[2] https://ratsgo.github.io/machine%20learning/2017/05/23/SVM/

[3] http://jaejunyoo.blogspot.com/2018/01/support-vector-machine-1.html

 

 

+ Recent posts