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)**: min⁡w,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 도입, min⁡w,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) - ε-튜브 안의 오차를 무시, 벗어난 오차만 패널티 - 최적화: min⁡w,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의 전반적인 개념과 실습 예제를 정리했습니다. 추가적으로 궁금한 부분이 있으면 알려주세요!