본문 바로가기

머신러닝&딥러닝

머신러닝&딥러닝 (5) - 서포트 백터 머신

2023-06-12 수업내용

 

1. 손글씨 데이터셋 살펴보기

불러오기

from sklearn.datasets import load_digits

* 공식 문서 참조

digits = load_digits()
digits.key()

data = digits['data']
data.shape

data[0]

 

  • sklearn의 dataset에서 digits(손글씨 데이터셋)을 불러옴
  • digits의 객체를 생성하고
  • digits의 key 값 중 data를 확인함

불러오기

import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 5, figsize = (14, 8))
for i, ax in enumerate(axes.flatten()):
    ax.imshow(data[i].reshape((8, 8)), cmap ='gray')
    ax.set_title(target[i])

  • matplotlib의 subplot 을 이용하여 2행 5열로 구성된 subplot을 만듬
  • figsize를 이용하여 size는 (14, 8)로 생성
  • axes 배열을 flatten을 이용하여 평탄화 함
  • data 배열의 i번째 원소를 8x8 크기로 하고 gray로 표시
  • 제목은 target의 i번째로 함

 

2. 정규화

  • 네이버 평점 1 ~ 10
  • 넷플릭스 평점 1 ~ 5 와 같이 스케일이 다를때 사용함
data[0]

불러오기

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaled = scaler.fit_transform(data)
scaled[0]

  • sacler의 객체를 생성
  • data를 넣어 스케일 조정을 함
  • 이때 스케일 조정은 크기에 맞게 0 ~ 1 까지의 실수로 조절됨

 

불러오기

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(scaled,
                                                                            target,
                                                                            test_size = 0.2,
                                                                            random_state = 15)

print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)

 

3. Support Vector Machine(SVM)

  • 두 클래스로부터 최대한 멀리 떨어져 있는 결정경꼐를 찾는 분류기로 특정 조건을 만족하는 동시에 클래스를 분류하는 것을 목표로 함

불러오기

from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
model = SVC()
model.fit(X_train, y_train)
pred = model.predict(X_test)
pred

accuracy_score(y_test, pred)

print(y_test[0], pred[0])
plt.imshow(X_test[0].reshape(8,8))
plt.show()

  • 예측 : 9, 정답 : 9 
fig, axes = plt.subplots(2, 5, figsize = (14, 8))

for i, ax in enumerate(axes.flatten()):
    ax.imshow(X_test[i].reshape(8,8), cmap = 'gray', interpolation='bicubic')
    ax.set_title(f'Label : {y_test[i]}, pred : {pred[i]}')

  • interpolation='bicubic' 을 이용하여 이미즈를 부드럽게 표시
  • 픽셀 사이의 값을 더 정교하게 추정하여 자연스러운 이미지를 얻을 수 있음