본문 바로가기
수업 복습/머신러닝과 딥러닝

서포트벡터 머신

by 김복칠 2024. 1. 8.

1. 손글씨 데이터셋

from sklearn.datasets import load_digits
digits = load_digits()

data = digits['data']
target = digits['target']

import matplotlib.pyplot as plt
  • 손글씨 데이터셋은 아이리스 데이터셋과 같이 사이킷런에서 제공하는 데이터셋 중 하나입니다
  • 손글시 데이터셋을 불러온 뒤 데이터를 matplotlib을 통해 나타내 줍니다
fig, axes = plt.subplots(3,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])

  • 손글씨 데이터셋은 각각의 데이터가 64픽셀이 한줄로 나열되어 있는 구조인데 8x8 구조로 바꾸어서 출력하게 되면 위와 같은 모습으로 출력되는걸 볼수 있습니다

2. 스케일링

  • 데이터를 특정한 스케일로 통일하는 것
  • 다차원의 값들을 비교 분석하기 쉽게 만들어주며, 자료의 오버플로우나 언더플로우를 방지하여 최적화 과정에서의 안정성 및 수렴 속도를 향상
  • 데이터를 모델링하기 전에 거치는 것이 좋음(int, float)

2-1. 스케일링의 종류

  • StandardScaler : 평균과 표준편차를 사용
  • MinMaxScaler : 최대, 최소값이 각각 1과 0이 되도록 스케일링
  • RobustScaler : 중앙값과 IQR사용(아웃라이어의 영향을 최소화)
import pandas as pd
movie = {'naver':[2,4,6,8,10], 'netflix':[1,2,3,4,5]}
movie = pd.DataFrame(data=movie)
  • 먼저 임의의 데이터를 두개 만들어 주고 pd화 해줍니다
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
min_max_scaler = MinMaxScaler()
min_max_scaler = min_max_scaler.fit_transform(movie)
  • 데이터를 보면 수는 같지만 범위가 다른걸 알수 있습니다
  • 이런 경우에는 스케일링을 통해 정규화를 해주어야 합니다
  • 데이터의 중요도가 자체적인 크기로만 인식되면 안되기 때문입니다
  • 해서 먼저 MinMaxScaler() 를 활용해 데이터를 학습시키고 새로 변수에 넣어줍니다
pd.DataFrame(min_max_scaler, columns=['naver', 'netflix'])

  • 스케일링을 끝내고 난 데이터를 출력해보면 중요도가 같게 구성이 된걸 볼수 있습니다

2-2. 정규화(Nomalization)

  • 값의 범위(scale)을 0 ~ 1 사이의 값으로 바꿔주는 것
  • 학습전에 scaling 하는 것
  • 머신러닝에서 scale이 큰 feature의 영향이 비대해지는 것을 방지
  • scikit-learn에서 MInMaxScaler 사용
scaler = MinMaxScaler()
scaled = scaler.fit_transform(data)
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=2023)
scaled[1]

  • 위의 과정을 바탕으로 손글씨 데이터셋 데이터를 정규화를 통해 학습을 시켜주고 정규화가 된 데이터 중 1번 인덱스를 찍어보면 0 ~ 1 사이의 값으로 구성된걸 볼 수 있습니다

2-3. 표준화(Standardization)

  • 값의 범위(scale)를 평균 0, 분산 1이 되도록 바꿔주는 것
  • 학습 전에 scaling 하는 것
  • 머신러닝에서 scale이 큰 feature의 영향이 비대해지는 것을 방지
  • 정규분포를 표준정규분포로 변환하는 것과 같음
  • scikit_learn 에서 StandardScaler 사용

3. Support Vector Machine(SVM)

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

from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

model = SVC()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy_score(y_test, y_pred)
# 결과 : 0.9916666666666667
  • 마지막으로 SVM을 통해 학습한 데이터가 맞는지 최종적으로 확인해 주면 손글씨 데이터셋의 정확도를 확인할 수 있습니다

'수업 복습 > 머신러닝과 딥러닝' 카테고리의 다른 글

lightGBM  (0) 2024.01.09
랜덤 포레스트  (0) 2024.01.09
로지스틱 회귀  (0) 2024.01.08
의사 결정 나무  (0) 2024.01.03
선형 회귀  (1) 2023.12.29