코딜기

[Python/ML] 서포트 벡터 머신 (Support Vector Machine) SVM 본문

ML & DL/Build & Train Model

[Python/ML] 서포트 벡터 머신 (Support Vector Machine) SVM

코딜기 2022. 3. 4. 00:58
반응형

서포트 벡터 머신(Support Vector Machine)이란 무엇일까요?

  • 서포트 벡터 머신(이하 svm)은 분류, 회귀 문제에 모두 사용할 수 있는 강력한 모델입니다.

데이터를 구분 짓는 가장 올바른 결정 경계는 무엇일까요?

 

 

-

  • 사실 '올바르다'라는 기준은 각 모델마다 다르겠지만 계속해서 새로운 데이터가 입력이 되었을 때 모두 비슷한 예측력을 갖게 하는 결정 경계가 올바른 결정 경계라고 할 수 있습니다.
  • 바로 이 올바른 결정 경계를 정의하고, 만들어 주는 모델이 서포트 벡터 머신입니다.

그렇다면 최적의 결정 경계는 어떻게 만들 수 있을까요?

  • 학습용 데이터를 통해 각 클래스 사이의 가장 근접한 벡터를 찾아내고, 이 두 벡터를 지나는 각각의 직선을 그립니다.
  • 그려진 두 개의 직선이 평행하도록 만들어준 후 정중앙에 두 직선과 평행한 직선을 그려줍니다.

  • 결정 경계를 찾게 도와주는 이 두 벡터를 서포트 벡터(Support Vector)라고 부릅니다.
    • 서포트 백터는 2개 이상이 될 수 있습니다.
  • 클래스 사이에 새로 만들어진 직선은 결정 경계가 됩니다.
  • 결정 경계를 제외하고 평행한 두 직선의 사이의 거리 값을 마진(Margin)이라고 합니다.
    • 마진의 최대화 방식을 통해 분류 모델을 조정합니다.
    • 마진은 클래스의 유사도라고도 볼 수 있습니다. 마진이 크면 클래스 간의 유사도가 낮고, 작으면 유사도는 높습니다.

Soft Margin VS Hard Margin

  • SVM에서는 마진 값을 설정하여 결정 경계를 조절할 수 있습니다.

1. Soft Margin

  • Soft Margin은 결정 경계를 조금씩 넘어가는 데이터들을 어느 정도 허용하여 유연한 결정 경계를 만들어냅니다.
  • 아래와 같은 데이터 분포는 직선으로 두 클래스를 분류하기 어렵기 때문에 어느 정도의 비용(Cost, C)을 감수하면서 가장 최선의 결정 경계를 찾습니다.
  • Cost는 모델링을 하면서 설정이 가능하고, 이 값이 크면 클수록 Soft Margin을, 작으면 작을수록 Hard Margin을 만들어냅니다.

Soft Margin

2. Hard Margin

  • Hard Margin은 이상치들을 허용하지 않고, 분명하게 나누는 결정 경계를 만들어냅니다.
  • 과적합(Overfitting)의 오류가 발생하기 쉽습니다.
  • 노이즈로 인해 최적의 결정 경계를 잘못 설정하거나 못 찾는 경우도 발생합니다.

Hard Margin


Kernel Trick

  • SVM은 기본적으로 선형 분류를 위한 결정 경계를 만들지만, Kernel Trick을 사용한다면 비선형 분류도 가능합니다.
  • 아래와 같은 데이터 분포는 저차원(2D)에서는 선형 분리가 되지 않을 수 있지만, 고차원(3D)에서는 선형 분리가 가능합니다.

  • 데이터를 고차원으로 보내서 서포트 벡터를 구하고 다시 저차원으로 축소하는 과정은 복잡하고 많은 연산량이 필요하기 때문에 Kernel Trick을 사용합니다.
  • Kernel Trick은 선형 분리가 불가능한 저차원 데이터를 고차원으로 보내 선형 분리를 하는 이론을 이용한 일종의 Trick 기법입니다.
  • Kernel Trick은 고차원 Mapping과 고차원에서의 내적 연산을 한 번에 할 수 있는 방법입니다.

대표적인 Kernel 함수

  • Linear : 선형 함수
  • Poly : 다항식 함수
  • RBF : 방사 기저 함수
  • Hyper-Tangent : 쌍곡선 탄젠트 함수

SVM의 대표적인 파라미터

  • C (float) : 얼마나 모델에 규제를 넣을지 결정하는 값 (값이 작을수록 모델에 규제가 높아진다. Hard or Soft 결정 파라미터)
  • degree (int) : Poly kernel 사용 시 차수를 결정하는 값
  • kernel (str) : kernel trick에 사용할 kernel 종류
  • random_state (int) : 내부적으로 사용되는 난수 값
  • class_weight (dict) : 학습 시 클래스의 비율에 맞춰 손실 값에 가중치 부여 (분류 모델에서만 쓰인다.)
  • gamma (float) : 모델이 생성하는 경계가 복잡해지는 정도 (값이 커질수록 데이터 포인터가 영향력을 행사하는 거리가 짧아져서 경계가 복잡해진다.)

Python을 통한 모델 적용

1. 분류 문제에서의 SVM (SVC)

  • 두 클래스 사이의 마진이 클수록 좋은 분류 모델이기 때문에 Soft Margin을 주로 사용합니다.
  • 기본 파라미터 설정으로 진행한 Support Vector Classification (SVC)
from sklearn.svm import SVC

# SVC 모델 선언 후 Fitting
svc = SVC()
svc.fit(x_train, y_train)

# Fitting된 모델로 x_valid를 통해 예측을 진행
# 0 or 1로된 레이블 예측을 할 때
y_pred = svc.predict(x_valid)

# 0 ~ 1 사이의 확률값 예측을 할 때
# svm은 많은 연산량이 필요하기 때문에 확률값을 구해주는 파라미터가 활성화되어있지 않습니다.
# 따라서 확률값을 구할 때는 모델 선언과정에서 probability=True를 파라미터값으로 설정해야 합니다.
y_pred_proba = svc.predict_proba(x_valid)

2. 회귀 문제에서의 SVM (SVR)

  • SVM을 회귀에 적용하는 방법은 마진 내부에 데이터가 최대한 많이 들어가도록 학습하는 것입니다.
  • 마진 밖에 있는 데이터들의 Error가 최소가 되도록 회귀선을 형성합니다.

  • 두 클래스 사이의 마진이 작을수록 데이터들을 대표할 수 있는 회귀선을 잘 만들 수 있기 때문에 Hard Margin을 주로 사용합니다.
  • 기본 파라미터 설정으로 진행한 Support Vector Regression (SVR)
from sklearn.svm import SVR

# SVR 모델 선언 후 Fitting
svr = SVR()
svr.fit(x_train, y_train)

# Fitting된 모델로 x_valid를 통해 예측을 진행
y_pred = svr.predict(x_valid)

y_pred 혹은 y_pred_proba를 통한 모델 성능 검증은 다른 포스팅에 정리하겠습니다.


SVM을 사용하기 전에는 반드시 데이터 스케일링 과정이 꼭 필요합니다.

  • SVM은 이상치에 민감하기 때문에 데이터 스케일링 과정이 꼭 필요합니다.
  • SVM을 사용할 때는 거의 Standard Scaling을 통해 스케일링을 진행합니다.
반응형
Comments