상세 컨텐츠

본문 제목

분류 - 서포트 벡터 머신(SVM)

인공지능/머신러닝

by 2^7 2025. 2. 20. 21:00

본문

서포트 벡터 머신(SVM)이란?

 서포트 벡터 머신(Support Vector Machine, SVM)은 지도 학습(Supervised Learning) 알고리즘 중 하나로, 주로 분류(Classification) 문제를 해결하는 데 사용됨. 데이터를 학습하여 가장 최적의 결정 경계(Decision Boundary) 를 찾고, 이를 기반으로 새로운 데이터가 어느 범주에 속하는지 예측하는 방식

1. SVM의 핵심 개념

SVM이 데이터를 분류하는 과정에서 가장 중요한 개념은 초평면(Hyperplane)서포트 벡터(Support Vector) 

  • 초평면(Hyperplane)
    • 데이터를 두 개의 클래스로 나누는 결정 경계
    • 2차원 공간에서는 선(line), 3차원에서는 평면(plane), 그리고 고차원에서는 초평면(hyperplane)이라고 함
  • 서포트 벡터(Support Vector)
    • 결정 경계를 형성하는 데 가장 중요한 역할을 하는 데이터 포인트들.
    • 이 서포트 벡터를 기준으로 초평면이 결정됨
  • 마진(Margin)
    • 서포트 벡터와 초평면 사이의 거리
    • SVM은 마진을 최대화하는 초평면을 찾는 것이 목표로 이를 최대 마진 분류기(Maximum Margin Classifier) 라고 함

2. SVM의 작동 원리

 1) 데이터를 분류할 수 있는 초평면을 찾음

  • 여러 개의 가능한 초평면 중에서 가장 마진이 넓은 초평면을 선택

  2) 마진을 최대화

  • 초평면과 서포트 벡터 사이의 거리를 최대한 넓히는 방향으로 학습

 3) 새로운 데이터 분류

  •  학습된 초평면을 기준으로 새로운 데이터가 어느 클래스로 분류될지 예측

3. 소프트 마진과 하드 마진

  • 하드 마진(Hard Margin):
    • 데이터가 완벽하게 나눠지는 경우, 즉, 초평면이 모든 데이터 포인트를 정확히 구분할 수 있을 때 적용됨.
    • 하지만 현실에서는 데이터가 완벽하게 분류되지 않는 경우가 많아 과적합(Overfitting) 문제가 발생할 수 있음
  • 소프트 마진(Soft Margin)
    •  일부 오분류를 허용하여 일반화 성능을 높이는 방식
    • 데이터가 일부 초평면을 넘어가더라도, 전체적인 분류 성능이 높아지도록 조정함

4. 커널 트릭(Kernel Trick)

 때때로 데이터가 선형적으로 분리되지 않는 경우가 있는데 이때 커널 함수(Kernel Function) 를 사용하여 저차원의 데이터를 고차원 공간으로 변환하면, 선형적으로 분류할 수 있음

◆ 대표적인 커널 함수:

  • 선형 커널(Linear Kernel): 데이터를 선형적으로 분류할 수 있을 때 사용
  • 다항식 커널(Polynomial Kernel): 비선형 관계를 학습할 때 사용
  • RBF(방사 기저 함수, Radial Basis Function) 커널: 비선형 데이터 분류에 가장 많이 사용되는 커널 중 하나

5. SVM의 장점과 단점

장점 단점
  • 고차원 데이터에서도 성능이 우수함
  • 과적합을 방지하는 최대 마진 개념 적용
  • 커널 트릭을 활용해 비선형 데이터도 효과적으로 분류 가능
  • 대량의 데이터에서는 학습 속도가 느릴 수 있음
  • 하이퍼파라미터(C, 커널 종류 등) 튜닝이 필요
  • 다중 클래스 분류에서는 직접적인 사용이 어려움 (일반적으로 One-vs-One, One-vs-All 기법 사용)

Python의 scikit-learn 라이브러리를 사용하여 간단한 SVM 예제를 구현

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

# 데이터 불러오기
iris = datasets.load_iris()
X = iris.data[:, :2]  # 꽃받침 길이, 너비만 사용 (2D 시각화 위해)
y = iris.target

# 학습/테스트 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# SVM 모델 학습
model = SVC(kernel='linear')  # 선형 커널 사용
model.fit(X_train, y_train)

# 예측 및 정확도 출력
accuracy = model.score(X_test, y_test)
print(f'테스트 데이터 정확도: {accuracy:.2f}')
728x90

관련글 더보기