2023. 12. 29. 16:13ㆍDATA PROGRAMMING/PYTHON
이 글에서는 파이썬의 skit-learn 라이브러리의 svm 머신러닝 기법을 활용해 분류모델을 만든 이후 이를 matplotlib 라이브러리를 활용해 시각화 해보고자 한다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets._samples_generator import make_classification, make_moons
먼저 필요한 라이브러리들을 만든다. sklearn의 라이브러리를 통해 분류모델을 만들 수도 있다.
X1, y1 = make_classification(n_samples = 100, n_features = 2, n_informative = 1,
n_redundant = 0, n_clusters_per_class = 1, random_state
우선 100개의 샘플, 두개의 features를가지고 있는 데이터 셋을 만든다. 이를 svm으로 분류해보고자 한다.
clf1 = svm.SVC(kernel='linear' , random_state = 44)
clf1.fit(X1,y1)
svm을 적용해 분류 모델을 만드는 과정은 간단하다. 선형 svm을 활용해 분류한다.
plt.scatter(X1[:,0], X1[:,1], c=y1, s=30)
이를 산점도로 시각화할 수 있다. 여기서 결정경계와 서포트 벡터를 표현하는 코드를 작성해보겠다.
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=['--', '-', '--'])
ax.scatter(clf1.support_vectors_[:,0], clf1.support_vectors_[:,1], s=50, facecolors='r')
plt.show()
이제 이 코드를 하나하나 분석해보자.
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)
우선 해당 산점도의 x, y의 범위를 xlim과 ylim에 저장한 이후 각 범위 사이의 값들을 일정간격으로 30개 생성하여 xx와 yy에 대입한다.
YY, XX = np.meshgrid(yy,xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf1.decision_function(xy).reshape(XX.shape)
xx값과 yy값을 각각 대응시켜 2차원 배열을 만들기 위해 meshgrid 함수를 사용한다. ravel 함수는 2차원 배열을 행방향으로 합쳐 1차원 배열로 만들어 준다. XX.ravel() 와 YY.ravel()를 통해 각 X값들과 Y값들을 1차원으로 만들어 준다음 vstack 함수를 통해 2행짜리 배열을 만들어준다. 여기서 같은 열에 있는 값들이 하나의 (x, y) 좌표를 나타낸다. 이에 .T를 붙여 전치행렬을 만들어 주면 평면 위의 모든 좌표들의 값을 만들 수 있다.
마지막으로 결정경계에서 벡터값까지의 거리를 활용해 각 포인트가 어느 클래스에 속하는지 구하는 decision_function 함수를 활용해 Z를 설정해준다.
contour 함수는 등고선을 만들어 주는데 -1, 0, 1 의 수준에 각각 등고선을 만들어준다.
마지막으로 서포트 벡터들을 빨간색 포인트로 표시해주면 된다.
X2, y2 = make_moons(n_samples=400, noise=0.1, random_state=0)
clf2_rbf = svm.SVC(kernel='rbf', random_state=44)
clf2_rbf.fit(X2, y2)
이번엔 make_moons를 통해 달 모양의 데이터를 만들고 svm을 적용한다. 이때 곡선의 형태로 분류해야 하기에 rbf 커널을 활용한다.
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 = ['--','-','--'])
ax.scatter(clf2_rbf.support_vectors_[:,0], clf2_rbf.support_vectors_[:,1], s=50,
facecolors='r')
위와 마찬가지의 코드로 svm의 결과를 시각화 한다.
'DATA PROGRAMMING > PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬 Flask를 활용한 간단한 질문 답변 웹사이트 만들기 (0) | 2024.01.02 |
---|---|
[PYTHON] 머신러닝 연관규칙을 활용한 식단 추천 (0) | 2023.11.27 |
[PYTHON] SVM을 활용해 분류하고 시각화 하기 (0) | 2023.11.20 |
[PYTHON] 행렬의 덧셈 문제 (0) | 2023.11.07 |
[PYTHON] 문자열 다루기 기본 (0) | 2023.11.06 |