서포트 벡터 머신 예제 – 3차원 시각화하기
데이터 분류에서 자주 사용되는 알고리즘 중 하나인 서포트 벡터 머신(Support Vector Machine, SVM)은 2차원뿐만 아니라 3차원 데이터에서도 강력한 성능을 보여줍니다. 이번 서포트 벡터 머신 예제 포스트에서는 Python과 scikit-learn
, matplotlib
라이브러리를 사용하여 3차원 서포트 벡터 머신(SVM)을 구현하고, 그 결과를 시각화하는 방법을 집중적으로 살펴보겠습니다.
3차원 공간에서의 분류 경계는 더욱 복잡할 수 있지만, 시각화를 통해 이를 쉽게 이해할 수 있습니다. 이번 예제를 통해 SVM이 어떻게 3차원 데이터를 처리하는지 확인해봅시다.
3차원 서포트 벡터 머신(SVM) 이해하기
SVM은 데이터를 두 개의 클래스로 분류할 수 있는 최적의 경계(하이퍼플레인)를 찾는 알고리즘입니다. 3차원에서는 이 하이퍼플레인이 평면으로 나타나며, 데이터를 서로 다른 클래스로 나누게 됩니다. 이번 예제에서는 3개의 특징을 가지는 데이터를 사용하여 3D 분류 경계를 시각화합니다.
파이썬 코드 단계별 설명
1. 필요한 라이브러리 임포트
먼저, 3차원 데이터를 생성하고 SVM을 구현하기 위해 필요한 라이브러리를 불러옵니다.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 3D 시각화를 위한 모듈
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
mpl_toolkits.mplot3d.Axes3D
: 3D 그래프를 그리기 위해 필요한 모듈입니다.SVC
:scikit-learn
에서 제공하는 서포트 벡터 머신(SVM) 분류기입니다.
2. 샘플 데이터 생성
다음으로, 3차원 데이터를 생성하여 SVM을 학습시킵니다.
# 3개의 특징을 가지는 3D 데이터 생성
X, y = datasets.make_classification(n_samples=100, n_features=3, n_informative=3, n_redundant=0, random_state=42)
# 학습용 및 테스트용 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
n_samples=100
: 100개의 샘플을 생성합니다.n_features=3
: 각 샘플이 3개의 특징을 가지도록 설정합니다.n_informative=3
: 3개의 특징 모두 분류에 중요한 정보입니다.
3. SVM 모델 생성 및 학습
생성한 데이터를 사용하여 SVM 모델을 학습합니다.
# 3D 데이터를 위한 SVM 모델 생성
model = SVC(kernel='linear')
# 모델 학습
model.fit(X_train, y_train)
kernel='linear'
: 선형 커널을 사용하여 데이터 간의 분류 경계를 찾습니다.
4. SVM 3D 결과 시각화
이제 학습된 SVM 모델의 결과를 3D 시각화로 확인해보겠습니다. 3차원에서는 분류 경계가 평면으로 나타납니다.
# 학습된 SVM 모델의 3D 분류 경계를 시각화하는 함수
def plot_3d_decision_boundary(X, y, model):
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 데이터 포인트를 3D 공간에 그리기
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap='coolwarm', s=60, edgecolors='k')
# 경계 시각화를 위한 그리드 설정
xlim = (X[:, 0].min(), X[:, 0].max())
ylim = (X[:, 1].min(), X[:, 1].max())
zlim = (X[:, 2].min(), X[:, 2].max())
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 30),
전체 통합 코드
아래는 3차원 서포트 벡터 머신(SVM) 모델의 전체 코드를 주석과 함께 설명한 통합 코드입니다.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 3D 그래프를 그리기 위한 모듈
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
# 1. 3D 데이터 생성
# 3개의 특징을 가지는 100개의 샘플을 생성합니다.
# n_informative=3: 3개의 유의미한 특징만 사용, n_redundant=0: 불필요한 특징 없음
X, y = datasets.make_classification(n_samples=100, n_features=3, n_informative=3,
n_redundant=0, random_state=42)
# 2. 데이터셋을 학습용과 테스트용으로 분리
# 70%의 데이터를 학습용으로, 30%의 데이터를 테스트용으로 사용합니다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 3. SVM 모델 생성
# 선형 커널을 사용하는 SVM 모델을 생성합니다.
model = SVC(kernel='linear')
# 4. 모델 학습
# 학습 데이터를 사용해 SVM 모델을 학습시킵니다.
model.fit(X_train, y_train)
# 5. 3D 시각화 함수 정의
def plot_3d_decision_boundary(X, y, model):
# 3D 그래프를 위한 플롯 생성
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 5.1 데이터 포인트 시각화
# 각 클래스에 따라 색상으로 구분하여 3D 공간에 데이터를 표시합니다.
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap='coolwarm', s=60, edgecolors='k')
# 5.2 경계 시각화를 위한 그리드 설정
xlim = (X[:, 0].min(), X[:, 0].max())
ylim = (X[:, 1].min(), X[:, 1].max())
zlim = (X[:, 2].min(), X[:, 2].max())
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 30), np.linspace(ylim[0], ylim[1], 30))
# 5.3 결정 경계 평면 계산
# 선형 SVM의 가중치와 절편을 이용해 경계 평면을 정의합니다.
# 모델의 coef_는 결정 경계 평면의 기울기를 나타냅니다.
Z = (-model.coef_[0][0] * xx - model.coef_[0][1] * yy - model.intercept_) / model.coef_[0][2]
# 5.4 결정 경계 평면 시각화
ax.plot_surface(xx, yy, Z, color='green', alpha=0.3)
# 5.5 축 라벨 설정
ax.set_xlabel("Feature 1")
ax.set_ylabel("Feature 2")
ax.set_zlabel("Feature 3")
ax.set_title("SVM 3D Decision Boundary")
# 5.6 그래프 표시
plt.show()
# 6. 테스트 데이터를 사용하여 SVM 결정 경계 시각화
plot_3d_decision_boundary(X_test, y_test, model)
코드 설명:
- 데이터 생성:
make_classification
함수로 3차원 데이터를 생성하여 SVM으로 학습할 수 있도록 합니다.n_features=3
을 사용하여 3차원 데이터를 만듭니다. - 데이터 분할:
train_test_split
을 통해 데이터를 학습용과 테스트용으로 분리합니다. - SVM 모델 생성 및 학습:
SVC
클래스를 이용하여 선형 커널을 사용하는 SVM 모델을 생성하고, 학습 데이터를 통해 모델을 학습시킵니다. - 3D 시각화:
mpl_toolkits.mplot3d.Axes3D
모듈을 사용하여 3D 시각화를 구현하고, SVM이 학습한 분류 경계 평면을 시각화합니다.ax.plot_surface
함수로 SVM의 결정 경계 평면을 시각화합니다.
자주 묻는 질문 (FAQ)
Q1. 3차원 데이터에서 SVM의 결정 경계는 어떻게 나타나나요?
A1. 3차원 데이터에서는 SVM의 결정 경계가 평면으로 나타납니다. 이 평면은 두 클래스를 분리하며, SVM은 가장 가까운 데이터 포인트(서포트 벡터)로부터 이 평면의 거리를 최대화하는 방식으로 학습합니다.
Q2. 커널 함수란 무엇인가요?
A2. 커널 함수는 SVM에서 데이터를 고차원 공간으로 변환하여 비선형 데이터를 선형적으로 분리할 수 있도록 돕는 함수입니다. 이번 예제에서는 선형 커널(linear
)을 사용했지만, RBF 커널, 다항 커널 등 다양한 커널이 존재합니다.
Q3. SVM의 coef_
와 intercept_
는 무엇인가요?
A3. coef_
는 SVM에서 결정 경계의 기울기를 나타내는 값이고, intercept_
는 결정 경계의 절편을 나타냅니다. 이 두 값을 통해 분류 경계(평면)를 정의할 수 있습니다.
Q4. 3차원 데이터 외에 더 높은 차원의 데이터를 시각화할 수 있나요?
A4. 3차원까지는 시각화가 가능하지만, 4차원 이상의 데이터는 시각화가 불가능합니다. 그러나 고차원 데이터에서도 SVM은 강력한 성능을 발휘할 수 있습니다. 고차원 데이터를 다룰 때는 차원 축소 기법(PCA 등)을 통해 시각화할 수 있습니다.
Q5. 비선형 데이터를 분류할 때도 SVM을 사용할 수 있나요?
A5. 네, 비선형 데이터를 분류할 때는 RBF 커널이나 다항 커널과 같은 비선형 커널을 사용하여 SVM을 적용할 수 있습니다. 커널 방법을 사용하면 복잡한 데이터 분포도 효과적으로 분류할 수 있습니다.
마무리
이번 포스트에서는 파이썬을 사용해 3차원 서포트 벡터 머신(SVM)을 구현하고, 그 결과를 시각화하는 방법을 알아보았습니다. SVM이 3차원 데이터에서 어떻게 분류 경계를 설정하고 학습하는지, 시각화된 결과를 통해 직관적으로 확인할 수 있었습니다.
실제 데이터에 SVM을 적용해보고, 다양한 커널 함수나 고차원 데이터를 사용하여 SVM의 성능을 더욱 깊이 탐구해보세요.