각 머신러닝 알고리즘은 데이터를 바라보는 시각이 다릅니다. KNN은 "누구와 비슷한가"에 주목하고, 결정 트리는 조건을 단계적으로 따지며, 랜덤 포레스트는 여러 트리의 투표 결과를 따르고, GBDT는 이전 모델의 오차를 수정해 나갑니다.
SVM(Support Vector Machine)은 이들과 확연히 다른 접근 방식을 취합니다. SVM은 다수결이나 분기 구조에 크게 신경 쓰지 않습니다. 대신 두 클래스를 분리하는 단순한 경계선이 아니라, 가장 안정적이고 확실한 결정 경계를 찾는 것에 집중합니다.
SVM이라는 용어는 처음 접하면 다소 낯설게 느껴질 수 있지만, 그 기본 아이디어는 생각보다 직관적입니다.
1. 선 그리기 문제: 왜 단순한 분류선으로 충분하지 않은가?
2차원 데이터 포인트가 있다고 가정해 봅시다. 각 포인트는 학생을 나타내며, x축은 일일 학습 시간, y축은 과제 제출률입니다. 일부 학생은 시험에 합격하고(클래스 1), 일부는 불합격했습니다(클래스 0).
데이터를 평면에 표시하면, 합격한 학생은 주로 오른쪽 상단에, 불합격한 학생은 왼쪽 하단에 모여 있는 패턴을 볼 수 있습니다. 이때 자연스럽게 떠오르는 생각은 "이 두 그룹을 구분하는 선을 하나 그을 수 있지 않을까?"입니다.
물론 가능합니다. 데이터가 어느 정도 규칙적이라면, 두 클래스를 완벽하게 나눌 수 있는 선은 여러 개 존재할 수 있습니다. 여기서 핵심 질문이 등장합니다.
여러 개의 분류선 중에서 어떤 것을 선택해야 할까?
이것이 SVM이 집중하는 본질적인 문제입니다. SVM의 답은 "아무 선이나 고르자"가 아닙니다. 양쪽 클래스의 샘플로부터 가능한 한 멀리 떨어진 선을 선택하는 것입니다. 즉, 마진(margin)이 가장 큰 결정 경계를 찾는 것이 SVM의 목표입니다.
2. 마진의 중요성: 왜 '그냥 분류'보다 '안정적인 분류'가 중요한가?
단순히 두 클래스를 분리하는 선을 찾는 것만으로는 충분하지 않습니다. 어떤 선은 한쪽 클래스의 샘플에 매우 가깝게 위치할 수 있습니다. 이러한 경계선은 새로운 데이터 포인트가 조금만 추가되어도 쉽게 오분류를 일으킬 위험이 있습니다.
SVM은 이러한 '간신히' 분류하는 방식을 선호하지 않습니다. SVM이 추구하는 것은 더 안정적인 분류 방식입니다.
- 양쪽 샘플에 너무 가까운 선은 분류는 성공했지만, 불안정합니다.
- 양쪽 샘플 사이에 충분한 여유 공간(마진)을 확보한 선은 훨씬 안정적이고 일반화 성능이 뛰어납니다.
SVM의 핵심 목표는 마진을 최대화하는 결정 초평면(Optimal Separating Hyperplane)을 찾는 것입니다. '초평면'이라는 용어는 다소 어렵게 들릴 수 있지만, 2차원에서는 직선, 3차원에서는 평면에 해당하는 개념입니다. 고차원으로 확장된 것일 뿐입니다.
3. 서포트 벡터(Support Vector)란 무엇인가?
SVM이라는 이름에서 가장 혼란스러운 부분은 '서포트 벡터'입니다. 하지만 이 개념은 매우 직관적입니다.
앞서 언급했듯, SVM은 마진이 가장 큰 결정 경계를 찾습니다. 그렇다면 이 마진의 크기는 누가 결정할까요? 모든 데이터 포인트가 결정하는 것이 아닙니다. 결정 경계에 가장 가까이 위치한 소수의 데이터 포인트가 마진의 크기를 결정짓는 핵심적인 역할을 합니다.
이러한 포인트들은 마치 결정 경계를 양쪽에서 '지지'하고 있는 것과 같습니다. 만약 이 포인트들이 없다면, 결정 경계는 더 멀리 이동하여 마진을 더 크게 만들 수 있습니다.
이렇게 경계에 가장 가깝게 위치하여 결정 경계의 위치를 실질적으로 결정하는 데이터 포인트들을 서포트 벡터(Support Vectors)라고 부릅니다.
서포트 벡터는 결정 경계의 위치를 결정하는 가장 중요하고 핵심적인 샘플들입니다.
4. 한 문장으로 요약하는 SVM의 목표
전문 용어 없이 SVM의 작동 방식을 한 문장으로 요약하면 다음과 같습니다.
두 클래스를 올바르게 분리할 수 있는 조건 하에, 결정 경계를 양쪽 클래스로부터 가장 안전하고 안정적인 위치에 배치하는 것.
'안전하다'는 것은 양쪽 샘플로부터 최대한 멀리 떨어져 있음을 의미합니다. '안정적이다'는 것은 새로운 데이터나 약간의 노이즈에 의해 쉽게 영향받지 않음을 의미합니다.
5. 2차원 공간에서의 SVM 결정 경계 이해
2차원 평면에서 직선은 일반적으로 다음과 같은 방정식으로 표현됩니다.
w1*x1 + w2*x2 + b = 0
여기서:
- x1, x2는 두 개의 특성(feature)입니다.
- w1, w2는 직선의 방향을 결정합니다.
- b는 직선의 위치(절편)를 결정합니다.
SVM도 이러한 형태의 직선을 찾습니다. 하지만 단순히 클래스를 분리하는 것만 요구하지 않고, 양쪽 클래스의 가장 가까운 샘플까지의 거리를 최대화하는 추가적인 목표를 충족해야 합니다.
SVM은 세 개의 평행선을 함께 고려합니다.
- 중앙의 실제 분류선 (결정 경계)
- 양성(Positive) 클래스 샘플에 인접한 경계선
- 음성(Negative) 클래스 샘플에 인접한 경계선
이 두 경계선 사이의 거리가 바로 마진이며, SVM은 이 마진을 최대화하는 방향으로 학습합니다.
6. 왜 마진이 클수록 좋은가?
마진이 크다는 것은 모델이 새로운 샘플에 대해 더 관대하고 안정적으로 예측할 수 있음을 의미합니다.
- 마진이 작으면: 경계 부근에 약간 모호한 새로운 샘플이 들어와도 쉽게 오분류됩니다.
- 마진이 크면: 경계와 샘플 사이에 넉넉한 '완충 지대'가 있어 새로운 샘플이 들어와도 오분류될 확률이 낮아집니다.
따라서 일반적으로 마진이 클수록 모델의 일반화 성능이 향상되고, 노이즈에 덜 민감해집니다. 이것이 SVM 설계의 핵심 미학입니다.
7. SVM의 최적화 목표: 핵심 수식
SVM의 최적화 목표는 다음과 같은 고전적인 형태로 표현됩니다.
최소화: (1/2) * ||w||^2
제약 조건: y_i * (w · x_i + b) >= 1 (모든 i에 대해)
이 수식을 직관적으로 이해해 보겠습니다.
첫째, (1/2) * ||w||^2 최소화:
이는 가중치 벡터 w의 크기를 작게 유지하라는 의미입니다. SVM에서 w의 크기와 마진은 반비례 관계에 있습니다. 즉, w의 크기가 작을수록 마진은 커집니다. 따라서 이 값을 최소화하는 것은 본질적으로 마진을 최대화하는 것과 같습니다.
둘째, y_i * (w · x_i + b) >= 1 제약 조건:
이는 모든 훈련 샘플(x_i, y_i)이 올바르게 분류될 뿐만 아니라, 결정 경계로부터 최소한 1 이상의 거리(마진 내)를 유지해야 함을 의미합니다. 즉, 단순히 분류되는 것에 만족하지 않고, 약간의 여유(margin)를 두고 분류되도록 강제합니다.
이 두 조건을 종합하면, "모든 샘플을 올바르게 분류하면서도, 결정 경계로부터 최대한 멀리 떨어뜨려 놓는 것"이 SVM의 목표입니다.
8. 현실 데이터의 한계: 완벽한 분리가 불가능한 경우 (소프트 마진 SVM)
현실 세계의 데이터는 항상 깔끔하게 선형 분리(Linear Separable)되지 않습니다. 두 클래스의 데이터가 서로 겹쳐 있거나, 노이즈가 존재하는 경우가 많습니다. 이런 상황에서 모든 훈련 샘플을 완벽하게 분류하도록 강제하면(하드 마진 SVM), 모델은 이상치(outlier)에 과도하게 민감해져 비현실적이고 불안정한 결정 경계를 만들 수 있습니다.
이러한 문제를 해결하기 위해 실제로는 소프트 마진 SVM(Soft Margin SVM)이 주로 사용됩니다.
소프트 마진 SVM은 현실을 인정합니다. 즉, 일부 샘플이 마진 내에 위치하거나 심지어 잘못 분류되는 것을 허용합니다. 대신, 이러한 '오류'에 대해 패널티를 부과하는 방식으로 작동합니다.
이때 중요한 하이퍼파라미터가 등장합니다. 바로 C입니다.
9. 하이퍼파라미터 C의 역할
C는 모델이 훈련 샘플의 오분류에 얼마나 민감하게 반응할지를 제어하는 패널티 파라미터입니다.
- C 값이 큰 경우: 모델은 훈련 샘플을 완벽하게 분류하는 것에 높은 패널티를 부과합니다. 따라서 거의 모든 샘플을 정확히 분류하려고 노력하며, 결과적으로 결정 경계는 복잡하고 좁은 마진을 가지게 됩니다. 이는 훈련 데이터에 과적합(Overfitting)될 위험을 높입니다.
- C 값이 작은 경우: 모델은 오분류에 대해 상대적으로 관대합니다. 일부 샘플이 잘못 분류되거나 마진 내에 위치하는 것을 허용하며, 그 대신 더 넓고 부드러운 마진을 얻습니다. 이는 일반화 성능을 향상시키지만, 훈련 오차는 다소 증가할 수 있습니다.
즉, C는 훈련 데이터의 정확성과 결정 경계의 안정성(일반화 성능) 사이의 균형을 조절하는 역할을 합니다. 이는 다른 머신러닝 모델의 복잡도 조절과 유사한 개념입니다.
10. 비선형 문제 해결: 커널 트릭(Kernel Trick)
SVM이 유명해진 가장 큰 이유 중 하나는 커널 트릭(Kernel Trick)을 통해 선형 분리가 불가능한 복잡한 데이터도 효과적으로 처리할 수 있다는 점입니다.
2차원 평면에서 한 클래스의 데이터가 원형으로 다른 클래스를 감싸고 있는 경우, 어떤 직선으로도 이 두 클래스를 완전히 분리할 수 없습니다. 하지만 데이터를 더 높은 차원(예: 3차원)으로 매핑(mapping)하면, 원래 2차원에서는 분리할 수 없던 구조가 고차원에서는 평면 하나로 깔끔하게 분리될 수 있습니다.
커널 함수는 바로 이 고차원 매핑을 수행하는 함수입니다. 놀라운 점은, SVM이 실제로 데이터를 고차원으로 변환하는 계산을 수행하지 않고, 커널 함수를 통해 '마치 고차원에서 계산한 것과 동일한 결과'를 효율적으로 얻을 수 있다는 것입니다. 이것이 바로 '커널 트릭'입니다.
11. 주요 커널 함수 종류
자주 사용되는 커널 함수는 다음과 같습니다.
- 선형 커널 (Linear Kernel): 데이터가 선형 분리에 가까울 때 사용합니다. 이 경우 SVM은 마진을 고려하는 선형 분류기처럼 동작합니다.
- 다항식 커널 (Polynomial Kernel): 곡선 형태의 결정 경계를 만들 수 있습니다. 차수(degree)를 조절하여 경계의 복잡도를 제어합니다.
- RBF 커널 (Radial Basis Function Kernel, 가우시안 커널): 가장 널리 사용되는 커널로, 매우 복잡한 비선형 결정 경계를 모델링할 수 있습니다. 하나의 하이퍼파라미터인 γ(gamma)를 통해 각 데이터 포인트의 영향 범위를 조절합니다.
커널 함수는 "데이터를 바라보는 새로운 관점"을 제공한다고 이해하면 쉽습니다. 원래 공간에서는 분리할 수 없었던 데이터가 변환된 공간에서는 쉽게 분리될 수 있습니다.
12. SVM의 장점과 단점
장점:
- 고차원 데이터 처리에 효과적: 특성의 개수가 많은 데이터셋에서도 좋은 성능을 보입니다.
- 명확한 분류 기준: '마진 최대화'라는 명확하고 강력한 최적화 목표를 가집니다.
- 커널 트릭을 통한 강력한 표현력: 비선형 문제를 효과적으로 해결할 수 있습니다.
- 중소규모 데이터셋에서 우수한 성능: 샘플 수가 많지 않고 특성이 비교적 잘 구분되는 데이터셋에서 강력한 성능을 보이는 경우가 많습니다.
단점:
- 대규모 데이터셋에서 훈련 속도 저하: 샘플 수가 많아질수록 훈련 시간이 크게 증가합니다.
- 하이퍼파라미터와 커널 선택에 민감: C, γ, 커널 종류 등의 설정에 따라 성능이 크게 달라집니다.
- 모델 해석이 어려움: 결정 트리처럼 '왜 이런 결정을 내렸는지'를 직관적으로 설명하기 어렵습니다.
13. Python을 사용한 간단한 SVM 분류 예제
scikit-learn 라이브러리를 사용한 간단한 SVM 분류 예제입니다.
import numpy as np
from sklearn.svm import SVC
# 특성: [학습 시간, 과제 완료율]
X_train = np.array([
[2, 50],
[3, 55],
[4, 60],
[5, 65],
[6, 70],
[7, 75],
[8, 80],
[9, 85]
])
# 레이블: 0=불합격, 1=합격
y_train = np.array([0, 0, 0, 0, 1, 1, 1, 1])
# 선형 커널을 사용한 SVM 모델 생성 (C=1.0)
model = SVC(kernel='linear', C=1.0)
# 모델 훈련
model.fit(X_train, y_train)
# 새로운 샘플 예측
X_test = np.array([
[4.5, 63],
[7.5, 78]
])
# 예측 수행
predictions = model.predict(X_test)
print("예측 결과:", predictions)
이 코드에서:
kernel='linear'은 선형 커널을 사용하도록 지정합니다.C=1.0은 소프트 마진의 패널티 강도를 설정합니다.
14. RBF 커널 사용 예제
동일한 데이터에 RBF 커널을 적용하면 비선형 결정 경계를 학습할 가능성을 확인할 수 있습니다.
# RBF 커널을 사용한 SVM 모델 생성
model_rbf = SVC(kernel='rbf', C=1.0, gamma='scale')
# 모델 훈련
model_rbf.fit(X_train, y_train)
# 예측 수행
rbf_predictions = model_rbf.predict(X_test)
print("RBF 커널 예측 결과:", rbf_predictions)
RBF 커널의 gamma 파라미터는 각 훈련 샘플의 영향력을 결정합니다.
gamma값이 크면: 각 샘플의 영향 범위가 좁아져 결정 경계가 복잡해지고 과적합 위험이 있습니다.gamma값이 작으면: 각 샘플의 영향 범위가 넓어져 결정 경계가 부드러워지고 덜 복잡해집니다.