Machine Learning/Advanced (hands on machine learning)

12. 서포트 벡터 머신 - 선형 SVM 분류

jwjwvison 2021. 5. 19. 22:27

 서포트 벡터 머신(SVM)은 매우 강력하고 선형이나 비선형 분류, 회귀, 이상치 탐색에도 사용할 수 있는 다목적 머신러닝 모델이다. SVM은 특히 복잡한 분류 문제에 잘 들어맞으며 작거나 중간 크기의 데이터셋에 적합하다.

 

 다음 그림은 앞에서 소개한 붓꽃 데이터셋의 일부를 나타냈다. 두 클래스가 직선으로 확실히 잘 나뉘어 있다. 왼쪽 두 선은 분류를 잘 할 수 있지만 결정 경계가 샘플에 너무 가까워 새로운 샘플에 대해서는 아마 잘 작동하지 못할 것이다.

 오른쪽 그래프에 있는 실선은 SVM 분류기의 결정 경계이다. 이 직선은 두 개의 클래스를 나누고 있을 뿐만 아니라 제일 가까운 훈련 샘플로부터 가능한 멀리 떨어져 있다. SVM 분류기를 클래스 사이에 가장 폭이 넓은 도로를 찾는 것으로 생각할 수 있다. 그래서 라지 마진 분류 라고 한다.

 

 모든 샘플이 도로 바깥쪽에 올바르게 분류되어 있다면 이를 하드 마진 분류라고 한다. 하드 마진 분류에는 두가지 문제점이 있다. 데이터가 선형적으로 구분될 수 있어야 제대로 작동하며, 이상치에 민감하다. 다음 그림을 보면 붓꽃 데이터셋에 이상치가 하나 있다. 왼쪽 그래프에서는 하드 마진을 찾을 수 없다. 오른쪽 그래프의 결정 경계는 이상치가 없던 5-1 의 결정 경계와 매우 다르고 일반화가 잘될 것 같지 않다.

 

 이런 문제를 피하려면 좀 더 유연한 모델이 필요하다. 도로의 폭을 가능한 한 넓게 유지하는 것과 마진 오류(즉, 샘플이 도로 중간이나 심지어 반대쪽에 있는 경우) 사이에 적절한 균형을 잡아야 한다. 이를 소프트 마진 분류 라고 한다. 

 사이킷런의 SVM 모델을 만들 때 여러 하이퍼파라미터를 지정할 수 있다. C는 이런 하이퍼파라미터 중에 하나이다. 이를 낮게 설정하면 다음 그림의 왼쪽 그림과 같은 모델을 만든다. 높게 설정 하면 오른쪽과 같은 모델을 얻는다. 마진 오류는 나쁘므로 일반적으로 적은 것이 좋다.

 

 다음 사이킷런 코드는 붓꽃 데이터셋을 적재하고, 특성 스케일을 변경하고, Iris-Virginia 품종을 감지하기 위해 선형 SVM 모델을 훈련시킨다 (C=1 과 잠시 후에 설명할 힌지손실 함수를 적용한 LinearSVC 클래스를 사용한다).

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)
svm_clf.predict([[5.5,1.7]])