서포트 벡터 머신(Support Vector Machine)의 이해 (1)
서포트 벡터 머신(SVM)은 분류와 회귀 분석에 널리 사용되는 강력한 기계 학습 알고리즘입니다. 이번 글에서는 SVM의 개념을 이해하기 위해 최대 마진 분류기와 선형 SVM에 대해 알아보겠습니다.
최대 마진 분류기
최대 마진 분류기(Maximum Margin Classifier) : 최대 마진 분류기는 두 클래스 간의 마진을 최대화하는 초평면(hyperplane)을 찾는 분류 모델입니다. 마진이란 초평면과 가장 가까운 데이터 포인트(서포트 벡터) 사이의 거리입니다.
목표
- 클래스 간의 분리를 최대화하여 일반화 성능을 향상시킵니다.
- 데이터에 가장 잘 맞는 초평면을 찾아 분류합니다.
마진의 정의
- 마진(margin) : 초평면과 서포트 벡터 사이의 거리입니다.
- 서포트 벡터(support vectors) : 초평면에 가장 가까운 데이터 포인트들로, 모델을 정의하는 데 중요한 역할을 합니다.
수식
초평면의 방정식
\mathbf{w} \cdot \mathbf{x} + b = 0
여기서
- \mathbf{w}는 가중치 벡터
- \mathbf{x}는 입력 데이터
- b는 절편
마진
\text{margin} = \frac{2}{\|\mathbf{w}\|}
최적화 문제 : 최대 마진을 찾는 최적화 문제는 다음과 같습니다.
\min_{\mathbf{w}, b} \frac{1}{2} \|\mathbf{w}\|^2
제약 조건
y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1
여기서 y_i는 각 데이터 포인트의 레이블입니다.
선형 SVM
선형 SVM(Linear Support Vector Machine) : 선형 SVM은 선형적으로 분리 가능한 데이터를 분류하는 알고리즘입니다. 최대 마진 분류기를 사용하여 초평면을 찾아 데이터를 분류합니다.
작동 원리
- 초평면 찾기 : 데이터를 분류하는 최적의 초평면을 찾습니다.
- 서포트 벡터 선택 : 초평면에 가장 가까운 데이터 포인트들을 선택하여 마진을 정의합니다.
- 분류 : 새로운 데이터 포인트가 주어지면, 초평면을 기준으로 어느 클래스에 속하는지 결정합니다.
장점
- 효율적 : 높은 차원의 데이터에서 효율적으로 작동합니다.
- 견고성 : 과적합을 방지하고, 일반화 성능이 뛰어납니다.
단점
- 비선형 데이터 : 선형 SVM은 비선형적으로 분리되는 데이터에서는 잘 작동하지 않습니다.
- 데이터 스케일링 필요 : 입력 데이터의 스케일에 민감하여, 정규화가 필요할 수 있습니다.
예제 : 선형 SVM을 사용하여 이진 분류 문제를 해결하는 코드 예시는 다음과 같습니다.
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 데이터셋 로드
iris = datasets.load_iris()
X = iris.data[:, :2] # 꽃받침 길이와 너비
y = iris.target
# 이진 분류를 위해 두 클래스만 선택
X = X[y != 2]
y = y[y != 2]
# 데이터 정규화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 선형 SVM 모델 생성
model = SVC(kernel='linear')
# 모델 학습
model.fit(X_train, y_train)
# 모델 평가
accuracy = model.score(X_test, y_test)
print(f'Accuracy: {accuracy * 100:.2f}%')
# 결정 경계 시각화
def plot_decision_boundary(X, y, model):
h = .02 # 메쉬 스텝 크기
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
plt.xlabel('Sepal length (normalized)')
plt.ylabel('Sepal width (normalized)')
plt.title('Linear SVM Decision Boundary')
plt.show()
plot_decision_boundary(X_scaled, y, model)
위 코드는 선형 SVM을 사용하여 Iris 데이터셋의 일부를 분류하고, 결정 경계를 시각화하는 예제입니다.
서포트 벡터 머신(Support Vector Machine)의 이해 (2)
이어서 SVM의 두 번째 부분에서는 비선형 SVM, 커널법, SVM 회귀에 대해 알아보겠습니다.
비선형 SVM
비선형 SVM(Non-linear Support Vector Machine) : 비선형 SVM은 선형적으로 분리할 수 없는 데이터를 분류하는 데 사용됩니다. 이 알고리즘은 커널 트릭을 사용하여 데이터의 차원을 증가시킴으로써 비선형 분류 문제를 해결합니다.
커널 트릭 : 커널 트릭은 입력 데이터를 고차원 특성 공간으로 매핑하여 선형 초평면으로 분리할 수 있도록 합니다. 직접적으로 특성을 매핑하지 않고, 내적 연산을 통해 연산량을 줄입니다.
주요 커널 함수
- 선형 커널 : K(x_i, x_j) = x_i \cdot x_j
- 다항식 커널 : K(x_i, x_j) = (x_i \cdot x_j + c)^d
- RBF(방사형 기저 함수) 커널 : K(x_i, x_j) = \exp(-\gamma \|x_i - x_j\|^2)
- 시그모이드 커널 : K(x_i, x_j) = \tanh(\alpha x_i \cdot x_j + c)
장점
- 복잡한 데이터 분류 : 비선형적으로 분리되는 데이터를 효과적으로 분류할 수 있습니다.
- 유연성 : 다양한 커널을 통해 데이터에 적합한 커널을 선택할 수 있습니다.
단점
- 모델 복잡성 : 커널 선택에 따른 모델의 복잡성이 증가할 수 있습니다.
- 계산 비용 : 큰 데이터세트에서는 계산 비용이 높을 수 있습니다.
예제 : 비선형 SVM을 사용하여 비선형 데이터를 분류하는 코드 예시는 다음과 같습니다.
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import numpy as np
# 비선형 데이터 생성
X, y = make_moons(n_samples=200, noise=0.2, random_state=42)
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 비선형 SVM 모델 생성 (RBF 커널 사용)
model = SVC(kernel='rbf', gamma='auto')
# 모델 학습
model.fit(X_train, y_train)
# 모델 평가
accuracy = model.score(X_test, y_test)
print(f'Accuracy: {accuracy * 100:.2f}%')
# 결정 경계 시각화
plot_decision_boundary(X, y, model)
위 코드는 비선형 데이터를 생성하고, RBF 커널을 사용한 SVM으로 분류하는 예제입니다.
커널법
커널법(Kernel Method) : 커널법은 비선형 데이터에 대해 선형 분류 알고리즘을 적용할 수 있도록 데이터를 고차원 특성 공간으로 매핑하는 기법입니다. 커널함수는 데이터를 변환하지 않고도 고차원 공간에서의 내적 연산을 가능하게 합니다.
커널 함수의 역할
- 데이터 매핑 : 데이터를 고차원 공간으로 매핑하여 복잡한 경계를 학습할 수 있습니다.
- 내적 계산 최적화 : 고차원 공간에서의 내적 연산을 효율적으로 수행합니다.
커널 선택 : 커널의 선택은 문제의 성격과 데이터의 구조에 따라 달라집니다. 실험을 통해 최적의 커널을 찾는 것이 중요합니다.
SVM 회귀
SVM 회귀(Support Vector Regression, SVR) : SVM 회귀는 연속적인 값을 예측하기 위한 SVM의 확장입니다. 데이터 포인트가 초평면에 최대한 근접하도록 하고, 초평면에서 일정 범위(ε-margin) 안에 있는 데이터 포인트만 허용합니다.
목표
- 초평면에서 ε-마진 내에 있는 데이터 포인트를 예측하도록 합니다.
- 초평면 밖에 있는 데이터 포인트에 대해서는 패널티를 부여하여 모델을 최적화합니다.
수식
목적 함수
\min_{\mathbf{w}, b} \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^{m} \xi_i
제약 조건
|y_i - (\mathbf{w} \cdot \mathbf{x}_i + b)| \leq \epsilon + \xi_i
여기서 \xi_i는 허용 오차, C는 정규화 파라미터입니다.
장점
- 유연성 : 비선형 회귀 문제에도 적용할 수 있습니다.
- 견고성 : 이상치에 강한 견고성을 가집니다.
단점
- 복잡성 : 파라미터 조정이 필요하며, 계산 비용이 높을 수 있습니다.
예제 : SVM 회귀를 사용하여 데이터를 예측하는 코드 예시는 다음과 같습니다.
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
import matplotlib.pyplot as plt
# 회귀 데이터 생성
X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42)
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# SVM 회귀 모델 생성
model = SVR(kernel='rbf', C=100, epsilon=0.1)
# 모델 학습
model.fit(X_train, y_train)
# 모델 평가
score = model.score(X_test, y_test)
print(f'R-squared: {score:.2f}')
# 예측값 시각화
plt.scatter(X, y, color='gray', label='Data')
plt.plot(X, model.predict(X), color='red', linewidth=2, label='SVR Fit')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.title('SVM Regression')
plt.legend()
plt.show()
위 코드는 SVM 회귀를 사용하여 데이터를 예측하고 시각화하는 예제입니다.
이 글에서는 서포트 벡터 머신의 기본 개념, 최대 마진 분류기, 선형 및 비선형 SVM, 커널법, SVM 회귀에 대해 알아보았습니다. SVM은 복잡한 분류 및 회귀 문제를 해결하는 데 강력한 도구입니다. 다양한 커널과 기법을 통해 다양한 문제를 효과적으로 해결할 수 있습니다.
'인공지능학 > 기계학습' 카테고리의 다른 글
[기계학습] 9. 앙상블 학습의 이해, 랜덤 포레스트 모델의 이해 (2) | 2024.08.20 |
---|---|
[기계학습] 8. 의사결정트리의 이해 (1) | 2024.08.07 |
[기계학습] 6. 군집화의 이해 (0) | 2024.08.06 |
[기계학습] 5. KNN 알고리즘과 로지스틱 회귀모델 (0) | 2024.08.05 |
[기계학습] 4. 분류의 이해, Naïve Bayes (0) | 2024.08.01 |