DATA PROGRAMMING/PYTHON
[PYTHON] SVM을 활용해 분류하고 시각화 하기
허니리즘
2023. 11. 20. 13:08
이번 글에서는 머신 러닝 방법중 하나인 svm을 활용하여 군집 모델을 만들고 이를 시각화 해보려고 한다.
선형 SVM
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets._samples_generator import make_classification, make_moons
우선 필요한 라이브러리들과 데이터 셋을 받아온다.
X1, y1 = make_classification(n_samples = 100, n_features=2, n_informative=1, n_redundant=0,
n_clusters_per_class=1, random_state=4
)
군집 모형을 만들기 위해 각 파라미터 값을 입력해 가상 데이터를 생성한다.
여기서 n_samples는 생성할 데이터 수, n_features는 독립 변수의 수, n_informative는 독립 변수 중 종속 변수와 상관관계가 있는 성분의 수, n_redundant는 독립 변수 중 다른 독립 변수의 선형 조합으로 나타나는 성분의 수, n_clusters_per_class는 클래스 당 클러스터의 수이다.
clf1 = svm.SVC(kernel='linear', random_state=44)
clf1.fit(X1,y1)
만들어진 데이터를 svm알고리즘에 fit한다. 여기서 kernel을 linear로 설정해 선형 군집을 한다.
plt.scatter(X1[:,0], X1[:,1], c=y1, s=30)
# 초평면 표현
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf1.decision_function(xy).reshape(XX.shape) # 데이터 포인트~결정경계 사이의 거리를 구해 각 포인트가 어느 클래스에 속하는지 결정
ax.contour(XX, YY, Z, colors='k', levels=[-1,0,1], alpha=0.5, linestyles=['--','-','--'])
#Support Vector 표현
ax.scatter(clf1.support_vectors_[:,0], clf1.support_vectors_[:,1], s=50, facecolors='r')
plt.show()
https://honeylive.tistory.com/44
[PYTHON] matplotlib을 활용하여 3차원 그래프 그리기
matplotlib 2차원 그래프 그리기 t1 = np.linspace(-2, 2, 10) # x와 y 배열 생성 x = 2 * t1 y = t1**2 + 2 * t1 # 그래프 그리기 plt.figure(figsize=(8, 6)) # 그래프 크기 설정 plt.plot(x, y, marker='o', linestyle='-') # 선 그래프 그
dd.honeyreviewer.com
초평면 그리는 자세한 방법
비선형 SVM
X2, y2 = make_moons(n_samples = 400, noise = 0.1, random_state = 0)
clf_rbf = svm.SVC(kernel='rbf', random_state=44)
clf_rbf.fit(X2, y2)
초승달 모양의 클러스터 두 개 형상의 데이터를 생성한다.
plt.scatter(X2[:,0], X2[:,1], c=y2, s=30)
# 초평면 표현
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf2_rbf.decision_function(xy).reshape(XX.shape) # 데이터 포인트~결정경계 사이의 거리를 구해 각 포인트가 어느 클래스에 속하는지 결정
ax.contour(XX, YY, Z, colors='k', levels=[-1,0,1], alpha=0.5, linestyles=['--','-','--'])
#Support Vector 표현
ax.scatter(clf2_rbf.support_vectors_[:,0], clf2_rbf.support_vectors_[:,1], s=50, facecolors='r')
plt.show()
위와 마찬가지로 시각화 한다.