본문 바로가기
Machine Learning

[혼자 공부하는 머신러닝+딥러닝] 데이터 전처리

by 가론노미 2023. 4. 11.
[혼자 공부하는 머신러닝+딥러닝] 책의 내용을 정리한 글 입니다.

 

개념

k-최근접 이웃 같은 거리 기반 알고리즘은 샘플 간의 거리에 영향을 많이 받는다.

 

때문에 모델을 훈련할 때 특성 간의 스케일이 다른 경우 특성값을 일정한 기준으로 맞춰 주어야 한다.

이런 작업을 데이터 전처리(data preprocessing)라고 부른다.

(+ 모든 알고리즘이 데이터 전처리가 필요한 건 아니다! 트리 기반 알고리즘들은 특성의 스케일이 다르더라도 잘 동작한다.)

 

가장 널리 사용하는 전처리 방법 중 하나는 표준점수(혹은 z 점수) 이다.

표준점수

  • 각 특성값이 평균에서 표준편차의 몇 배만큼 떨어져 있는지를 나타낸다.
  • 표준점수를 통해 실제 값의 크기와 상관없이 동일한 조건으로 비교가 가능하다.

그렇다면, 표준점수는 어떻게 구하는 걸까?

수린이 이기 때문에 하나씩 풀고 풀어보자.

 

표준점수 = (특성의 평균 - 샘플 하나의 특성값) / 표준편차

  • 표준편차 = 분산의 제곱근
    • 분산 = 편차 제곱의 평균
      • 편차 = 데이터에서 평균을 뺀 값

https://math100.tistory.com/9

 

분산과 표준편차 구하는 법

통계에서 분산과 표준편차를 구할 때는 먼저 분산을 구한 다음, 분산에 루트를 씌워서 표준편차를 구한다. 그래서 데이터가 주어지면 먼저 분산을 구해야 하는데, 예를 들어 어떠한 실험에서 데

math100.tistory.com

위 글 덕분에 분산과 표준편차에 대해 쉽게 이해했다.

 

코드 작성

numpy의 mean(), std() 함수와 브로드캐스팅 기능을 이용하여 데이터 전처리 후 모델을 훈련시켜보자.

넘파이로 데이터 준비

import numpy as np

fish_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 
                31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 
                35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0, 9.8, 
                10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
fish_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 
                500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 
                700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0, 6.7, 
                7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

fish_data = np.column_stack((fish_length, fish_weight))
fish_target = np.concatenate((np.ones(35), np.zeros(14)))

사이킷런의 train_test_split() 함수로 훈련 세트와 테스트 세트 나누기

from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, stratify=fish_target, random_state=42)

기준을 맞추기 위한 데이터 전처리 진행

mean = np.mean(train_input, axis=0)
std = np.std(train_input, axis=0)

# 브로드캐스팅 - 크기가 다른 넘파이 배열에서 자동으로 사칙 연산을 모든 행이나 열로 확장하여 수행하는 기능
train_scaled = (train_input - mean) / std

전처리 데이터로 모델 훈련

* 중요 포인트 - 테스트 세트 데이터 전처리 진행할 때 훈련 세트의 평균과 표준편차로 변환해야 스케일을 정확히 맞출 수 있다.

from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier()
kn.fit(train_scaled, train_target)

# 위에서 구한 훈련 세트의 평균과 표준편차로 테스트 세트 전처리 진행
test_scaled = (test_input - mean) / std
kn.score(test_scaled, test_target)

 

이 장에서 사용된 핵심 패키지와 함수

numpy

  • ones(), zeros()
    • 각각 원하는 개수만큼 1과 0을 채운 배열을 반환
  • column_stack()
    • 전달받은 리스트를 일렬로 세운 다음 차례대로 나라히 연결하여 튜플로 반환
  • concatenate()
    • 전달받은 리스트를 일차원 배열로 연결하여 반환

scikit-learn

  • train_test_split()
    • 훈련 데이터를 훈련 세트와 테스트 세트로 나누는 함수
    • 여러개의 배열을 전달할 수 있고 테스트 세트로 나눌 비율은 test_size 매개변수에서 지정 가능 (기본값 0.25)
    • shuffle 매개변수로 세트를 나누기 전 무작위로 섞을지 여부 결정 가능 (기본값 True)
    • stratify 매개변수에 클래스 레이블이 담긴 배열 - 일반적으로 타깃 데이터 를 전달하면 클래스 비율에 맞게 나누어짐
  • kneighbors()
    • k-최근접 이웃 객체의 메서드로, 가장 가까운 이웃을 찾아 거리와 이웃 샘플의 인덱스를 반환