서포트 벡터 머신 SVM 예제 및 시각화하기 – 2차원
머신러닝의 분류 문제에서 서포트 벡터 머신(Support Vector Machine, SVM)은 널리 사용되는 강력한 알고리즘입니다. 특히, 데이터의 분류 경계(Decision Boundary)를 명확하게 그려줌으로써 시각적으로 이해하기 쉬운 장점이 있습니다. 이번 포스트에서는 파이썬 scikit-learn
라이브러리를 사용하여 SVM 예제를 살펴보고, 결과를 시각화하는 방법에 집중하겠습니다. SVM이 어떻게 작동하는지 이해하고, 그 결과가 어떻게 시각적으로 표현되는지 확인할 수 있습니다.
서포트 벡터 머신(SVM) 이해하기
SVM은 주어진 데이터를 두 개의 클래스로 분리할 수 있는 최적의 경계(하이퍼플레인, Hyperplane)를 찾는 지도 학습 알고리즘입니다. 이때, 분류 경계에서 가장 가까운 데이터 포인트(서포트 벡터)와의 거리를 최대화하여 최적의 분류기를 생성하는 것이 SVM의 핵심입니다.
SVM은 특히 높은 차원에서 작동할 때 효과적이며, 커널 함수(kernel)를 이용해 비선형 데이터도 분류할 수 있습니다. 이번 예제에서는 2차원 데이터를 사용하여, SVM이 데이터를 분류하는 경계를 시각화해보겠습니다.
파이썬 코드 단계별 설명
1. 필요한 라이브러리 임포트
먼저, SVM을 구현하고 결과를 시각화하기 위해 필요한 라이브러리를 불러옵니다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
numpy
: 배열 및 수학 계산을 위한 라이브러리입니다.matplotlib.pyplot
: 그래프 및 시각화를 위한 라이브러리입니다.sklearn.datasets
: 간단한 데이터셋을 제공하는 모듈로, 이번 예제에서는make_classification
데이터셋을 사용할 것입니다.train_test_split
: 데이터를 학습용과 테스트용으로 분리하는 함수입니다.SVC
: 서포트 벡터 머신(SVM) 분류기를 구현하는 클래스입니다.
2. 샘플 데이터 생성
간단한 2차원 데이터를 생성하여 SVM으로 학습시킵니다.
# 간단한 2D 데이터 생성
X, y = datasets.make_classification(n_samples=100, n_features=2, n_informative=2, 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=2
: 2개의 특징을 가지는 2차원 데이터를 생성합니다.n_informative=2
: 두 특징 모두 분류에 유용한 정보입니다.
3. SVM 모델 생성 및 학습
생성된 데이터를 학습용과 테스트용으로 분리한 후, SVM 모델을 학습시킵니다.
# SVM 모델 생성
model = SVC(kernel='linear')
# 모델 학습
model.fit(X_train, y_train)
kernel='linear'
: 선형 커널을 사용하여 두 클래스를 분리하는 직선을 찾습니다.
SVM 결과 시각화
이제 학습된 SVM 모델의 분류 경계와 테스트 데이터를 시각화합니다. 서포트 벡터 머신 시각화는 SVM 모델이 어떻게 데이터를 분류하는지 이해하는 데 매우 유용합니다.
# 학습 데이터와 분류 경계를 시각화하는 함수
def plot_decision_boundary(X, y, model):
# 경계 시각화를 위해 그리드 생성
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, 0.01),
np.arange(y_min, y_max, 0.01))
# 모델을 사용해 각 좌표에서의 예측값을 계산
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', s=50)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("SVM Decision Boundary")
plt.show()
# 학습된 모델과 함께 경계 시각화
plot_decision_boundary(X_test, y_test, model)
np.meshgrid
: 경계를 시각화하기 위한 그리드를 생성합니다.model.predict
: 생성된 그리드에 대해 모델이 예측한 값을 기반으로 경계를 그립니다.plt.contourf
: 예측 결과를 기반으로 분류 경계를 시각화합니다.plt.scatter
: 실제 데이터 포인트를 시각화하여 모델이 올바르게 분류했는지 확인할 수 있습니다.
위 코드를 실행하면 SVM이 학습한 결과로 데이터의 분류 경계가 표시되고, 테스트 데이터가 해당 경계 안에 올바르게 분류된 것을 확인할 수 있습니다.
서포트 벡터 머신 시각화 예시설명
- 분류 경계가 두 클래스를 분리하는 선형 경계로 나타납니다.
- 각 데이터 포인트는 해당 클래스에 따라 다른 색상으로 표시됩니다.
- 모델이 학습한 서포트 벡터도 시각화에서 경계 가까이 위치한 데이터 포인트로 확인할 수 있습니다.
전체 통합 코드
아래는 서포트 벡터 머신(SVM) 모델의 전체 코드입니다. 단계별로 필요한 부분에 주석을 추가하여 설명하였으니 참고하세요.
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
# 1. 데이터 생성
# 2개의 특징을 가지는 샘플 100개 생성, 클래스 간 분포가 잘 분리된 데이터셋을 만듦
X, y = datasets.make_classification(n_samples=100, n_features=2, n_informative=2,
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. 시각화 함수 정의
# 학습된 모델의 분류 경계와 데이터 포인트를 시각화하는 함수
def plot_decision_boundary(X, y, model):
# 5.1 경계 시각화를 위한 그리드 설정
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, 0.01),
np.arange(y_min, y_max, 0.01))
# 5.2 그리드의 각 점에서 모델이 예측한 값을 계산
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 5.3 예측한 값에 따른 분류 경계 그리기
plt.contourf(xx, yy, Z, alpha=0.8)
# 5.4 실제 데이터 포인트 시각화
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o', s=50)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("SVM Decision Boundary")
plt.show()
# 6. 테스트 데이터를 사용한 분류 경계 시각화
plot_decision_boundary(X_test, y_test, model)
코드 설명
- 데이터 생성:
datasets.make_classification
함수로 2차원 데이터를 생성하여 SVM으로 쉽게 시각화할 수 있도록 설정합니다. - 데이터 분할:
train_test_split
을 사용해 데이터를 학습용(70%)과 테스트용(30%)으로 나눕니다. - SVM 모델 생성:
SVC
클래스의kernel='linear'
을 사용하여 선형 서포트 벡터 머신 모델을 생성합니다. - 모델 학습:
fit
메소드로 학습 데이터를 기반으로 모델을 학습시킵니다. - 시각화 함수: 생성된 모델의 분류 경계를 그리기 위한 함수로, 그리드를 생성하여 각 포인트에서의 예측 결과를 바탕으로 분류 경계를 시각화합니다.
- 결과 시각화: 테스트 데이터를 사용해 모델이 학습한 분류 경계를 확인할 수 있습니다.
자주 묻는 질문 (FAQ)
Q1. 서포트 벡터 머신(SVM)은 무엇인가요?
A1. SVM은 주어진 데이터를 두 개의 클래스로 분리하는 최적의 경계를 찾는 분류 알고리즘입니다. 서포트 벡터는 이 경계를 정의하는데 중요한 역할을 하는 데이터 포인트입니다.
Q2. kernel
이란 무엇인가요?
A2. kernel
은 데이터를 변환하여 비선형 관계를 가진 데이터를 선형적으로 분리할 수 있도록 하는 함수입니다. 선형 커널, 다항 커널, RBF 커널 등 다양한 종류가 있습니다.
Q3. 서포트 벡터 머신 시각화할 때 2차원 데이터만 가능한가요?
A3. 시각화는 2차원 또는 3차원 데이터에서 직관적으로 가능하지만, 더 높은 차원의 데이터는 시각적으로 표현하기 어렵습니다. 그러나 SVM은 고차원 데이터에도 적용 가능합니다.
Q4. SVM의 장점과 단점은 무엇인가요?
A4. 장점으로는 고차원 데이터에서 성능이 우수하고, 과적합에 강합니다. 단점으로는 데이터가 많을 경우 학습 시간이 길어질 수 있다는 점이 있습니다.
서포트 벡터 머신 시각화 정리
이번 포스트에서는 파이썬의 scikit-learn
을 사용하여 서포트 벡터 머신(SVM)을 구현하고, 그 결과를 시각화하는 과정을 살펴보았습니다. SVM이 데이터의 분류 경계를 어떻게 설정하는지, 그 결과가 어떻게 시각화되는지를 직접 확인할 수 있었습니다. 머신러닝에서 시각화는 모델의 성능을 이해하고 개선하는 데 매우 유용한 도구입니다. 더 복잡한 데이터와 다양한 커널을 사용하여 SVM 모델을 확장해 보세요!