파이썬 (Python)/머신러닝 (Machine Learning)

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

daisy9 2022. 11. 3. 16:33

SVM은 regression과 classification 모두로 활용될 수 있다.

여기서는 classification을 한다고 생각하고 소개하도록 하겠다.

 

Linear SVM

어떤 두 개의 그룹을 직선으로 나눌 수 있다고 가정하자.

이 때, 그을 수 있는 직선은 여러 가지가 될 수 있는데 SVM은 밴드가 가장 큰 것이 합리적이라고 본다.

밴드는 각 그룹에서 직선에 가장 가까운 관측치를 기준으로 그은 직선 사이의 거리이다.

수식으로 봤을 경우, 표준화가 필요함을 참고하자.

 

그러나 현실에서는 이처럼 분류가 잘 되지 않는 경우가 대부분이다.

즉, SVM으로 선형 분류선을 그었는데 error (오차)가 생길 수 있다.

따라서 이러한 오차를 조절해주는 완화변수(slack variable)가 필요하다. 

오차가 없으면 완화변수는 0이다.

 

이런 완화변수 앞에 Cost (C) 를 곱해주는데, 우리는 손실함수가 최소화되는 것을 원하기 때문에 cost가 크면 오차를 많이 허용해줄 수 없어진다. 

즉 C 는 오차의 허용 정도를 나타내는 초모수이다.

- C가 크면: 오차의 허용 강도가 낮다 = 밴드의 넓이가 좁아진다 = 과대적합 발생 = support vector의 개수가 적어짐

- C가 작으면: 오차의 허용 강도가 높다 = 밴드의 넓이가 넓어진다 = Bias 발생


베타0와 베타의 추정

- 손실함수 사용: 조건이 있을 때의 최적화 방법을 이용한다 (라그랑지승수법)

- Karush-Kuhn-Tucker 조건이 필요

- 베타 추정에 에러가 있는 관측치만 베타 추정에 contribution 한다. 이 관측치를 support vector 라고 한다. 

- 즉, 다른 regression에서는 모든 데이터를 다 쓰지만 SVM은 contribution하는 관측치인 support vector만 사용한다.


파이썬 코드는 다음과 같다.

from sklearn.svm import SVC # SVC 는 classification 
svm=SVC(kernel='linear',C=1.0,random_state=1) #초모수 값은 바꿀 수 있다
svm.fit(X_train,y_train) #SVM추정

support vector를 다음과 같이 확인할 수도 있다. 

print(svm.support_) # support vector
print(svm.n_support_) # 각 클래스 별로 support의 개수

 

Kernel SVM

비선형 분류모형이 필요한 경우, kernel SVM을 활용할 수 있다.

 

선형으로 분류할 수 없는 자료가 있는 경우, 새로운 변수를 도입하여 차원을 증가시킨다. 이를 basis expansion이라고 한다. 차원을 증가시키면 분류가 잘 되는 평면이 생길 수 있으며 이런 방법을 사용하는 것을 kernel SVM이라고 한다. 

 

수식적으로는 특성함수를 정의하지 않고 커널 함수를 이용하면 된다.

커널 함수로는 대표적으로 3가지가 있다.

- polynomial

- radial basis function (rbf, 방사형기저함수): 정규분포 형태이다

- sigmoid

 

kernel SVM의 초모수는 C 외에 gamma도 있다. 

- gamma 가 클수록 = non-linearity (비선형성)가 높아진다 = 과대적합 가능성 높아짐

특히, rbf에서는 gamma는 분산의 역수이므로 gamma가 클수록 분산이 작아져서 normal에 가까워지며 gamma가 0이면 분산이 커지니까 linear에 가까워진다.

 

C는 똑같이 오차를 조절한다.

 

파이썬 코드는 다음과 같다. kernel 만 바꿔주면 된다.

ksvm=SVC(kernel='rbf',C=1.0,gamma=0.2,random_state=42)