서포트 벡터 머신(Support Vector Machine, SVM)은 분류 및 회귀 분석에 사용되는 강력한 지도 학습 알고리즘입니다. SVM은 주로 분류 문제에서 사용되며, 데이터를 다른 클래스 간의 경계로 분리하는 초평면(hyperplane)을 찾는 것이 목표입니다.
SVM의 주요 개념
- 초평면(Hyperplane):
- 초평면은 데이터 포인트를 두 개의 클래스 또는 더 많은 클래스 사이로 분리하는 결정 경계입니다.
- 2차원 공간에서는 선, 3차원 공간에서는 평면이며, 더 높은 차원에서는 초평면이라고 합니다.
- 마진(Margin):
- 마진은 결정 경계와 가장 가까운 데이터 포인트(서포트 벡터) 사이의 거리입니다.
- SVM은 마진을 최대화하는 초평면을 찾습니다. 이는 모델의 일반화 능력을 향상시킵니다.
- 서포트 벡터(Support Vectors):
- 서포트 벡터는 결정 경계에 가장 가까운 데이터 포인트입니다.
- 이 포인트들은 초평면을 정의하는 데 중요한 역할을 합니다.
- 커널 트릭(Kernel Trick):
- SVM은 선형 분류뿐만 아니라 비선형 분류도 가능합니다.
- 커널 함수는 데이터를 고차원 특징 공간으로 변환하여 비선형 분류 문제를 선형 분류 문제로 변환합니다.
- 대표적인 커널 함수로는 선형 커널, 다항식 커널, RBF(방사 기저 함수) 커널 등이 있습니다.
SVM의 수학적 개념
- 결정 초평면:
- 데이터 포인트 (\mathbf{x})가 (w \cdot \mathbf{x} + b = 0)이라는 초평면에 의해 분리된다고 가정합니다.
- (w)는 초평면의 기울기를 나타내는 벡터, (b)는 편향입니다.
- 최대 마진:
- 마진은 (2 / |w|)로 계산되며, SVM의 목표는 이 값을 최대화하는 것입니다.
- 마진을 최대화하려면 제약 조건을 만족해야 합니다:
[
y_i (w \cdot \mathbf{x}_i + b) \geq 1 \quad \forall i
] - 여기서 (y_i)는 클래스 레이블이며, (+1) 또는 (-1) 값을 가집니다.
- 최적화 문제:
- 위의 제약 조건을 만족하면서 (w)와 (b)를 찾기 위한 최적화 문제를 풀어야 합니다.
- 라그랑주 승수법을 사용하여 최적화 문제를 해결합니다.
- 커널 함수:
- 비선형 데이터를 다루기 위해 커널 함수를 사용합니다. 커널 함수 (K(\mathbf{x}_i, \mathbf{x}_j))는 고차원 공간에서 두 벡터 간의 내적을 계산합니다.
- 커널 함수의 예:
- 선형 커널: (K(\mathbf{x}_i, \mathbf{x}_j) = \mathbf{x}_i \cdot \mathbf{x}_j)
- 다항식 커널: (K(\mathbf{x}_i, \mathbf{x}_j) = (\mathbf{x}_i \cdot \mathbf{x}_j + 1)^d)
- RBF 커널: (K(\mathbf{x}_i, \mathbf{x}_j) = \exp(-\gamma |\mathbf{x}_i – \mathbf{x}_j|^2))
SVM의 응용
- 이미지 분류: 얼굴 인식, 사물 인식 등
- 텍스트 분류: 스팸 이메일 필터링, 감정 분석 등
- 생물정보학: 유전자 분류, 단백질 구조 예측 등
SVM의 장단점
장점:
- 고차원 데이터에서 잘 작동합니다.
- 결정 경계가 분명하여 과적합(overfitting)을 방지할 수 있습니다.
- 다양한 커널을 통해 비선형 분류 문제를 해결할 수 있습니다.
단점:
- 큰 데이터셋에서는 학습 속도가 느릴 수 있습니다.
- 커널과 매개변수 선택에 민감합니다.
- 다중 클래스 분류 문제에서는 복잡도가 증가할 수 있습니다.
SVM 예제1
다음은 파이썬을 사용하여 SVM을 적용하는 간단한 예제입니다:
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# 데이터 로드
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# SVM 모델 학습
model = SVC(kernel='linear')
model.fit(X_train, y_train)
# 예측
y_pred = model.predict(X_test)
# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
이 예제에서는 Iris 데이터셋을 사용하여 SVM 모델을 학습하고, 테스트 데이터에 대한 예측 정확도를 평가합니다.
SVM 예제1

위 그림은 선형 커널을 사용하는 SVM 모델의 결과를 시각화한 것입니다.
- 데이터 포인트: 두 클래스의 데이터 포인트가 서로 다른 색으로 표시되었습니다.
- 결정 초평면: 실선은 두 클래스를 분리하는 결정 초평면을 나타냅니다.
- 마진 경계: 두 개의 점선은 마진 경계를 나타냅니다. 이 경계는 결정 초평면에서 일정한 거리를 두고 있으며, 이 사이에 데이터 포인트가 없어야 마진이 최대화됩니다.
- 서포트 벡터: 서포트 벡터는 결정 초평면에 가장 가까운 데이터 포인트로, 큰 원으로 강조 표시되어 있습니다. 서포트 벡터는 결정 초평면을 정의하는 데 중요한 역할을 합니다.
이 시각화는 SVM이 데이터 포인트를 분류하기 위해 어떻게 초평면을 찾고, 마진을 최대화하는지 보여줍니다.