서포트 벡터 머신은 머신러닝의 지도 학습 모델 알고리즘 입니다!
분류와 회귀 두 종류 모두 사용을 할 수 있으나, 서포트 벡터 머신을 사용하라고 하면 분류에서 사용을 많이 한 것 같아요.
이 모델은 주어진 데이터를 기반으로 최적의 결정 경계를 찾아 분류하거나 예측하는 모델 입니다.
결정 경계는 분리 마진을 최대화 하도록 설정이 되어있습니다!
이렇게만 설명하면 헷갈리실 것 같아서 결정경계와 마진에 대한 이야기를 적겠습니다.
결정경계
결정 경계는 말그대로 경계입니다.
데이터를 분류하는 선 또는 초평면(Hyperplane)입니다.
마진은 결정경계와 가장 가까운 데이터 포인트와의 거리로 정의됩니다.
해당 모델은 마진을 최대화하여 구분을 하는 것을 목표로 합니다.
결정 경계는 분류모델에서 사용됩니다. (회귀는 튜브)
결정 경계와 가장 가까운 점을 서포트 벡터라고 부르고, 이 때문에 서포트 벡터(를 찾는) 머신 이라고 생각이 됩니다.
소프트 마진
데이터에 약간의 오차를 허용하여 현실적인 상황에서 더 적합합니다.
소프트 마진의 핵심은 슬랙 변수(Slack variable) 입니다.
일부 데이터가 결정 경계 내부에 위치하도록 하거나 오분류 된 것을 허용하는 모델입니다.
정규화 파라미터를 사용하여 마진의 폭과 오분류 사이의 균형을 조절하는 역할을 합니다.
위의 그래프에서 보시면 주황색 빛이 도는 것이 슬랙 변수 입니다.
슬랙 변수를 통해 클래스를 구분하는 것을 더욱 편하게 하실 수 있습니다.
분류가 올바르게 된 경우에는 슬랙 변수가 0
슬랙 변수가 결정 경계 사이에 있는 경우 0에서 1사이
분류가 올바르게 진행되지 않은 경우 1 초과의 값을 가지게 됩니다.
하드 마진
하드마진은 소프트 마진과는 반대로 선형적으로 완벽하게 분리가 가능할 때 유용합니다.
모든 데이터는 결정 경계 사이에 존재하면 안됩니다.
노이즈가 많거나 선형분리가 불가능 한 경우에는 사용하면 안됩니다!
데이터 생성
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 데이터 생성
X, y = make_blobs(n_samples=100, centers=2, random_state=42, cluster_std=0.5)
# 데이터 시각화
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm')
plt.title("Generated Data")
plt.show()
분류 데이터를 만들고 시작하겠습니다!
커널 - linear
from sklearn.svm import SVC
import numpy as np
# 모델 학습
svc_linear = SVC(kernel='linear', C=1.0)
svc_linear.fit(X, y)
# 결정 경계 시각화
xx, yy = np.meshgrid(np.linspace(X[:, 0].min(), X[:, 0].max(), 100),
np.linspace(X[:, 1].min(), X[:, 1].max(), 100))
Z = svc_linear.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm')
plt.contour(xx, yy, Z, levels=[0], colors='black', linestyles='--')
plt.title("SVM with Linear Kernel")
plt.show()
커널이 선형인 경우엔 위의 코드를 사용합니다.
결정 경계가 선형으로 나타나는 것을 볼 수 있습니다.
커널 - 다항
# 모델 학습
svc_poly = SVC(kernel='poly', degree=3, C=1.0)
svc_poly.fit(X, y)
# 결정 경계 시각화
Z = svc_poly.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm')
plt.contour(xx, yy, Z, levels=[0], colors='black', linestyles='--')
plt.title("SVM with Polynomial Kernel")
plt.show()
다항은 poly를 사용합니다.
보시면 선형의 형태에서 조금 휜 것을 확인할 수 있습니다.
커널 - rbf
# 모델 학습
svc_rbf = SVC(kernel='rbf', gamma=0.7, C=1.0)
svc_rbf.fit(X, y)
# 결정 경계 시각화
Z = svc_rbf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm')
plt.contour(xx, yy, Z, levels=[0], colors='black', linestyles='--')
plt.title("SVM with RBF Kernel")
plt.show()
rbf 커널의 경우, 가장 많이 사용하는 것 같습니다.
결정 경계가 매우 시각화 하기 편한 커널입니다!
커널 - 시그모이드
# 모델 학습
svc_sigmoid = SVC(kernel='sigmoid', C=1.0)
svc_sigmoid.fit(X, y)
# 결정 경계 시각화
Z = svc_sigmoid.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm')
plt.contour(xx, yy, Z, levels=[0], colors='black', linestyles='--')
plt.title("SVM with Sigmoid Kernel")
plt.show()
이전 게시글을 본 분들이면 시그모이드에 대해서 들어보셨을 겁니다.
그리고 알고 계신분들도 상당수 계실거라고 믿고 있습니다.
이진 분류에 상당히 유용하게사용될 수 있습니다. (실제로 쓸까?)
SVR (서포트 벡터 머신 회귀)
from sklearn.svm import SVR
import numpy as np
import matplotlib.pyplot as plt
# 데이터 생성
X = np.linspace(-3, 3, 100).reshape(-1, 1)
y = X.ravel() + np.random.normal(0, 0.5, X.shape[0])
# SVR 모델 학습
epsilon = 0.1 # 튜브 크기
svr = SVR(kernel='linear', C=1.0, epsilon=epsilon)
svr.fit(X, y)
# 예측 및 시각화
y_pred = svr.predict(X)
plt.scatter(X, y, color='blue', label='Data')
plt.plot(X, y_pred, color='red', label='Prediction')
plt.fill_between(X.ravel(), y_pred - epsilon, y_pred + epsilon, color='pink', alpha=0.3, label='Epsilon Tube')
plt.legend()
plt.title("SVR with Epsilon Tube")
plt.show()
실제로 사용하시는 분들은 잘 보지 못했습니다.
결정 경계와의 마진을 시각적으로 나타내는 것을 튜브라고 하며 지금 코드에선 입실론 으로 표현할 수 있습니다.
서포트 벡터 머신의 튜브 내에 있으면 슬랙 변수라고 할 수 있습니다. 만 잘 사용하지 않을 것 같네요.
'[데이터 분석가] > [머신러닝,딥러닝]' 카테고리의 다른 글
로지스틱 회귀(Logistic Regression) (0) | 2025.01.23 |
---|---|
선형 회귀 (릿지, 라쏘, 엘라스틱 넷) (0) | 2025.01.21 |
선형 회귀(단순 선형/다중 선형) (0) | 2025.01.20 |