서포트 벡터 머신(SVM)

서포트 벡터 머신(SVM)

서포트 벡터 머신(Support Vector Machine, SVM)은 선형, 비선형, 분류, 회귀 등 다목적으로 사용할 수 있는 머신러닝 모델이다. 복잡한 분류문제에 특히 잘 맞으며 작거나 중간크기의 데이터셋에 적합하다.

1. 선형 SVM 분류

선형 SVM 분류기는 클래스들 사이에 결정경계선을 긋되, 그 선이 모든 클래스로부터 최대한 멀리 떨어져있을 수 있도록 한다. 따라서 라지 마진 분류(large margin classification) 라고도 한다.

이 경계선을 결정짓는 것은 각 클래스에서 해당 선으로부터 가장 가까운 샘플이다. 이 샘플을 서포트 벡터(support vector)라고 한다.

SVM은 특성의 스케일에 매우 민감해서, 사이킷런의 StandardScaler 와 같은 스케일 도구를 통해 특성을 스케일링하면 결정경계가 훨씬 좋아질 수 있다.

모든 샘플이 결정경계선에서 떨어진 곳에 잘 분류되는 것을 ‘하드 마진 분류’라고 한다. 하드마진 분류는 데이터가 선형적으로 구분 가능할 때만 작동하고, 이상치가 존재하는 경우에도 하드마진을 찾을 수 없다. 이런 문제를 피하기 위해 이상치로 인해 발생하는 마진 오류(margin violation)를 어느정도 허용하면서도 결정경계선과 서포트 벡터 간의 거리를 최대한 멀게 하는 유연한 모델을 소프트 마진 분류(soft margin classification)라고 한다. 사이킷런이 제공하는 SVM모델에서는 하이퍼파라미터 C를 통해 이 균형을 조절할 수 있다. C값을 줄이면 마진이 넓어지지만 마진 오류도 커지고, C를 키우면 마진오류가 줄어들지만 마진 폭도 좁아진다. SVM 모델이 과대적합처럼 보인다면 이 C값을 감소시켜 모델을 규제해 일반화시키는 것이 좋다.

다음은 사이킷런에서 선형 SVM 분류모델을 구현하는 코드이다.

1
2
3
4
5
6
7
8
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

svm_clf = Pipeline([
("scaler", StandardScaler()),
("linear_svc", LinearSVC(C=1, loss='hinge')),
])

2. 비선형 SVM 분류

선형적으로 분류할 수 없는 비선형 데이터셋을 분류하는 하나의 방법은 데이터에 다항식 특성과 같은 특성을 더 추가하여 선형적으로 구분할 수 있게 만드는 것이다.

사이킷런의 PolynomialFeatures 변환기와 StandardScaler, LinearSVC 를 연결해 파이프라인을 구축하여 다항 특성을 사용한 선형 SVM분류모델을 구현할 수 있다.

1
2
3
4
5
6
7
from sklearn.preprocessing import PolynomialFeatures

polynomial_svm_clf = Pipeline([
('poly_features', PolynomialFeatures(degree=3)),
('scaler, StandardScaler()),
('svm_clf', LinearSVC(C=10, loss='hinge', max_iter=2000))
])

여기서 손실함수로 사용된 힌지 손실(hinge loss)함수는 $\max(0, 1-t)$ 의 식을 갖는다.

2-1. 다항식 커널

다항식 특성을 추가하는 것은 간단하기도 하고 SVM을 비롯한 모든 머신러닝 알고리즘에서 잘 작동한다. 하지만 낮은 차수의 다항식은 복잡한 데이터셋을 잘 표현하지 못하고, 높은 차수의 다항식은 너무 많은 특성을 추가하게 되어 모델을 느리게 만든다.

SVM에서는 커널 트릭(kernel trick) 이라는 수학적 장치를 통해 실제로는 특성을 추가하지 않으면서 다항식특성을 많이 추가하는 것과 같은 효과를 얻을 수 있다. 아래는 3차 다항식 커널을 사용한 SVM모델을 구현하는 코드이다.

1
2
3
4
5
from sklearn.svm import SVC
poly_kernel_svm_clf = Pipeline([
('scaler', StandardScaler()),
('svm_clf', SVC(kernel='poly', degree=3, coef0=1, C=5))
])

모델이 과대적합이라면 차수를 줄이고, 과소적합이라면 차수를 늘려야 한다. 위 코드에서 인수 coef는 모델이 차수에 얼마나 영향을 받을지 조절하는 상수항이다. 차수가 높아질수록 1보다 작은 값과 1보다 큰 값의 차이가 크게 벌어지므로 이 상수항 값을 적절히 지정함으로써 고차항의 영향을 줄일 수 있다.

2-2. 유사도 특성 추가

다항식 특성 방식 이외에 비선형 특성을 다루는 또 다른 기법은 각 샘플이 특정 랜드마크와 얼마나 닮았는지 측정하는 유사도 함수(similarity function)로 계산한 특성을 추가하는 것이다. 유사도 함수로는 다음과 같은 가우시안 RBF(Radial Basis Function)을 주로 사용한다.

이 함수의 값은 샘플 $x$가 랜드마크 $l$로부터 얼마나 멀리 떨어졌느냐에 따라 0에서 1까지의 값을 가지며 종모양으로 나타난다. 이 함수를 통해 계산된 값을 데이터로 대체하면 선형으로 분리할 수 없었던 1차원상의 데이터셋을 선형분리할 수 있게 된다.

랜드마크를 선택하는 방식은 데이터셋에 있는 모든 샘플 위치에 랜드마크를 설정하는 것이다. 이렇게 하면 차원이 매우 커져서 변환된 데이터셋을 선형분리할 수 있게 되지만 특성이 너무 많이 만들어지게 되는 단점이 있다.

2-3. 가우시안 RBF 커널

이 유사도 특성 방식도 커널 트릭을 통해 실제로 유사도 특성을 많이 추가하지 않으면서 추가하는 것과 같은 결과를 낼 수 있다. SVC 모델에 가우시안 RBF 커널을 적용하는 코드는 다음과 같다.

1
2
3
4
rbf_kernel_svm_clf = Pipeline([
('scaler', StandardScaler()),
('svm_clf', SVC(kernel='rbf', gamma=5, C=0.001))
])

여기서 gamma 인수를 증가시키면 유사도함수의 종모양이 좁아지게 되어 각 샘플의 영향 범위가 작아진다. 즉, 결정경계가 좀 더 불규칙해지고 각 샘플에 따라 구불구불해진다. 반대로 작은 gamma값은 넓은 종모양을 만들어 샘플이 넓은 범위에 영향을 주기 때문에 결정경계가 더 부드러워진다. 결국 하이퍼파라미터 $\gamma$ 값이 규제의 역할을 하는 것이다. 모델이 과대적합일 경우 감소시키고, 과소적합일 경우 증가시켜야 한다.

여러 가지 커널 중 어떤 것을 사용해야 할까?

항상 선형 커널을 가장 먼저 시도해보아야 한다. 훈련세트가 너무 크지 않다면 가우시안 RBF 커널이 대부분 잘 작동한다.

3. SVM 회귀

SVM 알고리즘은 선형, 비선형 분류 뿐 아니라 회귀에도 사용할 수 있다. SVM 회귀는 분류에서의 목표와 반대로, 제한된 마진오류 안에서 가능한 한 많은 샘플이 좁은 선형 공간에 들어갈 수 있도록 학습한다. 그 공간의 폭, 즉 마진은 하이퍼파라미터 $\epsilon$ 으로 조절한다.

사이킷런의 LinearSVR 을 이용해 선형 SVM 회귀모델을 구현해보면 다음과 같다.

1
2
3
from sklearn.svm import LinearSVR

svm_reg = LinearSVR(eplilon=1.5)

비선형 회귀모델을 만들 때는 커널 SVM모델을 사용한다. 다음은 2차 다항식 형태의 데이터셋을 훈련하기 위한 비선형 SVM 모델을 구현하는 코드이다.

1
2
from sklearn.svm import SVR
svm_poly_reg = SVR(kernel='poly', gamma='auto', degree=2, C=100, epsilon=0.1)

4. SVM 이론

결정함수

선형 SVM 분류 모델은 결정함수 $\bold{w}^T \cdot \bold{x} + b = w_1x_1 + \cdots + w_nx_n + b$ 를 계산해서 새로운 샘플 $\bold{x}$ 의 클래스를 예측한다. 이 값이 0보다 크면 클래스 1, 그렇지 않으면 0에 해당하는 것이다.

이 분류모델에서 결정경계선은 결정함수 값이 0인 점들로 이루어진 직선이 된다. 소프트 마진 선형 SVM 모델을 훈련한다는 것은 특정 마진 오류값을 허용하면서 이 직선으로부터 샘플하이 최대한 멀리 떨어지도록 하는 $\bold{w}$ 와 $b$ 를 찾는 것이다.

목적함수

SVM 분류기의 마진을 최대화하는 것은 결정함수의 가중치벡터 $\bold{w}$ 의 노름을 최소화하는 것과 같다.

하드마진 선형 SVM 분류기의 목적함수는 다음과 같다.

소프트마진 분류기의 목적함수에는 각 샘플에 대해 슬랙변수(slack variable)라는 개념이 추가된다. 이 슬랙변수 $\zeta^{(i)}$는 i번째 샘플이 마진을 얼마나 위반할지를 결정한다. 여기에 하이퍼파라미터 C를 통해 마진을 크게 하는 것과 슬랙변수를 작게 하는 것 간의 균형을 맞춘다.

Share