목차
- 5.0 SVM이란
- 5.1 선형 SVM 분류
- 5.1.1 소프트 마진 분류
- 5.2 비선형 SVM 분류
- 5.2.1 다항식 커널
- 5.2.2 유사도 특징
- 5.2.3 가우시안 RBF 커널
- 5.2.4 시간 복잡도
- 5.3 SVM 회귀
5.0 SVM 이란
SVM(Support Vector Machins)이란 매우 강력한 머신러닝 알고리즘으로 머신러닝을 배운 사람이라면 반드시 알고 있어야 하는 모델입니다. 선형이나 비선형 분류, 회귀, 이상치 탐지에도 사용할 수 있는 다목적 머신러닝 알고리즘으로 특히 분류 에서 성능이 뛰어나기 때문에 주로 분류에 많이 사용된다.

위 그림에서 Seprarating Hyper-plane은 일종의 Decision Boundary 결정경계이다. Decision Boundary란 분류를 하기 위한 기준 선이라고 생각하면 된다. 지금은 간단한 2-dimension 에서의 Decision Boundary라 선 형태로 나타나지만 차원이 계속 늘어나게 된다면 평면이 되며 이를 Hyper-plane 초평면이라고 부른다.
다음으로 점선 위에 있는 결정경계와 가장 가까이 있는 데이터들을 Support Vector라고 한다. 이 Support Vector만을 가지고 SVM이 분류 및 회귀를 실행하기 때문에 아무리 많은 train data가 있더라도 계산량이 줄어든다.
Margin은 이러한 Support Vector와 결정경계와의 간격을 말한다. 가장 최고로 잘 분류할 수 있는 Decision Boundary를 찾기 위해서 Margin이 가장 Maximium이 되게 해야 한다. 이 때 Support Vector는 최소 2개 이상이어야 한다.

SVM은 Wx+b=0 이라는 Decision Boundary를 찾은 후 새로운 데이터가 x에 input으로 들어간 후 양/음에 따라 class를 분류하게 된다. 이때 마진은 Decision Boundary에서 법선벡터를 통해 구할 수 있으며, 간단한 계산과정을 거치면 Margin(width)=2/||w||이라는 식에 도달하게 된다. 결국 마진을 최대화 하려면 w벡터값을 최소화 해야함을 알 수 있다. 여기서 ||w||를 최소화하는 것은 ||w||2을 최소화 하는 것과 같기 때문에 SVM도 결국 대부분의 머신 러닝 알고리즘에서 최적화 방법으로 사용하고 있는 quadratic optimizaion을 거치게 된다.
다음으로 위 그림에서 Slack Variable ξ를 살펴보자,
ξ_{n} = |t_{n} - y(x_{n})|
Slack Variable(ξ)이란 직선을 그었을 때 내가 속한 클래스와 실제 y값의 차이를 뜻한다. 슬랙변수는 선형적으로 분류할 수 없는 경우 오차를 허용해야하는데 이때 constraints를 완화해 오차를 허용 시 사용하는 변수로 overfitting 현상을 줄이기위해 고안된 개념이다. 쉽게 말하면 Decision Boundary 양 옆의 경계선을 침범하여 일부러 틀린 데이터 즉, 오차를 허용할 변수이다.
ξ=0이면 정상적으로 분류된 경우, 0<ξ<1 or ξ=1이면 마진이 작은 경우이고, ξ>1이면 분류가 잘못된 경우이다.
5.1 선형 SVM 분류
5.1.1 소프트 마진 분류

SVM은 마진의 크기를 최대화하는 결정경계를 찾아야 하는데 결국 이상치를 얼마나 허용할 건지에 따라 소프트 마진과 하드마진으로 분류할 수 있다. 위의 그림을 보면 이상치들이 마진 안에 어느정도 포함되도록 허용하고 있다. 이를 소프트 마진(soft margin)이라 한다. 좀더 유연한 모델이라고 볼 수 있다.
5.1.2 하드 마진 분류

위의 그림은 이상치에도 매우 민감하게 반응하여 마진을 설정한 하드 마진(hard margin)의 경우이다. 이렇게 개별적인 train data들을 다 놓지지 않고 기준을 까다롭게 적용한다. 이렇게 하드 마진의 경우 데이터가 선형적으로 구분될 수 있어야 제대로 작동하며, 이상치에 매우 민감하게 반응해 결정경계와 마진을 형성하기 때문에 일반화가 잘 되지 않아 overfitting문제가 발생할 수 있다.
여기서 Regularization Parameter "C"를 통해 마진을 조절할 수 있다.
L(w,ξ) = 1/2 ||w||^2 + C\sum_{i=1}^n ξ_i
SVM이 최적화 시 이전에 살펴본 slack 변수까지 고려해 위와 같은 식으로 표현이 가능한데 위 식에서의 "C"는 일반화의 목적으로 들어가는 일종의 penalty항으로 생각할 수 있다. 쉽게 말해 slack변수를 얼마나 허용할 지에 대한 척도이다. C값이 큰 경우는 분류기준을 까다롭게 한다는 뜻으로 정확히 분류하려고 할 것이다. 따라서 허용 오차의 개수가 작고 따라서 ||w||에 집중하여 margin이 좁다. 반대로 C값이 작은 경우 분류기준이 관대하며, margin이 크게 된다.

위 그림을 보면 이해가 빠르다. C가 작을 경우 마진이 더 크고 마진오류(margin)를 더 많이 허용한다. 반대로 C값이 큰 경우 마진이 굉장히 좁고 오류를 적게 허용한다. 이처럼 C값을 사용해 margin의 폭을 유연하게 조절할 수 있다.
5.2 비선형 SVM 분류
5.2.2 유사도 특성
비선형 특성을 다루는 또 다른 기법은 각 샘플이 특정 랜드마크와 얼마나 닮았는지 측정하는 유사도 함수로 계산한 특성을 추가하는 것이다.
예를 들어 앞에서 본 1차원 데이터셋에 두 개의 랜드마크 x_{1}=-2와 x_{2}=1를 추가하자([그림5-8]의 왼쪽 그래프).
그리고 𝛄=0.3인 가우시안 방사 기저 함수(RBF)를 유사도 함수로 정의하면 다음과 같다.
0 ≤ 𝝓_{𝜸}(x,𝓁) = exp(-𝜸∥x-𝓁∥^2) ≤ 1
예시로 x_{1}=-1 샘플을 봐보자. x_{1}은 첫 번째 랜드마크인 x_{2}에 대해 1만큼 떨어져 있고, 두 번째 랜드마크인 x_{3}에 대해 2만큼 떨어져 있다. 그래서 x_{2}=exp(-0.3×1^2)≈0.74와 x_{3}=exp(-0.3×2^2)≈0.30이고, 이렇게 계산된 값들을 [그림 5-8]로 그렸을 때 선형적으로 구분이 가능해졌다.

5.2.3 가우시안 RBF 커널
다항 특성 방식과 마찬가지로 유사도 특성 방식도 머신러닝 알고리즘에 유용하게 사용될 수 있다. 추가 특성을 모두 계산하려면 연산 비용이 많이 드는데 특히 훈련 세트가 클 경우 더 그렇습니다. 여기에서 커널 트릭이 한 번 더 SVM의 마법을 만듭니다. 유사도 특성을 많이 추가하는 것과 같은 비슷한 결과를 얻을 수 있다. 가우시안 RBF 커널을 사용한 SVC 모델은 다음과 같다.
rbf_kernel_svm_clf = Pipeline([
('scaler', StandardScaler()),
('svm_clf', SVC(kernel='rbf', gamma=5, C=0.001))
])
rbf_kernel_svm_clf.fit(X, y)
이 코드에 나타난 모델은 [그림 5-9]의 왼쪽 아래에 나타나 있으며 다른 그래프들은 하이퍼파라미터 gamma와 C를 바꾸어 훈련시켰다.

gamma를 증가시키면 종 모양 그래프가 좁아져서([그림 5-8]의 왼쪽 그래프 참고.) 각 샘플의 영향 범위가 작아진다. 결정 경계가 조금 더 불규칙해지고 각 샘플을 따라 구불구불하게 휘어진다. 반대로 작은 gamma 값은 (위) 넓은 종 모양 그래프를 만들며 샘플이 넓은 범위에 걸쳐 영향을 주므로 결정 경계가 더 부드러워진다. 결국 하이퍼파라미터 𝜸가 규제의 역할을 하는데 모델이 과대적합일 경우엔 감소시켜야 하고 과소적합일 경우엔 증가시켜야 합니다(하이퍼파라미터 C와 비슷하다).
5.2.4 계산 복잡도

m=샘플 수, n=특성 수
5.3 SVM 회귀
SVM 알고리즘은 범용성이 좋은데 앞서 이야기한 선형, 비선형 분류뿐만 아니라 선형, 비선형 회귀에도 사용할 수 있다.
SVM을 분류가 아니라 회귀에 적용하는 방법은 목표를 반대로 하는 것이다. SVM 분류는 일정한 마진 오류 안에서 두 클래스 간의 도로 폭이 가능한 최대가 되도록 하는 대신, SVM 회귀는 제한된 마진 오류(즉, 도로 밖의 샘플) 안에서 도로 안에 가능한 많은 샘플이 들어가도록 학습한다. 도로의 폭은 하이퍼파라미터 ɛ으로 조절하는데 값이 커지면 마진이 넓어진다.

[그림 5-10]은 무작위로 생성한 선형 데이터셋에 훈련시킨 두 개의 선형 SVM 모델을 보여주는데 왼쪽은 마진을 크게, 오른쪽은 마진을 작게 만들었다. 왼쪽 그래프의 코드는 다음과 같다.
from sklearn.svm import LinearSVR
svm_reg = LinearSVR(epsilon=1.5)
svm_reg.fit(X, y)

비선형 회귀 작업을 처리하려면 커널 SVM 모델을 사용하는데 [그림 5-11]은 임의의 2차 방정식 형태의 훈련 세트에 2차 다항 커널을 사용한 SVM 회귀를 보여준다. 왼쪽 그래프는 규제가 거의 없고(즉, 아주 큰 C), 오른쪽 그래프는 규제가 훨씬 많습니다(즉, 작은 C). 다음 코드는 왼쪽 그래프를 그리는 모델이다.
from sklearn.svm import SVR
svm_poly_reg = SVR(kernel='poly', degree=2, C=100, epsilon=0.1)
svm_poly_reg.fit(X, y)
SVR은 SVC의 회귀 버전이고 LinearSVR은 LinearSVC의 회귀 버전인데 LinearSVR은 LinearSVC처럼 필요한 시간이 훈련 세트의 크기에 비례해서 선형적으로 늘어나지만, SVR은 SVC처럼 훈련 세트가 커지면 훨씬 느려진다.
'Hands-On Machine Learning' 카테고리의 다른 글
[핸즈온머신러닝] CH8. 차원 축소 (Dimension Reduction) (0) | 2023.01.13 |
---|---|
[핸즈온머신러닝] CH7. 앙상블(Ensemble) 학습 (0) | 2022.12.09 |
[핸즈온머신러닝] CH6. 결정 트리(Decision Tree) (1) | 2022.12.09 |
[핸즈온머신러닝] CH4. 모델 훈련 (Training Model) (0) | 2022.11.27 |
[핸즈온머신러닝] CH3. 분류 (Classification) (0) | 2022.11.27 |