분류 모델을 고를 때 SVM을 건너뛰는 경우가 많습니다. 로지스틱 회귀나 트리 계열은 직관적으로 이해가 되는데, SVM은 "마진을 최대화한다"는 말부터 낯설거든요. 그런데 이 마진이라는 개념을 한 번 제대로 잡고 나면, 왜 SVM이 특정 상황에서 여전히 유효한 선택인지 보이기 시작합니다. 🧮
오늘은 마진 최대화부터 소프트 마진, 커널 트릭, 실무 적용 기준까지 순서대로 정리해보겠습니다.
1. 배깅과 부스팅: 경계선 vs 마진

두 클래스를 나누는 경계선은 하나가 아닙니다. 주어진 데이터를 완벽하게 분리하는 선은 이론적으로 무한히 많습니다. 로지스틱 회귀는 그 중에서 확률적으로 가장 그럴듯한 경계선을 찾습니다. SVM은 다른 기준을 씁니다. 두 클래스 사이의 간격, 마진(Margin)이 가장 넓은 경계선을 찾습니다.
마진이 넓을수록 새로운 데이터가 들어왔을 때 더 안정적으로 분류할 수 있습니다. 경계선이 어느 쪽에도 치우치지 않기 때문입니다. 마진이 좁은 경계선은 훈련 데이터에는 잘 맞지만 조금만 다른 데이터가 들어오면 쉽게 틀립니다. 마진을 최대화한다는 건 일반화 성능을 높이겠다는 선택입니다.
경계선이 어디에 있는지보다, 경계선 주변에 얼마나 여유 공간이 있는지를 최적화하는 모델입니다.
2. 서포트 벡터
마진을 결정하는 건 전체 데이터가 아닙니다. 경계선과 가장 가까이 있는 데이터 포인트들만이 마진의 폭을 결정하는데, 이 포인트들을 서포트 벡터(Support Vector)라고 부릅니다. SVM이라는 이름이 여기서 나옵니다.
서포트 벡터가 아닌 포인트는 아무리 바꿔도 경계선이 움직이지 않습니다. 반대로 서포트 벡터 하나가 위치를 바꾸면 경계선 전체가 달라집니다. 모델이 전체 데이터가 아니라 경계에 있는 소수의 포인트로만 정의된다는 점이 다른 분류 모델과 구조적으로 다른 부분입니다.
2.1 서포트 벡터 수와 복잡도
학습 후 서포트 벡터가 몇 개인지 보면 모델 복잡도를 간접적으로 파악할 수 있습니다. 서포트 벡터가 많다는 건 경계 근처에 데이터가 많이 몰려 있다는 뜻이고, 두 클래스가 그만큼 깔끔하게 분리되지 않는다는 신호입니다. 전체 학습 데이터 대비 비율이 지나치게 높다면 커널이나 C 파라미터 조정을 고려해볼 시점입니다. sklearn에서는 model.n_support_로 클래스별 서포트 벡터 수를 확인합니다.
3. 하드 마진과 소프트 마진
현실 데이터는 완벽하게 두 클래스로 나뉘지 않습니다. 노이즈가 있거나 두 클래스가 일부 겹치는 경우가 훨씬 많습니다. 마진을 절대로 침범하지 않겠다고 고집하면 — 이걸 하드 마진(Hard Margin)이라고 합니다 — 경계선을 찾지 못하거나 극단적으로 좁은 마진이 만들어집니다. 완벽하게 선형 분리 가능한 데이터에서만 작동하는데, 현실에서 그런 데이터는 드뭅니다.
소프트 마진(Soft Margin)은 마진 침범을 허용하되 침범 정도에 패널티를 부과합니다. 슬랙 변수(Slack Variable) ξ가 각 포인트의 침범 정도를 나타내고, 이 합계가 손실함수에 반영됩니다.
3.1 C 파라미터
C가 크면 마진 침범에 강한 패널티를 부과해 경계선이 훈련 데이터를 빡빡하게 따라갑니다. 마진이 좁아지고 과적합 위험이 올라갑니다. C가 작으면 침범을 많이 허용해 마진이 넓어지지만 오분류가 일부 발생합니다. 데이터에 노이즈가 많다면 C를 줄이는 쪽이 일반화 성능에 유리합니다.
| 항목 | 하드 마진 | 소프트 마진 (C 큼) | 소프트 마진 (C 작음) |
|---|---|---|---|
| 마진 침범 | 불가 | 엄격히 제한 | 많이 허용 |
| 마진 폭 | 좁음 | 좁음 | 넓음 |
| 과적합 위험 | 높음 | 높음 | 낮음 |
| 노이즈 대응 | 취약 | 취약 | 유연 |
4. 커널 트릭
2차원에서 직선으로 분리할 수 없는 데이터가 있습니다. 두 클래스가 동심원처럼 배치된 경우가 대표적입니다. 이 데이터를 3차원으로 올리면 평면으로 분리할 수 있게 됩니다. 커널 트릭(Kernel Trick)은 이 아이디어를 실제 계산 비용 없이 구현하는 방법입니다.
데이터를 실제로 고차원으로 변환하면 계산량이 폭발적으로 늘어납니다. 커널 함수는 고차원으로 올리지 않고도, 고차원에서 계산한 것과 동일한 결과를 저차원의 내적(Dot Product) 연산만으로 얻어냅니다. 비선형 경계선을 합리적인 계산 비용으로 만들 수 있는 이유입니다.
4.1 RBF 커널과 감마(γ)
sklearn SVC의 기본 커널은 RBF(Radial Basis Function)입니다. 두 데이터 포인트 사이의 거리를 기반으로 유사도를 계산하는데, 거리가 가까울수록 유사도가 높고 멀수록 낮아집니다. 대부분의 비선형 경계를 유연하게 표현할 수 있어 기본값으로 채택됐습니다.
γ는 각 포인트의 영향 범위를 결정합니다. γ가 크면 영향 범위가 좁아져 경계선이 구불구불해지고 과적합 위험이 올라갑니다. γ가 작으면 경계선이 부드러워집니다. SVM 튜닝은 결국 C와 γ를 함께 조정하는 작업으로 귀결됩니다.
| 커널 | 특징 | 주요 상황 |
|---|---|---|
| Linear | 선형 경계만 표현 | 텍스트 분류, 고차원 희소 데이터 |
| RBF | 비선형 경계 유연하게 표현 | 일반적인 분류 문제, 기본값 |
| Polynomial | 다항식 경계 표현 | 이미지, 자연어 처리 |
| Sigmoid | 신경망과 유사한 동작 | 신경망 대체 실험용 |
5. 스케일링과 SVM
SVM은 피처 간 거리를 기반으로 마진을 계산합니다. 값의 범위가 크게 다른 피처가 섞여 있으면 범위가 큰 피처가 마진 계산을 사실상 혼자 지배하게 됩니다. 나이(0~100)와 연봉(0~10,000만)을 그대로 넣으면 연봉 피처 하나가 모델을 결정하는 상황이 됩니다. StandardScaler로 평균 0, 표준편차 1로 맞춰주는 과정이 SVM에서는 필수입니다. 트리 계열이 스케일을 전혀 신경 쓰지 않아도 되는 것과 대조적입니다.
6. 코드로 확인하기
from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
data.data, data.target, test_size=0.2, random_state=42
)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
svm_rbf = SVC(kernel='rbf', C=1.0, gamma='scale', random_state=42)
svm_rbf.fit(X_train_scaled, y_train)
svm_linear = SVC(kernel='linear', C=1.0, random_state=42)
svm_linear.fit(X_train_scaled, y_train)
print("=== RBF 커널 ===")
print(classification_report(y_test, svm_rbf.predict(X_test_scaled)))
print("=== Linear 커널 ===")
print(classification_report(y_test, svm_linear.predict(X_test_scaled)))
print(f"RBF 서포트 벡터 수: {svm_rbf.n_support_}")
print(f"Linear 서포트 벡터 수: {svm_linear.n_support_}")
7. SVM을 쓰는 상황
딥러닝과 부스팅이 대부분을 압도하는 지금도 SVM이 유효한 상황이 있습니다. 데이터가 적고 피처 수가 많은 환경입니다. 텍스트 분류가 대표적인데, 단어를 피처로 쓰면 피처 수가 수만 개를 넘습니다. 이 고차원 희소 데이터에서 Linear SVM은 여전히 좋은 베이스라인을 냅니다.
반면 데이터가 많아질수록 학습 시간이 급격히 늘어납니다. 복잡도가 샘플 수의 제곱에서 세제곱 사이로 증가하기 때문에 수십만 건 이상이라면 LightGBM이나 신경망이 현실적인 선택입니다.
| 상황 | 적합도 | 이유 |
|---|---|---|
| 소규모 + 고차원 피처 | ✅ 적합 | 마진 최대화가 과적합 억제에 효과적 |
| 텍스트 분류 (TF-IDF) | ✅ 적합 | 희소 고차원에서 Linear SVM 강점 |
| 대용량 데이터 (10만+ 건) | ❌ 비적합 | 학습 시간 샘플 수 제곱 이상 비례 |
| 확률값 필요한 분류 | △ 주의 | probability=True 옵션 필요, 속도 저하 |
정리
SVM을 처음 배울 때 마진이라는 개념 자체가 낯설었는데, 경계선을 긋는 문제가 아니라 두 클래스 사이의 여유 공간을 최대화하는 최적화 문제로 바꿔 생각하니 그제야 서포트 벡터만으로 모델이 정의되는 구조가 이해됐습니다.
C와 γ는 직접 값을 바꿔가며 결정 경계가 어떻게 달라지는지 시각화해보는 게 감을 잡는 가장 빠른 방법입니다. sklearn 공식 문서에 파라미터별 경계 변화 예제가 있으니 한 번 돌려보는 걸 권장합니다. 😊
'AI > ML' 카테고리의 다른 글
| [머신러닝] 회귀 모델 오차 지표 비교 (0) | 2026.05.29 |
|---|---|
| [머신러닝] 분류 모델 평가 완전 정리 (0) | 2026.05.28 |
| [머신러닝] XGBoost & LightGBM: 부스팅은 왜 순서가 중요한가 (0) | 2026.05.25 |
| [머신러닝] 랜덤 포레스트: 나무가 많아지면 왜 더 강해지는가 (0) | 2026.05.24 |
| [머신러닝] 결정 트리: 모델이 스스로 질문을 만드는 방법 (0) | 2026.05.06 |
HELLO WORLD
안녕하세요. 데이터로 말하는 분석가 모모입니다.
데이터를 구조화하고 분석하는 과정과 실무에 활용되는 도구 중심의 내용을 기록합니다.