선형 SVM의 분류 방법


1. 라지 마진 분류 (Large Margin Classification)

< Fig. 1. Large Margin Classification >


Fig. 1은 붓꽃 데이터셋의 일부를 나타낸 그림입니다. 두 클래스가 직선으로 확실히 잘 나뉘어 진 것을 확인할 수 있습니다.

왼쪽 그래프에 세 개의 선형 분류기에서 만들어진 결정 경계를 확인할 수 있습니다. 점선으로 나타난 결계는 클래스를 적절히 분류하지 못하고 있습니다.

다른 두 모델은 훈련 세트에 완벽하게 동작합니다. 하지만, 결정 경계가 샘플에 너무 가까워 새로운 샘플에 대해서는 아마 잘 작동하지 못할 것입니다.


오른쪽 그래프에 있는 실선은 SVM 분류기의 결정 경계입니다. 이 직선은 두 개의 클래스를 나누고 있을 뿐만 아니라 제일 가까운 훈련 샘플로부터 가능한 한 멀리 떨어져 있습니다.

SVM 분류기를 클래스 사이에서 가장 폭이 넓은 도로를 찾는 것으로 생각할 수 있습니다. 이를 라지 마진 분류라고 합니다.


도로 바깥쪽에 훈련 샘플을 더 추가해도 결정 경계에는 전혀 영향을 미치지 않습니다. 도로 경계에 위치한 샘플에 의해 전적으로 결정됩니다.

이런 샘플을 서포트 백터라고 합니다. (오른쪽 그래프의 동그라미로 표시된 부분)


2. 소프트 마진 분류(Soft Margin Classification)

모든 샘플이 도로 바깥쪽에 올바르게 분류되어 있다면 이를 하드 마진 분류라고 합니다.

하드 마진 분류에는 두 가지 문제점이 있습니다. 데이터가 선형적으로 구분될 수 있어야 제대로 작동하며, 이상치에 민감합니다.


< Fig. 2 이상치에 민감한 하드 마진 >


Fig. 2를 살펴보면 왼쪽 그래프에 이상치가 하나 있습니다. 왼쪽 그래프에서는 하드 마진을 찾을 수 없습니다.

오른쪽 그래프의 결정 경계는 이상치가 없던 Fig. 1과 매우 다르고 일반화가 잘 되지 않습니다.


이러한 문제를 피하기 위해서는 조금 더 유연한 모델이 필요합니다. 도로의 폭을 가능한 넓게 유지하는 것과 마진 오류(Margin Violation) 사이에 적절한 균형을 잡하야 합니다.

이를 소프트 마진 분류라고 합니다. 


< Fig. 3. 좁은 마진과 넓은 마진 >


사이킷런의 SVM 모델에서는 C 하이퍼파라미터를 사용해 이 균형을 조절할 수 있습니다. C값을 줄이면 도로의 폭이 넓어지지만 마진 오류도 커집니다. 

Fig. 3은 선형적으로 구분되지 않는 데이터셋에 두 개의 소프트 마진 SVM 분류기로 만든 결정 경계와 마진을 보여줍니다. 왼쪽 그래프에서는 큰 C 값을 사용해 분류기가 마진 오류를 적게 냈지만 마진이 좁아졌고, 오른쪽 그래프에서는 작은 C 값을 사용하여 마진이 넓어졌지만 많은 샘플이 도로 안에 포함되었습니다. 두 개의 그래프에서는 오른쪽에 있는 분류기가 더 잘 일반화될 것 같아 보입니다. 사실 대부분의 마진 오류는 결정 경계를 기준으로 올바른 클래스로 분류되기 때문에 이 훈련 세트에서 예측 에러는 마진 오류보다 적습니다.


아래의 코드는 붓꽃 데이터를 적재하고, 특성 스케일을 변경하고, Iris - Virginia 품종을 감지하기 위해 선형 SVM 모델을 훈련시킵니다.

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]]))

> array([1.])


여기에서는 선형 SVM 분류기를 훈련시키기 위해 일반적인 확률적 경사 하강법을 적용합니다.

LinearSVC만큼 빠르게 수렴하지는 않지만 데이터셋이 아주 커서 메모리에 적재할 수 없거나, 

온라인 학습으로 분류 문제를 다룰 때는 유용합니다.



+ Recent posts