SVM

서포트 벡터 머신(Support Vector Machine)은 선형, 비선형 분류 및 회귀 등에 모두 사용될 수 있는 다목적 머신러닝 모델이다.

선형 SVM 분류

서포트 벡터 머신은 라지 마진 분류라고도 불리며, 아래 그림을 보자.

Untitled

출처 : [1]

위에 보이는 선에 걸친 샘플들을 서포트 벡터라고 한다. 서포트 벡터 머신은 이러한 서포트 벡터들을 통해 hyperplane을 그어 샘플들을 구분하는 알고리즘을 의미한다.

소프트 마진 분류

모든 샘플들이 하이퍼플레인의 도로 밖에 적절하게 구분되어 있다면 이를 하드 마진 분류라고 부른다. 하지만 만약 이상치가 있다면 문제가 생길 수 있다. 이 문제를 해결하기 위해 도로를 넓게 유지하는 것과 마진 오류의 적절한 균형을 맞추는 것이 필요하다. 이를 소프트 마진 분류라고 한다.

import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

iris = datasets.load_iris()
X = iris["data"][:, (2, 3)]
y = (iris["target"] == 2).astype(np.float64)

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

svm_clf.fit(X, y)
print(svm_clf.predict([[5.5, 1.7]]))

>> [1.]

그렇다면 조금 더 수학적으로 알아보자.

$$ \min_{w,b,\epsilon}\frac{\parallel w \parallel^2}{2}+C\sum^N_{i=1}\epsilon_i\ subject\ to\ y_i(b+wx_i)\geq1-\epsilon_i,\epsilon\geq0\ for\ all\ i=1,...,N $$

$$ \max_{\alpha,\beta}\min_{w,b,\epsilon}\frac{\parallel w \parallel^2}{2}+C\sum^N_{i=1}\epsilon_i-\sum^N_{i=1}\alpha_i[y_i(wx_i+b)-1+\epsilon_i]-\sum^N_{i=1}\beta_i\epsilon_i\ subject\ to\ \alpha_i\geq0,\beta_i\geq 0\ for \ all\ i=1,...,N $$

$$ \frac{\partial L}{\partial w}=0.\frac{\partial L}{\partial b}=0,\frac{\partial L}{\partial \epsilon_i}=0 $$

$$ w=\sum^N_{i=1}\alpha_iy_ix_i,\sum^N_{i=1}\alpha_iy_i=0,\alpha_i=C-\beta_i $$

$$ \max_{\alpha}\sum^N_{i=1}\alpha_i-\frac{1}{2}\sum^N_{i=1}\sum^N_{j=1}\alpha_i\alpha_jy_iy_jx^T_ix_j\ subject\ to\ C\geq\alpha_i\geq0,\sum^N_{i=1}\alpha_iy_i=0\ for\ i=1,...,N $$

$$ w=\sum^N_{i=1}\alpha_iy_ix_i,b=\frac{1}{N_{Unbound\ Support\ Vector}}\sum^{N_{Unbound\ Support\ Vector}}_{i=1}(y_i-w^Tx_i) $$

위의 Unbound Support Vector은 $C\gt\alpha_i\gt0$ 을 만족하는 margin위의 샘플이다.