HSEOM GeckoHSEOM
Instagram

흑섬 TECH 블로그 - 데이터 기반 브리딩 기술

레오파드게코 브리딩에 데이터 분석과 AI 기술을 접목합니다. Python, NumPy를 활용한 체중 관리, 성장 추이 분석, 환경 데이터 시각화 등 실무에서 직접 사용하는 기술을 일반인도 이해하기 쉽게 설명합니다.

주요 카테고리

AI 카테고리

AI와 머신러닝을 활용한 레오파드게코 브리딩 기술과 데이터 분석 방법을 공유합니다.

28개의 글이 있습니다.

[머신러닝 중급 2편] 서포트 벡터 머신(SVM) — 두 그룹 사이의 가장 넓은 길을 찾는 알고리즘

SVM을 처음 접했을 때 '경계선을 긋는다'는 설명만 봤는데, 그러면 로지스틱 회귀랑 뭐가 다른 건지 감이 안 왔습니다. 핵심은 경계선이 아니라 '도로 폭'이더라고요. 마진 최대화, 서포트 벡터, 커널 트릭까지 — 직접 그래프를 그려보면서 정리합니다.

카테고리: AI

작성일: 2026-03-07T12:00:00

예상 읽기 시간: 18

Back to Tech
AI·18min read·

[머신러닝 중급 2편] 서포트 벡터 머신(SVM) — 두 그룹 사이의 가장 넓은 길을 찾는 알고리즘

SVM을 처음 접했을 때 '경계선을 긋는다'는 설명만 봤는데, 그러면 로지스틱 회귀랑 뭐가 다른 건지 감이 안 왔습니다. 핵심은 경계선이 아니라 '도로 폭'이더라고요. 마진 최대화, 서포트 벡터, 커널 트릭까지 — 직접 그래프를 그려보면서 정리합니다.

시작하며 — 경계선이 아니라 '도로 폭'

SVM은 Support Vector Machine의 약자입니다. 직역하면 "서포트 벡터 머신"인데,
이름만 봐서는 뭔지 감이 안 오죠. 간단히 말하면 — 데이터를 분류하는 경계선을 가장 넓은 도로처럼 긋는 알고리즘입니다.
"서포트 벡터"는 그 도로 가장자리에 붙어있는 핵심 데이터 포인트를 말해요. 이 친구들이 경계를 결정합니다.

기초 편에서 로지스틱 회귀로 두 그룹을 분류하는 걸 다뤘었죠.
근데 SVM을 처음 접했을 때 의문이 들었습니다. "그것도 경계선 긋는 거잖아? 뭐가 다른 건데?"

차이점은 단순합니다. 로지스틱 회귀는 어디에 선을 긋든 분류만 되면 OK인데,
SVM은 양쪽에서 가장 멀리 떨어진 위치에 선을 긋습니다.
경계선이 아니라 "도로"를 만든다고 생각하면 돼요. 도로가 넓을수록 좋은 모델입니다.


마진 최대화 — SVM의 핵심 원리

SVM 마진 최대화 개념도 — 결정 경계, 마진, 서포트 벡터

위 그림을 보면 두 클래스(민트, 골드) 사이에 선이 하나 그어져 있고,
그 선 양쪽으로 점선이 있습니다. 이 점선 사이의 거리가 마진(Margin)이에요.

결정 경계 — 두 클래스를 나누는 선(초평면)
마진 — 결정 경계와 가장 가까운 데이터 포인트 사이의 거리
서포트 벡터 — 마진 경계 위에 놓인 데이터. 이 포인트들만으로 경계가 결정됨

재밌는 건, 서포트 벡터 몇 개만 있으면 전체 경계가 결정된다는 점입니다.
나머지 데이터는 없어도 결과가 똑같아요. 처음 이걸 알았을 때 좀 신기했습니다.


커널 트릭 — 직선으로 안 되면 차원을 올린다

커널 트릭 — 2D에서 분리 불가 데이터를 고차원으로 변환하여 분리

현실의 데이터는 직선 하나로 깔끔하게 분리되는 경우가 별로 없습니다.
위 그림처럼 원형으로 섞여 있으면 어떤 직선을 그어도 분리가 안 돼요.

이때 쓰는 게 커널 트릭(Kernel Trick)입니다.
데이터를 더 높은 차원으로 보내면 — 갑자기 분리가 됩니다.
비유하면, 2D 종이 위에서 안 되던 분류가 3D 공간에서는 칼로 자르듯 잘리는 거예요.

실제로 고차원으로 데이터를 변환하면 계산 비용이 폭발하는데,
커널 함수를 쓰면 변환 없이 고차원에서의 내적만 계산합니다.
그래서 "트릭"이라고 부르는 거예요. 실제로 차원을 올리지는 않습니다.

Linear SVM vs Kernel SVM — 결정 경계 비교

Linear SVM vs RBF Kernel SVM 결정 경계 비교

같은 데이터에 Linear SVM과 RBF Kernel SVM을 적용한 결과입니다.
Linear는 직선이라 복잡한 분포를 못 잡고, RBF는 곡선으로 유연하게 분리합니다.

Linear — 데이터가 선형적으로 분리 가능할 때. 빠르고 단순함
RBF (Radial Basis Function) — 비선형 분포에 적합. 대부분의 경우 여기서 시작
Polynomial — 다항식 커널. RBF보다 제어가 쉽지만 유연성은 떨어짐

하이퍼파라미터 — C와 gamma

SVM에서 가장 중요한 파라미터 두 개입니다.
이것들이 1편에서 다뤘던 과적합과 직접 연결돼요.

C — 규제 강도

C가 크면 마진을 좁히더라도 분류 오류를 최소화하려고 합니다 → 과적합 위험
C가 작으면 마진을 넓게 유지하되 일부 오류를 허용합니다 → 과소적합 위험
1편에서 배운 편향-분산 트레이드오프가 여기서도 그대로 적용됩니다.

gamma — RBF 커널 폭

gamma가 크면 데이터 포인트 하나하나의 영향 범위가 좁아집니다 → 복잡한 경계 → 과적합
gamma가 작으면 영향 범위가 넓어집니다 → 부드러운 경계 → 과소적합

처음에는 C=1, gamma='scale'로 시작하고,
GridSearchCV로 최적값을 찾는 게 일반적인 접근입니다.

sklearn으로 구현하기

from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler

# SVM은 스케일링에 민감하므로 반드시 정규화
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled  = scaler.transform(X_test)

# 기본 RBF 커널 SVM
svm = SVC(kernel='rbf', C=1.0, gamma='scale')
svm.fit(X_train_scaled, y_train)

print(f"Train: {svm.score(X_train_scaled, y_train):.3f}")
print(f"Test:  {svm.score(X_test_scaled, y_test):.3f}")
print(f"서포트 벡터 수: {svm.n_support_}")

직접 주피터에서 Linear과 RBF 커널을 비교해봤습니다. make_moons 데이터로 돌렸는데, 차이가 바로 보여요.

주피터 실행 결과 — Linear vs RBF 커널 SVM 결정 경계 비교
Linear kernel은 직선이라 반달 모양 데이터를 제대로 분리 못 합니다 (정확도 83%).
RBF kernel로 바꾸니까 곡선으로 깔끔하게 분리되면서 정확도가 96%까지 올라가요.
검은 테두리가 있는 점들이 서포트 벡터인데, 경계선 근처에 몰려 있는 게 보이죠?
커널 하나 바꿨을 뿐인데 결과가 이렇게 달라지는 걸 보면, 커널 선택이 정말 중요하다는 걸 체감했습니다.

주의할 점 하나 — SVM은 스케일링에 민감합니다.
StandardScaler를 빼먹으면 성능이 확 떨어지더라고요. 처음에 이거 모르고 한참 헤맸습니다.

# 최적 C, gamma 찾기
param_grid = {
    'C': [0.1, 1, 10, 100],
    'gamma': ['scale', 'auto', 0.01, 0.1]
}

grid = GridSearchCV(SVC(kernel='rbf'), param_grid, cv=5)
grid.fit(X_train_scaled, y_train)

print(f"Best params: {grid.best_params_}")
print(f"Best score:  {grid.best_score_:.3f}")

정리

SVM은 처음 접하면 수식이 무서워 보이지만,
"양쪽에서 최대한 멀리 떨어진 경계선을 찾는다"는 핵심만 잡으면 나머지는 따라옵니다.

1. 마진 최대화 — 경계선이 아니라 "도로 폭"을 최대로 만든다
2. 커널 트릭 — 직선으로 안 되면 고차원에서 분리한다. 실제로 차원을 올리지는 않음
3. C, gamma — 과적합·과소적합을 조절하는 핵심 파라미터. 스케일링 필수

다음 편(3편)에서는 정규화(Regularization)를 다룹니다.
1편에서 과적합 해결책 중 하나로 잠깐 언급했던 L1, L2 — 이게 실제로 어떻게 동작하는지 코드와 함께 정리할 예정입니다.

#SVM#서포트벡터머신#커널트릭#마진#sklearn#python