데이터분석데브코스 8/이론

8 - 12. SVM(Support Vector Machine)

DataJ 2025. 5. 28. 10:52

✅ [1부] 선형 SVM 개념과 원리

1. 왜 SVM인가?

  • 두 클래스(예: 원과 삼각형)를 분리하는 "결정 경계"를 찾는 문제.
  • 단순히 나누는 것뿐 아니라 일반화 성능이 좋은 경계를 원함.
    • → **마진(Margin)**이 넓을수록 일반화 성능 ↑

2. 마진과 서포트 벡터(Support Vector)

  • 마진: 결정 경계와 가장 가까운 데이터 포인트 사이의 거리
  • 서포트 벡터: 이 마진을 형성하는 가장자리의 샘플들
  • SVM은 이 마진을 최대화하는 직선(혹은 초평면)을 찾음
  • → 이를 최대 마진 초평면이라 부름

수식:

결정 경계: wᵀx + b = 0

서포트 벡터 경계: wᵀx + b = ±1

마진 크기: 2 / ||w||


3. 최적화 문제 (하드 마진 SVM)

목적:

  • 마진을 최대화 .0를 최소화)
  • 모든 데이터가 마진 안쪽에 있게 함:
  • yᵢ(wᵀxᵢ + b) ≥ 1

최적화 문제식:

minimize (1/2)||w||²
subject to yᵢ(wᵀxᵢ + b) ≥ 1 for all i

✏️ 이 문제는 라그랑주 승수법(L(x,y,λ)=f(x,y)+λ⋅g(x) 과 쌍대 문제를 통해 풀 수 있음


4. 소프트 마진 SVM (일반화 버전)

현실에서는 모든 데이터가 완벽히 나뉘지 않음 → 약간의 오분류 허용

  • 슬랙 변수 ξᵢ 도입 (마진 위반 정도)
  • 목적: 마진은 넓히되, 위반은 최소화

최적화 문제식:

minimize (1/2)||w||² + **C** ∑ ξᵢ
subject to yᵢ(wᵀxᵢ + b) ≥ 1 − ξᵢ, ξᵢ ≥ 0
  • C: 마진 위반 패널티 → 클수록 과적합 위험 증가

예시 코드 (Scikit-learn):

from sklearn.svm import SVC

model = SVC(kernel='linear', **C=1.0**)
model.fit(X_train, y_train)

5. 적용 분야

  • 이진 분류 문제 (예: 스팸 메일 vs 정상 메일, 고양이 vs 개)
  • 텍스트 분류, 얼굴 인식, 의학 진단 등 다양한 분야에서 일반화 성능이 우수

✅ [2부] 비선형 SVM과 커널 트릭

1. 선형 SVM의 한계

  • 현실 데이터는 **직선(초평면)**으로 분리할 수 없는 경우가 많음
  • 예: 원형, 곡선 형태로 얽힌 데이터

→ 단순한 선형 모델로는 분류가 불가능


2. 차원을 증가시키면 분류가 쉬워진다?

  • 데이터를 고차원 공간으로 매핑(변형)하면,
    • 원래는 뒤엉켜 있던 데이터가
    • 선형적으로 분리 가능한 상태가 되기도 함
  • 이 변환을 수행하는 함수를 **매핑 함수 φ(x)**라고 함

예시:

  • 2D에서 원형 분포 데이터를 3D로 올리면 평면으로 나뉠 수 있음

3. 문제점: 고차원은 계산 비용이 크다

  • 차원을 올릴수록:
    • 계산량 폭증
    • 모델 복잡도 ↑
    • 과적합 위험도 증가

4. 해결책: 커널 트릭 (Kernel Trick)

  • 아이디어: 실제로 고차원 변환을 하지 않음!
  • 대신 고차원에서의 내적 연산 결과만 계산

핵심 식:

K(x, x′) = φ(x)ᵀ φ(x′)
  • φ(x)는 고차원 벡터지만 실제로 구하지 않음
  • 대신 **커널 함수 K(x, x′)**로 계산

→ 고차원 분류의 성능은 유지하면서도 계산 효율 ↑


5. 주요 커널 함수 종류

커널 종류 수식 특징

다항 커널 (Polynomial) K(x,x′)=(γx⊤x′+r)dK(x, x') = (\gamma x^\top x' + r)^dK(x,x′)=(γx⊤x′+r)d 차수 설정으로 다양한 분포 대응, 과적합 위험
RBF 커널 (가우시안) K(x,x′)=exp⁡(−γ∥x−x′∥2)K(x, x') = \exp(-\gamma |x - x'|^2)K(x,x′)=exp(−γ∥x−x′∥2) 가장 범용적, 기본 선택
시그모이드 커널 K(x,x′)=tanh⁡(γx⊤x′+r)K(x, x') = \tanh(\gamma x^\top x' + r)K(x,x′)=tanh(γx⊤x′+r) 신경망과 유사한 분류 방식, 잘 안 씀

6. 비선형 SVM의 최적화 문제

  • 소프트 마진 SVM과 구조는 유사
  • 단, 고차원 φ(x)에서의 내적이 커널 함수로 대체됨
minimize (1/2)||w||² + C ∑ ξᵢ
subject to yᵢ(wᵀφ(xᵢ) + b) ≥ 1 − ξᵢ, ξᵢ ≥ 0

예시 코드 (RBF 커널 사용):

from sklearn.svm import SVC

model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train, y_train)
  • kernel='rbf': 커널 트릭 적용
  • C: 마진 위반 허용 정도
  • gamma: 커널의 폭 (작을수록 부드럽게, 클수록 민감하게)

📌 실제 적용 예

  • 손글씨 숫자 분류 (MNIST)
  • 의료 영상 진단 (MRI 병변 분류)
  • 이미지 내 객체 분류 (배경 vs 사물)

✅ [3부] SVR: Support Vector Regression

1. SVR이란?

  • SVM을 회귀 문제에 적용한 모델
  • 분류가 아니라 연속적인 값을 예측
  • 기본 원리:
    • 가능한 많은 데이터 포인트를 포함하는 **마진 영역 (±ε)**을 설정하고,
    • 그 안에 **회귀선(또는 초평면)**을 위치시키는 것이 목적

2. 핵심 아이디어

  • 회귀선에서 ε(엡실론) 거리 이내 오차는 허용
  • 이 허용 범위를 ε-insensitive zone 또는 마진 튜브라고 부름

마진 구역 종류:

  • 예측이 +ε 또는 ε 안쪽에 있으면 OK (슬랙 변수 없음)
  • 그 외에는 슬랙 변수 ξ, ξ*를 부여하여 오차 패널티 부여

→ 즉, "큰 오차만 패널티로 계산"하는 방식


3. 최적화 문제 (SVR)

minimize
(1/2)||w||² + C ∑ (ξᵢ + ξᵢ*)

subject to
    yᵢ − (wᵀφ(xᵢ) + b) ≤ ε + ξᵢ
    (wᵀφ(xᵢ) + b) − yᵢ ≤ ε + ξᵢ*
    ξᵢ, ξᵢ* ≥ 
  • C: 슬랙 변수에 대한 페널티 (오차에 얼마나 민감할지)
  • ε: 허용 오차 범위 (튜브 폭)
  • φ(x): 커널 트릭으로 고차원 매핑된 특징 공간

4. 시각적 이해

  • 마진 튜브 내에서는 오차로 간주하지 않음
  • 마진을 벗어난 샘플만 슬랙 변수로 처리
               +ε
   -------------
        |
   ────────  ← 회귀선
        |
   -------------
               −ε

5. 예시 코드 (Scikit-learn):

from sklearn.svm import SVR

model = SVR(kernel='rbf', C=1.0, epsilon=0.2)
model.fit(X_train, y_train)
predictions = model.predict(X_test)
  • kernel: rbf, poly, linear 등 커널 선택 가능
  • C: 얼마나 오차를 허용할지 조절
  • epsilon: 예측이 얼마나 벗어나야 패널티를 줄 것인지 설정

6. 활용 사례

  • 주택 가격 예측
  • 주식 시장 예측
  • 기온/습도 등의 환경 변수 예측
  • 비선형 회귀 문제에 특화된 방법

📌 전체 요약 정리

파트 내용 목적 키워드

선형 SVM 데이터를 마진 기준으로 선형 분리 최대 마진 초평면 wᵀx + b = 0, Support Vector
소프트 마진 SVM 일부 오분류 허용 일반화 성능 향상 Slack Variable ξ, C
비선형 SVM 선형 분리 불가 시 커널 사용 고차원 내적 계산 커널 트릭, φ(x), RBF
SVR 회귀 문제 적용 마진 내 예측 허용 ε, ξ, ξ*, C