Computer Engineering/머신러닝(ML: Machine Learning)

[ML] 5-1. 서포트 벡터 머신(SVM)이란 무엇일까?

잇트루 2021. 8. 18. 18:42
반응형

[이전글]

[ML] 4-2. 머신러닝의 테스트와 검증 및 데이터 불일치 여부 확인

ittrue.tistory.com/43

 

[ML] 4-1. 머신러닝에서의 하이퍼파라미터란 무엇일까? (파라미터 vs 하이퍼파라미터)

[이전글] [ML] 3-2. 머신러닝의 훈련 조건 (2) - 과대적합과 과소적합 ittrue.tistory.com/39 [ML] 3-2. 머신러닝의 훈련 조건 (과대적합과 과소적합) [이전글] [ML] 3-1. 머신러닝의 훈련 조건 (1) - 좋은 데이터..

ittrue.tistory.com

서포트 벡터 머신이란?

서포트 벡터 머신(SVM : Support Vector Machine)이란 두 클래스로부터 최대한 멀리 떨어져 있는 결정 경계를 찾는 분류기로 특정 조건을 만족하는 동시에 클래스를 분류하는 것을 목표로 합니다. 결정 경계를 통해 어느 쪽에 속하는지 판단하는 것으로, 선형이나 비선형 분류, 회귀, 이상치 탐색에도 사용할 수 있는 강력한 성능을 갖는 지도 학습 모델입니다. 특히, 복잡한 분류에 잘 들어맞으며 데이터셋이 작거나 중간 크기에 적합합니다.

하드 마진과 소프트 마진

서포트 벡터 머신은 기본적으로 마진(Margin)이라는 아이디어를 사용합니다. 마진은 두 데이터 클래스를 구분하는 도로의 경계를 뜻합니다. 위 사진을 예로 들면, 가운데 실선은 두 데이터 클래스를 구분 짓는 결정 경계를 기준으로 가장 가까운 데이터와 접하여 점선이 있습니다. 여기서 결정 경계로부터 점선까지의 거리가 마진입니다. 같은 의미로 도로의 폭을 뜻합니다.

 

SVM 분류기를 클래스 사이에 가장 폭이 넓은 도로를 찾는 것이 최적의 결정 경계를 찾는 것이고, 최적의 결정 경계를 찾으면 도로 폭을 최대화하여 마진을 최대로 가질 수 있게 됩니다. 이를 라지 마진 분류라고 합니다.

 

서포트 벡터

마진을 통해 추가적으로 알 수 있는 것은 결정 경계와 가장 가까이 있는 데이터들이 마진을 결정하게 되는 것입니다. 이를 서포트 벡터라고 합니다. 서포트 벡터는 도로 바깥쪽에 훈련 샘플을 더 추가해도 결정 경계에는 전혀 영향을 미치지 않으나, 도로 안쪽에 추가적인 데이터가 들어온다면, 결정 경계에 영향을 미치게 되며 마진 또한 달라질 수 있습니다.

 

하드 마진 분류와 소프트 마진 분류

마진 분류에는 두 가지 종류가 있는데 바로 하드 마진 분류와 소프트 마진 분류입니다. 하드 마진 분류는 모든 샘플이 도로 바깥쪽에 분류되어 왼쪽 사진과 같이 나타나는 것을 하드 마진 분류라고 합니다. 하드 마진 분류는 훈련 세트가 선형적으로 구분되는 경우에만 가능하며 이상치에 매우 민감한 특성을 가지고 있습니다. 예를 들어, 파란색 클래스에 빨간색 데이터가 섞여 있어 하드 마진을 찾을 수 없게 되거나, 데이터 이상치로 인한 일반화가 되지 않을 수 있습니다.

 

이러한 문제를 피하기 위해 마진을 가능한 한 넓게 유지하면서 마진 오류를 발생시키지 않는 적절한 균형을 잡아야 합니다. 이를 소프트 마진 분류라 하며 오른쪽 사진과 같이 나타납니다. 소프트 마진 분류는 그림과 같이 도로폭을 가능한한 넓게 유지하면서 이상치가 발생하더라도 어느 정도 허용하도록 하는 것입니다.

 

 

사이킷 런에서는 이러한 마진 오류를 허용하는 하이퍼파라미터 C를 사용하여 조정할 수 있습니다. C는 작으면 작을수록 마진 오류를 허용하며, 크면 클수록 마진 오류를 허용하지 않습니다.

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) # 아이리스, 버지니카 품종

scaler = StandardScaler()
svm_clf1 = LinearSVC(C=1, loss="hinge", random_state=42) # C=1
svm_clf2 = LinearSVC(C=100, loss="hinge", random_state=42) # C=100

scaled_svm_clf1 = Pipeline([
        ("scaler", scaler),
        ("linear_svc", svm_clf1),
    ])
scaled_svm_clf2 = Pipeline([
        ("scaler", scaler),
        ("linear_svc", svm_clf2),
    ])

scaled_svm_clf1.fit(X, y)
scaled_svm_clf2.fit(X, y)

 

반응형