Support Vector Machine
- 고차원 데이터 분류에 좋은 성능을 보인다.
- 퍼셉트론의 확장
- 최적화 대상은 margin을 최대화하는 것
margin : 클래스를 구분하는 결정 경계와 결정 경계와 가장 가까운 sample사이의 거리로 정의
이때 해당 sample을 support vector라고 부름

선형 SVM
1) 개요
- 클래스가 다른 데이터들을 large margin으로 분리하는 경계를 찾는 것이다.
- 즉, 클래스 간의 거리가 최대가 될 수 있도록 하는 것이다.
2) 수학적 이해 - w, b를 찾아야한다.
- 목적식
wTxpos+b=1vectoronplusplane
wT(xneg+λw)+b=1(xpos=xneg+λw)
wTxneg+b+λwTw=1
−1+λwTw=1(wTxneg+b=−1)
λ=2wTw
Margin=distance(xpos,xneg)
=||xpos−xneg||2
=||(xneg+λw)−xneg||2
=||λw||2=λ√wTw
=2wTw⋅√wTw=2√wTw
=2||w||2
L2 norm
||W||2=(∑i|wi|2)12=√w21+w22+⋯+w2n=√WTW
maxMargin=max2||w||2⇔min12||w||2
- 계산의 편의를 위해 제곱을 해준다.
12||w||22
- 제약식
- 아래 제약을 통해 margin이 최소 1 이상인 값을 구한다.
w0+wTx(i)≥1y(i)=1일때
w0+wTx(i)≤−1y(i)=−1일때
yi(w0+wTxi)≥1∀i
Quadratic programming
- 목적함수는 제곱을 했기 때문에 2차식이고 제약식은 선형이기 때문에 이를 quadratic programming이라 부른다.
- 이는 convex optimization이기 때문에 globally optimal solution이 존재한다.
다음 공식을 적용하여 L2 norm을 사용한 것을 알 수 있다.
Ax+By+c=0,(x0,y0)d=Ax0+By0+c=0√A2+B2
선형 SVM 이상치 처리 (linearly non-separable data)
1) Outlier (이상치 처리)
- 실전에서 모델을 설계할 때, 모든 데이터가 정확하게 나뉘어 있는 경우는 드물다.
- 선형 SVM에서는 parameter cost를 조정하여 얼마나 다른 클래스로 분류될 허용치를 결정한다.
- C의 크기가 작을 수록 많이 허용하고 클수록 적게 허용한다.
- C가 없으면 hard-margin SVM (separable), 있으면 soft-margin SVM (non-separable)으로 나뉜다.

2) Slack variable
- 선형 제약 조건을 완화
- 제약식
w0+wTx(i)≥1−ξy(i)=1일때
w0+wTx(i)≤−1+ξy(i)=−1일때
- 목적식
12||w||2+C(∑iξ(i))
3) 코드 예시
from sklearn.svm import SVC
svm = SVC(kernel='linear', C=10.0, random_state = 1)
svm.fit(X_train_std, y_train)
비선형 SVM
1) 개요
- 비선형 데이터를 매핑 함수(phi function)를 사용하여 선형적으로 구분되는 고차원 공간에 투영한다.
- SVM을 고차원의 투영된 공간에서 학습을 진행한다.

2) 수학적 이해
Φ:x→z=Φ(x)
- SVM Lagrangian dual formulation에서 x를 내적하는 부분이 있는데 이를 아래와 같이 변환한다.
xTixj→Φ(xi)TΦ(xj)
- 내적에 사용되는 높은 비용 절감을 위해 커널함수로 정의
K(x(i),x(j))=ϕ(x(i))Tϕ(x(j))
kernel function을 사용하면 phi function을 사용했을 때와 동일한 결과지만 계산과정은 더 간단하다.
3) Kernel function
- kernel을 결정하는 뚜렷한 기준이 없어서 데이터 특성에 맞게 선택하는 것이 중요하다.
4) RBF; Radial Basis function (방사기저함수, Gaussian kernel)
- 가장 널리 사용되는 커널 함수 중 하나
- 매개변수 C와 gamma를 조정해야 하는데 gamma는 가우시안 구의 크기를 제한하는 매개변수이다.
- gamma가 클수록 support vector의 영향력이 줄어들어 결정경계는 구불구불해진다.

5) 코드 예시
svm = SVC(kernel='rbf', random_state = 1, gamma=0.10, C=10.0)
svm.fit(X_xor, y_xor)
Logistic vs. SVM
- Logistic은 SVM보다 이상치에 민감하다. SVM은 결정 경계에 가까운 support vector에 관심을 둔다.
- Logistic은 간단하고 구현이 쉬우며 업데이트가 용이하다.
from sklearn.linear_model import SGDClassifier
ppn = SGDClassifier(loss = 'perceptron') # perceptron
lr = SGDClassifier(loss = 'log') # logistic regression
svm = SGDClassifier(loss = 'hinge') # SVM
참고
머신러닝 교과서 with 파이썬, 사이킷런, 텐서플로 (길벗)
비스카이비전 블로그 bskyvision.com/163
고려대 김성범 교수님 유튜브 www.youtube.com/channel/UCueLU1pCvFlM8Y8sth7a6RQ/videos