데이터분석데브코스 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 |