소소하지만 소소하지 않은 개발 공부/머신 러닝 교과서

Chapter 3.4 서포트 벡터 머신을 사용한 최대 마진 분류, 머신러닝교과서, python

still..epochs 2022. 11. 25. 18:47

* 본 포스팅은 머신러닝 교과서를 참고하여 작성되었습니다.

 

3.4 서포트 벡터 머신을 사용한 최대 마진 분류

서포트 벡터 머신(Support Vector Machine, SVM) : SVM은 퍼셉트론의 확장으로 생각 할 수 있다. SVM의 최적화 대상은 마진을 최대화 하는 것이다.

 

3.4.1 최대 마진

큰 마진(large margin)의 결정 경계를 원하는 이유는 일반화 오차가 낮아지는 경향이 있기 때문이다. 반면 작은 마진의 모델은 과대적합되기 쉽다.

 

3.4.2 슬랙 변수를 사용하여 비선형 분류 문제 다루기

슬랙변수 : 오류를 허용하는 '직선', 소프트 마진 분류(soft margin classification)

 

슬랙 변수는 선형적으로 구분되지 않는 데이터에서 선형 제약 조건을 완화할 필요가 있기 때문에 도입되었다.

 - 변수 C를 통해 분류 오차에 대한 비용을 조정할 수 있다. C값이 크면 오차에 대한 비용이 커지고, 작으면 분류 오차에 덜 엄격해진다. 매개변수 C를 사용하여 마진 폭을 제어할 수 있다.

C 값에 따라 달라지는 SVM의 결정 경계와 마진

 

붓꽃 데이터셋의 꽃 분류 문제에 SVM 모델을 훈련해 보자.

from sklearn.svm import SVC

svm = SVC(kernel='linear', C=1.0, random_state=1)
svm.fit(X_train_std, y_train)

plot_decision_regions(X_combined_std, 
                      y_combined,
                      classifier=svm, 
                      test_idx=range(105, 150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
# plt.savefig('images/03_11.png', dpi=300)
plt.show()

SVM 분류기가 학습한 붓꽃 데이터셋의 결정 경계

 

Note_ 로지스틱 회귀 vs 서포트 벡터 머신

- 실제 분류 작업에서 선형 로지스틱 회귀와 선형SVM은 종종 매우 비슷한 결과를 만든다. 로지스틱 회귀는 훈련 데이터의 조건부 가능도를 최대화하기 때문에 SVM보다 이상치에 민감하다. SVM은 결정 경계에 가장 가까운 포인트(서포트 벡터)에 대부분 관심을 둔다. 반면 로지스틱 회귀는 모델이 간단하고 구현하기 더 쉬운 장점이 있다. 또 로지스틱 회귀 모델은 업데이트가 용이하므로 스트리밍 데이터를 다룰 때 적합하다.

 

 

3.5 커널 SVM을 사용하여 비선형 문제 풀기

머신 러닝 기술자 사이에서 SVM이 인기가 높은 또 다른 이유는 비선형 분류 문제를 풀기 위해 커널 방법을 사용할 수 있기 때문이다.

 

3.5.1 선형적으로 구분되지 않는 데이터를 위한 커널 방법

넘파이 logical_xor 함수를 사용하여 XOR 형태의 간단한 데이터셋을 만든다.

import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
X_xor = np.random.randn(200, 2)
y_xor = np.logical_xor(X_xor[:, 0] > 0,
                      X_xor[:, 1] > 0)
y_xor = np.where(y_xor, 1, -1)
plt.scatter(X_xor[y_xor == 1, 0],
           X_xor[y_xor == 1, 1],
           c = 'b', marker = 'x',
           label = '1')
plt.scatter(X_xor[y_xor == -1, 0],
           X_xor[y_xor == -1, 1],
           c = 'r',
           marker = 's',
           label = '-1')
plt.xlim([-3, 3])
plt.ylim([-3, 3])
plt.legend(loc='best')
plt.tight_layout()
plt.show()

간단한 XOR 데이터셋

- 이렇게 선형적으로 구분되지 않는 데이터를 다루는 커널 방법(kernel method)의 기본 아이디어는 매핑 함수를 사용하여 원본 특성의 비선형 조합을 선형적으로 구분되는 고차원 공간에 투영하는 것이다.

고차원 공간에서 찾은 결정 경계의 예

- 고차원 공간에서 두 클래스를 구분하는 선형 초평면은 원본 특성 공간으로 되돌리면 비선형 결정 경계가 된다.

 

 

3.5.2 커널 기법을 사용하여 고차원 공간에서 분할 초평면 찾기

SVM으로 비선형 문제를 풀기 위해 매핑 함수를 사용하여 훈련 데이터를 고차원 특성 공간으로 변환한다. 그다음 이 새로운 특성 공간에서 데이터를 분류하는 선형 SVM 모델을 훈련한다.

 

이런 매핑 방식의 한 가지 문제점은 새로운 특성을 만드는 계산 비용이 매우 비싸다는 것이다. 특히 고차원 데이터일 때 더욱 그렇다. 여기에 소위 커널 기법(kernel trick)이 등장하게 된다.

대략적으로 말하면 커널(kernel) 이란 용어를 샘플 간의 유사도 함수(similarity function)로 해석할 수 있다. 음수 부호가 거리 측정을 유사도 점수로 바꾸는 역할을 한다. 지수 함수로 얻게 되는 유사도 점수는 1(매구 비슷한 샘플)과 0(매우 다른 샘플)사이 범위를 가진다.

 

이제 커널 SVM을 훈련하여 XOR 데이터를 구분하는 비선형 결정 경계를 그려보자. 앞서 임포트한 사이킷런의 SVC 클래스를 사용하고 매개변수 kernel='rbf'로 바꾼다.

svm = SVC(kernel='rbf', random_state = 1, gamma = 0.10, C = 10.0)
svm.fit(X_xor, y_xor)
plot_decision_regions(X_xor, y_xor, classifier=svm)
plt.legend(loc = 'upper left')
plt.tight_layout()
plt.show()

- gamma = 0.1로 지정한 매개변수를 가우시안 구(Gaussian shere;퍼진정도)의 크기를 제한하는 매개변수로 이해할 수 있다. 이 매개변수를 잘 이해하기 위해 붓꽃 데이터셋에서 RBF 커널 SVM을 적용해보자.

svm = SVC(kernel='rbf', random_state=1, gamma = 0.2, C = 1.0)
svm.fit(X_train_std, y_train)
plot_decision_regions(X_combined_std,
                     y_combined, classifier=svm,
                     test_idx = range(105, 150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()

RBF 커널 SVM 모델이 학습한 붓꽃 데이터셋의 결정 경계

이번에는 gamma 의 값을 크게 하고 결정 경계에 미치는 영향을 관찰해본다.

svm = SVC(kernel='rbf', random_state=1, gamma = 100.0 , C = 1.0)
svm.fit(X_train_std, y_train)
plot_decision_regions(X_combined_std,
                     y_combined, classifier=svm,
                     test_idx = range(105, 150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()

감마 매개변수를 크게 한 RBF 커널 SVM의 결정 경계

- 비교적 큰 감마 값을 사용했기 때문에 클래스 0과 클래스 1 주위로 결정 경계가 매우 가깝게 나타난다.

 

이런 분류기는 훈련데이터에는 잘 맞지만 본 적 없는 데이터에서는 일반화 오차가 높을 것이다. 알고리즘이 훈련 데이터셋 변화에 너무 민감할 때 gamma 매개변수가 과대적합 또는 분산을 조절하는 중요한 역할도 한다는 것을 알 수 있다.