Here’s a structured overview of Support Vector Machines (SVMs), covering the core concepts, formulations, extensions, and a simple scikit-learn example.
---
## 1. 기본 개념
- **목적**: 두 클래스(또는 다중 클래스)를 최대한 구분하는 결정 경계(decision boundary)를 찾는 것
- **핵심 아이디어**: 마진(margin)을 최대화하는 초평면(hyperplane)
- 마진: 초평면과 가장 가까운 데이터 포인트(“support vectors”) 사이의 거리
- 최대 마진을 갖는 초평면은 일반화 성능이 좋다고 여겨짐
---
## 2. 선형 SVM (Linear SVM)
- **초평면 방정식**:
w⊤x+b=0 w^\top x + b = 0
여기서 ww는 가중치 벡터, bb는 편향(bias)
- **마진 크기**:
margin=2∥w∥ \text{margin} = \frac{2}{\|w\|}
- **최적화 문제 (hard-margin)**:
minw,b 12∥w∥2s.t. yi(w⊤xi+b)≥1,∀i\begin{aligned} &\min_{w,b} \;\; \frac{1}{2}\|w\|^2 \\ &\text{s.t.} \;\; y_i(w^\top x_i + b) \ge 1,\quad \forall i \end{aligned}
- **soft-margin (불완전한 분리 허용)**:
슬랙 변수 ξi≥0\xi_i \ge 0 도입,
minw,b,ξ 12∥w∥2+C∑iξis.t. yi(w⊤xi+b)≥1−ξi,ξi≥0\begin{aligned} &\min_{w,b,\xi} \;\; \frac{1}{2}\|w\|^2 + C\sum_i \xi_i \\ &\text{s.t.} \;\; y_i(w^\top x_i + b) \ge 1 - \xi_i,\quad \xi_i \ge 0 \end{aligned}
- CC: 오류 허용 정도를 조절하는 정규화 파라미터
---
## 3. 커널 트릭 (Kernel Trick)
- 비선형 결정 경계를 구현하기 위해, 입력 xx를 고차원 특징 공간 ϕ(x)\phi(x)으로 매핑
- 직접 매핑하지 않고 커널 함수 K(xi,xj)=ϕ(xi)⊤ϕ(xj)K(x_i, x_j) = \phi(x_i)^\top \phi(x_j) 사용
- **주요 커널**
- 선형: K(x,z)=x⊤zK(x,z) = x^\top z
- 다항식: K(x,z)=(γ x⊤z+r)dK(x,z) = (\gamma\,x^\top z + r)^d
- RBF (Gaussian): K(x,z)=exp(−γ∥x−z∥2)K(x,z) = \exp(-\gamma\|x - z\|^2)
- 시그모이드: K(x,z)=tanh(γ x⊤z+r)K(x,z) = \tanh(\gamma\,x^\top z + r)
---
## 4. 다중 클래스 분류
- **One-v-Rest (OvR)**: 클래스마다 이진 SVM 훈련 → 가장 점수 높은 클래스 선택
- **One-v-One (OvO)**: 클래스 쌍마다 SVM 훈련 → 다수결 투표 방식
---
## 5. 회귀 (Support Vector Regression, SVR)
- ε-튜브 안의 오차를 무시, 벗어난 오차만 패널티
- 최적화:
minw,b,ξ,ξ∗ 12∥w∥2+C∑i(ξi+ξi∗)s.t. {yi−(w⊤xi+b)≤ε+ξi(w⊤xi+b)−yi≤ε+ξi∗ξi,ξi∗≥0\begin{aligned} &\min_{w,b,\xi,\xi^*} \;\; \frac{1}{2}\|w\|^2 + C\sum_i(\xi_i + \xi_i^*) \\ &\text{s.t.}\; \begin{cases} y_i - (w^\top x_i + b) \le \varepsilon + \xi_i \\ (w^\top x_i + b) - y_i \le \varepsilon + \xi_i^* \\ \xi_i, \xi_i^* \ge 0 \end{cases} \end{aligned}
---
## 6. 장단점 비교
|장점|단점|
|---|---|
|• 마진 최대화로 일반화 성능 우수• 커널로 복잡한 경계 모델링 가능|• 대용량 데이터에 비해 느림• 파라미터(C, 커널 하이퍼파라미터) 튜닝 필요• 확률적 출력을 직접 제공하지 않음 (별도 방법 필요)|
---
## 7. 간단한 Python (scikit-learn) 예제
```python
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import classification_report, accuracy_score
# 1. 데이터 로드
X, y = datasets.load_iris(return_X_y=True)
# 클래스 0, 1만 사용하여 이진 분류 실습
X, y = X[y != 2], y[y != 2]
# 2. 학습/테스트 분할
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42)
# 3. SVM 모델 생성 (RBF 커널)
model = SVC(kernel='rbf', C=1.0, gamma='scale')
# 4. 훈련
model.fit(X_train, y_train)
# 5. 예측 및 평가
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
```
- `kernel` 옵션을 `'linear'`, `'poly'`, `'rbf'`, `'sigmoid'` 등으로 바꿔보며 성능 차이를 비교해 볼 수 있습니다.
- `C`와 `gamma`는 `GridSearchCV` 등을 이용해 최적화하세요.
---
## 8. 팁
1. **스케일링**: SVM은 특징 스케일에 민감하므로 `StandardScaler` 등으로 전처리 필수
2. **커널 선택**: 데이터 분포에 따라 적절한 커널을 선택하고, `gamma`나 `degree` 등 하이퍼파라미터를 조정
3. **데이터 크기**: 샘플 수가 많으면 학습 시간이 급격히 증가. 근사 기법(예: 샘플 서브셋, 라이브러리 liblinear 사용) 고려
이상으로 SVM의 전반적인 개념과 실습 예제를 정리했습니다. 추가적으로 궁금한 부분이 있으면 알려주세요!