서포트 벡터 머신 (Support Vector Machine)

2022. 7. 11. 19:34APP/개발

서포트 벡터 머신(SVM: Support Vector Machine)은 분류 과제에 사용할 수 있는 강력한 머신러닝 지도학습 모델이다

  • 서포트 벡터 머신이란
  • 최적의 결정 경계(Decision Boundary)
  • 마진(Margin)
  • 이상치(Outlier)을 얼마나 허용할 것인가
  • 커널(Kernel)
    1. 다항실(Polynomial)
    2. 방사 기저함수(RBF:Radial Bias Function)
  • 요약

서포트 벡터 머신이란

- 결정경계(Decision Boundary), 즉 분류를 위한 기준 선을 정의하는 모델

- 만약 데이터에 2개 속성(feature)만 있다면 결정 경계는 이렇게 간단한 선 형태가 됨

- 그러나 속성이 3개로 늘어나면 기준선은 평면으로 3차원으로 그려야함

- 차원(속성의 개수) 늘어날 수록 복잡해지며 기준선은 단순 평면이 아닌 고차원이 됨

    ->이를 "초평면(hyperplane)"이라고 부름

 

 

최적의 결정 경계(Decision Boundary)

- 어떤 경계가 좋은 경계?

  -> 결정 경계는 데이터 군으로부터 최대한 멀리 떨어지는 게 좋음

- 실제 서포트 벡터 머신(Support Vector Machine)이라는 말에서 support vectors 는 결정 경계와 가까이 있는 데이터 포인트들을 의미함  -> 이 데이터들이 경계를 정의하는 결정적인 역할을 하는 셈임

-> 위 그래프에서 가장 좋은 경계선은 데이터 군과 가장 거리가 먼 F

 

마진(Margin)

- (Margin)마진은 결정 경계와 서포트 벡터 사이의 거리를 의미

- 최적의 결정 경계는 마진을 최대화한다

- n개의 속성을 가진 데이터에는 최소 n+1개의 서포트 벡터가 존재

 -> 위 그래프에서 가운데 실선이 '결정 경계'

 -> 빨간점 1개, 파란점 2개 사이 영역을 두고 점선을 그음 -> 점선과 결정경계 사이 거리가 마진

- 장점 : 결국 결정 경계 정하는게 서포트 벡터임 -> 많은 데이터 포인트 들 중에서 서포트 벡터만 잘 고르면 나머지 쓸데없는 수많은 데이터 포인트들 무시할 수 있음 -> 그래서 매우 빠름

 

※ scikit-learn 사용법

- svm에서 결정 경계를 구하는 건 상당히 복잡한 최적화 문제임

from sklearn.svm import SVC

classifier = SVC(kernel = 'linear')

training_points = [[1, 2], [1, 5], [2, 2], [7, 5], [9, 4], [8, 2]]
labels = [1, 1, 1, 0, 0, 0]

classifier.fit(training_points, labels) 
print(classifier.predict([[3, 2]]))

위 그림에서 직접 눈으로 [3, 2] 좌표를 찍어봐도 알 수 있듯 빨간 점, 1로 분류될 거다.

그리고 위에서 설명한 서포트 벡터, 결정 경계를 정의하는 서포트 벡터를 확인하려면 classifier.support_vectors_를 print 해보면 된다.

이렇게 나올 거다.

[[7, 5],
[8, 2],
[2, 2]]

파란 점 2개와 빨간 점 1개를 사용했다.

 

이상치(Outlier)얼마나 허용할 것인가

- SVM은 데이터 포인트들을 올바르게 분리하면서 마진의 크기를 최대화해야함 -> 결국 이상치(Outlier)를 잘 다루는 게 중요

- 위 그래프 보면 혼자 튀어나온 빨간색, 파란색 점들 (아웃라이어) 있음

- 위 첫번째 그래프 경우

 -> 하드 마진(hard margin) : 아웃라이어 허용하지 않고 기준을 까다롭게 세움, 

 -> 마진 매우 작음 -> 개별적인 학습 데이터들을 다 놓치지 않으려고 아웃라이어 허용하지 않는 기준으로 결정 경계정함 -> 오버피팅(overfitting)문제가 발생할 수 있음

- 반대로 아래 두번째 그래프 경우

 -> 소프트 마진(Soft margin) : 아웃라이어들이 마진 안에 어느정도 포함되도록 너그럽게 기준을 잡음

 -> 서포트 벡터와 결정 경계 상이의 거리가 멀어짐 ,마진이 커짐 -> 너무 대충 학습하는 꼴 : 언더피팅(underfitting)문제 발생

 

 

파라미터 C

 

- scikit-learn에서는 SVM모델이 오류를 어느정도 허용할 것인지 파라미터 C를 통해 지정할 수 있음(기본값은 1)

classifier = SVC(C = 0.01)

- C값이 클수록 하드마진(오류 허용 안 함), 작을수록 소프트마진(오류를 허용함)

 

커널(Kernel)

만약 SVM이 선형으로 분리 할 수 없는 데이터 세트가 있다면 어떻게 해야 할까?

-> 빨간색, 파란색 구분하는 직선 그릴수없음

-> 그러나 다행히 scikit-learn에서는 SVM모델을 만들때 kernel을 지정하여 해결할 수 있음

보통 이렇게 선형('linear')으로 지정하지만 'poly' 같은 걸 넣어줄 수도 있음

-> 다만, 다른 커널 사용할때 주의 필요 -> 단순히 outlier들때문에 선형으로 분리할 수 없다고 판단해서는 안됨

-> 일부 아웃라이어에 맞추기 위해 비선형으로 결정경계를 만들 필요가 없음 -> 모든 점을 올바르게 분리하는 선을 그린다는 건 결국 모델이 데이터에 과도하게 적합해진다는 오버피팅 된다는 것

 

from sklearn.svm import SVC

classifier = SVC(kernel = 'linear')

 

**커널 종류

1. 다항식(Polynomial)

- 아무리 봐도 선형으로 해결 안됨 -> 이때 다항식(Polynomial) 커널 사용하면 2차원에서 x, y좌표로 이루어진 점들을 아래와 같은식에 따라 3차원으로 표현하게됨

-> 다항식 커널로 계산한 데이터 포인트들을 3차원으로 그려보면 아래 모양 나타남

->  다항식(polynomial) 커널을 사용하면 데이터를 더 높은 차원으로 변형하여 나타냄으로써 초평면(hyperplane)의 결정 경계얻을 수 있음

2. 방사 기저 함수(RBF:Radial Bias Function)

- RBF 커널 혹은 가우시안 커널이라고 부르기도함

- kernel 기본값이 'rbf'(위에서 언급했던 'linear', 'poly', 그리고 'sigmoid'와 같은 걸로 지정해줄 수도 있다.)

- poly'(다항식) 커널은 2차원의 점을 3차원으로 변환한 반면, RBF 커널은 2차원의 점을 무한한 차원의 점으로 변환

from sklearn.svm import SVC

classifier = SVC(kernel='rbf')

 

 

파라미터 gamma

- gamma는 (위에서 소개한 C와 마찬가지로) 파라미터

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

- gamma 결정 경계를 얼마나 유연하게 그을 것인지 정해줌

- 학습 데이터에 얼마나 민감하게 반응할 것인지 모델을 조정하는 거니까 C와 비슷한 개념

  • gamma값을 높이면 -> 학습 데이터에 많이 의존해서 결정 경계를 구불구불 긋게 됨 => 오버피팅을 초래
  • 반대로 gamma를 낮추면 ->  학습 데이터에 별로 의존하지 않고 결정 경계를 직선에 가깝게 긋게 됨 => 이러면 언더피팅이 발생 할 수 있음

- 적정한 gamma

적정함

-  만약 gamma를 너무 높이면 오버피팅 아래처럼 발생

- gamma를 너무 낮게 잡으면 아래처럼 언더피팅 발생

 


요약

  • SVM은 분류에 사용되는 지도학습 머신러닝 모델
  • SVM은 서포트벡터(support Vectors)를 사용하여 결정 경계(Decision boundary)를 정의, 분류되지 않은 점을 해당 결정경계와 비교해서 분류
  • 서포트 벡터(support vectors)는 결정 경계에 가장 가까운 각 클래스의 점
  • 서포트 벡터와 결정 경계 사이의 거리를 마진(margin)
  • SVM은 허용 가능한 오류 범위 내에서 가능한 최대 마진을 만들듬
  • 파라미터 C는 허용되는 오류 양을 조절한다. C 값이 클수록 오류를 덜 허용하며 이를 하드 마진(hard margin)이라 부른다. 반대로 C 값이 작을수록 오류를 더 많이 허용해서 소프트 마진(soft margin)을 만듦
  • SVM에서는 선형으로 분리할 수 없는 점들을 분류하기 위해 커널(kernel)을 사용한다.
  • 커널(kernel)은 원래 가지고 있는 데이터를 더 높은 차원의 데이터로 변환한다. 2차원의 점으로 나타낼 수 있는 데이터를 다항식(polynomial) 커널은 3차원으로, RBF 커널은 점을 무한한 차원으로 변환한다.
  • RBF 커널에는 파라미터 감마(gamma)가 있다. 감마가 너무 크면 학습 데이터에 너무 의존해서 오버피팅이 발생할 수 있다.