SVM(Support Vector Machine) 정리
선형 분류기, 커널 함수, 마진, 하드마진·소프트마진까지
SVM(Support Vector Machine)은 분류 문제에서 매우 강력한 선형 분류기이자, 비선형 분류까지 확장 가능한 알고리즘입니다.
핵심 아이디어는 단순합니다. 주어진 데이터들을 가장 잘 나누는 결정 경계(decision boundary)를 찾되, 단순히 나누는 것만이 아니라 마진(margin)을 최대화하는 경계를 찾는 것입니다.
즉, SVM은 “데이터를 나눌 수 있는 선”을 찾는 것이 아니라,
“가장 안전하게 데이터를 나누는 선”을 찾는 모델입니다.
⸻
먼저 가장 단순한 상황부터 보겠습니다.
어떤 데이터가 2차원 공간에 있다고 하면, 두 클래스를 직선 하나로 나눌 수 있는 경우가 있습니다. 이런 경우를 선형적으로 분리(linearly separable) 가능하다고 합니다.
이때 SVM은 다음과 같은 직선을 찾습니다.
w^T x + b = 0
여기서
• x: 입력 특징 벡터
• w: 가중치 벡터
• b: 절편
• w^T x + b = 0: 결정 경계
이 식의 부호에 따라 클래스가 나뉩니다.
w^T x + b > 0 \Rightarrow +1
w^T x + b < 0 \Rightarrow -1
즉, SVM은 입력 데이터를 두 클래스로 분리하는 선형 분류기입니다.
⸻
SVM의 진짜 핵심은 단순히 분리 가능한 선을 찾는 것이 아니라, 마진이 최대가 되는 경계를 찾는 것입니다.
마진이란, 결정 경계와 가장 가까운 데이터 포인트들 사이의 거리입니다.
이 가장 가까운 점들을 서포트 벡터(support vector)라고 부릅니다.
SVM은 이 서포트 벡터들에 의해 결정됩니다.
즉, 모든 점이 아니라 경계에 가장 가까운 몇 개의 점이 모델을 결정합니다.
마진이 큰 경계는 일반적으로 다음 장점이 있습니다.
• 데이터의 작은 변동에 덜 민감함
• 과적합을 줄일 수 있음
• 일반화 성능이 좋아질 가능성이 큼
직관적으로 보면, 두 클래스 사이를 아주 좁게 가르는 것보다, 넓은 공간을 두고 분리하는 것이 더 안정적입니다.
⸻
데이터가 완전히 선형적으로 분리 가능할 때 사용할 수 있는 방식이 하드마진 SVM입니다.
하드마진은 말 그대로 “딱 잘라서” 분리합니다.
즉, 모든 샘플이 반드시 올바르게 분류되어야 합니다.
수학적으로는 다음 조건을 만족해야 합니다.
y_i (w^T x_i + b) \ge 1
여기서
• y_i \in {-1, +1}
• x_i: i번째 데이터
• 모든 데이터가 마진 바깥 또는 경계 위에 있어야 함
이때 목적함수는 마진을 최대화하는 것과 같고, 일반적으로 아래와 같이 표현됩니다.
\min_{w,b} \frac{1}{2} |w|^2
제약조건:
y_i (w^T x_i + b) \ge 1
하지만 현실 데이터는 완벽하게 분리되지 않는 경우가 많습니다.
노이즈나 이상치가 존재하면 하드마진은 너무 엄격해서 잘 작동하지 않습니다.
⸻
현실에서는 클래스가 완벽하게 분리되지 않는 경우가 훨씬 많습니다.
이때 사용하는 것이 소프트마진 SVM입니다.
소프트마진은 일부 데이터가 마진을 침범하거나 심지어 잘못 분류되는 것도 허용합니다.
이 허용 정도를 조절하는 것이 오차 허용(error tolerance) 개념입니다.
이를 위해 슬랙 변수(slack variable) \xi_i를 도입합니다.
y_i (w^T x_i + b) \ge 1 - \xi_i
여기서
• \xi_i = 0: 마진 바깥에서 올바르게 분류
• 0 < \xi_i \le 1: 마진은 침범했지만 분류는 맞음
• \xi_i > 1: 아예 오분류
목적함수는 다음과 같이 바뀝니다.
\min{w,b,\xi} \frac{1}{2} |w|^2 + C \sum{i=1}^{n} \xi_i
여기서 C는 오차에 대한 패널티 강도입니다.
• C가 크면: 오분류를 강하게 벌줌 → 하드마진에 가까워짐
• C가 작으면: 오차를 더 허용함 → 마진을 넓게 가져가려 함
즉, 소프트마진은 오차 허용과 마진 최대화 사이의 균형을 잡는 방식입니다.
⸻
앞서 말한 선형 분류기는 데이터가 직선 하나로 나뉠 때만 잘 작동합니다.
그런데 실제 데이터는 훨씬 복잡합니다.
예를 들어, 원형 구조나 나선형 구조처럼 직선으로는 도저히 나눌 수 없는 경우가 있습니다.
이런 문제를 비선형 분류 문제라고 합니다.
이럴 때 SVM은 커널 함수를 사용합니다.
⸻
커널 함수는 원래 낮은 차원의 데이터를 고차원 특징 공간(feature space)으로 매핑한 것과 같은 효과를 주는 함수입니다.
핵심은 이것입니다.
• 원래 공간에서는 선형적으로 분리되지 않음
• 하지만 고차원으로 올리면 선형적으로 분리 가능해짐
즉, 비선형 문제를 선형 문제처럼 바꾸는 것입니다.
이 과정을 수식으로 쓰면 다음과 같은 아이디어입니다.
\phi(x)
여기서 \phi(x)는 입력 x를 고차원 공간으로 보내는 매핑입니다.
그런데 실제로 \phi(x)를 직접 계산하면 차원이 너무 커질 수 있습니다.
그래서 SVM은 커널 함수를 이용해, 고차원으로 직접 올리지 않고도 내적을 계산합니다.
K(x_i, x_j) = \phi(x_i)^T \phi(x_j)
이게 바로 커널 트릭(kernel trick)입니다.
즉,
“고차원 특징 공간으로 매핑한 뒤 선형 분리하는 것처럼 보이게 만드는 기법”입니다.
⸻
커널 트릭의 핵심은 계산 효율입니다.
고차원으로 실제 변환하면 계산량이 폭증할 수 있습니다.
하지만 커널 함수만 알면, 굳이 \phi(x)를 직접 계산하지 않아도 됩니다.
즉,
• 직접 고차원 변환: 비싸고 느림
• 커널 트릭: 내적만 계산해서 효율적으로 처리
이 때문에 SVM은 비선형 문제에서도 강력합니다.
⸻
1) 다항식 커널(Polynomial Kernel)
다항식 커널은 특징들 간의 상호작용을 반영할 수 있는 커널입니다.
K(x, z) = (\gamma x^T z + r)^d
여기서
• \gamma: 스케일 파라미터
• r: 상수항
• d: 다항식 차수
다항식 커널은
“특성의 조합이 중요한 문제”에서 유용합니다.
예를 들어
x_1, x_2의 상호작용 항이 중요한 경우, 단순 선형보다 더 잘 분리할 수 있습니다.
⸻
2) RBF 커널(Radial Basis Function Kernel)
RBF는 SVM에서 가장 널리 쓰이는 비선형 커널 중 하나입니다.
K(x, z) = \exp(-\gamma |x-z|^2)
이 커널은 두 점이 가까우면 값이 크고, 멀면 값이 작습니다.
즉, 데이터 주변의 국소적인 구조를 잘 반영합니다.
RBF의 특징:
• 복잡한 비선형 결정 경계를 만들 수 있음
• 실제 데이터에 적용하기 쉬움
• 다항식 커널보다 일반적으로 더 많이 사용됨
다만 \gamma 값을 너무 크게 잡으면 너무 복잡한 경계가 생기고, 너무 작게 잡으면 지나치게 단순해집니다.
⸻
여기서 중요한 표현이 있습니다.
비선형 커널을 쓰는 이유는,
원래 공간에서는 선형적으로 분리되지 않지만,
고차원 특징 공간으로 가면 선형적으로 분리 가능해지는 경우가 많기 때문입니다.
즉, 커널은 데이터 자체를 “억지로” 직선으로 나누는 것이 아닙니다.
대신, 보이지 않는 고차원 공간에서 선형 분리를 가능하게 하는 장치입니다.
이 때문에 SVM은 다음과 같이 말할 수 있습니다.
• 원래 공간: 비선형 분류 문제
• 고차원 공간: 선형 분리 가능
• 커널 트릭: 고차원 공간을 직접 계산하지 않고도 사용 가능
⸻
SVM의 최종 결정 함수는 다음처럼 표현됩니다.
f(x) = \text{sign}\left(\sum_{i=1}^{n} \alpha_i y_i K(x_i, x) + b\right)
여기서
• \alpha_i: 각 서포트 벡터의 가중치
• y_i: 레이블
• K(x_i, x): 커널 함수
• b: 절편
이 식에서 중요한 점은, 실제로 모든 데이터가 아니라 서포트 벡터들만 영향을 준다는 것입니다.
즉, SVM의 결정 경계는 서포트 벡터에 의해 만들어집니다.
⸻
하드마진
• 오차 허용 없음
• 모든 데이터가 완전히 분리되어야 함
• 이상치에 매우 취약
• 데이터가 깔끔할 때만 적합
소프트마진
• 일부 오차 허용
• 마진 침범 가능
• 현실 데이터에 적합
• C로 오차와 마진의 균형 조절 가능
실무에서는 대부분 소프트마진을 사용합니다.
왜냐하면 현실 데이터는 노이즈가 있기 때문입니다.
⸻
아래는 scikit-learn으로 SVM을 사용하는 예시입니다.
1) 선형 SVM
from sklearn.svm import SVC
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
X, y = make_blobs(n_samples=300, centers=2, random_state=42, cluster_std=1.5)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = SVC(kernel='linear', C=1.0)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
⸻
2) RBF 커널 SVM
from sklearn.svm import SVC
from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
X, y = make_circles(n_samples=400, factor=0.4, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
⸻
3) 다항식 커널 SVM
from sklearn.svm import SVC
model = SVC(kernel='poly', degree=3, C=1.0, gamma='scale')
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
⸻
SVM을 쓸 때 특히 중요한 것은 다음입니다.
C
• 오차 허용 정도를 결정
• 크면: 오분류를 싫어함
• 작으면: 마진을 넓게 가져감
gamma
• RBF 커널에서 중요
• 크면: 각 점 주변만 강하게 반영 → 복잡한 경계
• 작으면: 넓게 퍼져서 단순한 경계
degree
• 다항식 커널 차수
• 높을수록 더 복잡한 결정 경계
⸻
SVM은 데이터를 분리하는 결정 경계를 찾되,
단순히 나누는 것이 아니라 마진을 최대화하고,
필요하면 소프트마진으로 오차를 허용하며,
비선형 문제가 있으면 커널 함수와 커널 트릭을 통해
고차원 특징 공간에서 선형적으로 분리되도록 만드는 분류기입니다.
⸻
SVM은 선형 분류기의 해석 가능성과 비선형 분류의 확장성을 동시에 갖춘 강력한 알고리즘이다.
하드마진과 소프트마진을 통해 오차 허용 수준을 조절할 수 있고, 커널 함수와 커널 트릭을 활용하면 비선형 데이터도 고차원 특징 공간으로 매핑해 선형적으로 분리할 수 있다.
특히 RBF 커널과 다항식 커널은 실무에서 자주 사용되며, 데이터의 구조에 따라 적절한 커널과 하이퍼파라미터를 선택하는 것이 성능을 좌우한다.