[혼자 공부하는 머신러닝+딥러닝] 책의 내용을 정리한 글 입니다.
개념
k-최근접 이웃 같은 거리 기반 알고리즘은 샘플 간의 거리에 영향을 많이 받는다.
때문에 모델을 훈련할 때 특성 간의 스케일이 다른 경우 특성값을 일정한 기준으로 맞춰 주어야 한다.
이런 작업을 데이터 전처리(data preprocessing)라고 부른다.
(+ 모든 알고리즘이 데이터 전처리가 필요한 건 아니다! 트리 기반 알고리즘들은 특성의 스케일이 다르더라도 잘 동작한다.)
가장 널리 사용하는 전처리 방법 중 하나는 표준점수(혹은 z 점수) 이다.
표준점수
- 각 특성값이 평균에서 표준편차의 몇 배만큼 떨어져 있는지를 나타낸다.
- 표준점수를 통해 실제 값의 크기와 상관없이 동일한 조건으로 비교가 가능하다.
그렇다면, 표준점수는 어떻게 구하는 걸까?
수린이 이기 때문에 하나씩 풀고 풀어보자.
표준점수 = (특성의 평균 - 샘플 하나의 특성값) / 표준편차
- 표준편차 = 분산의 제곱근
- 분산 = 편차 제곱의 평균
- 편차 = 데이터에서 평균을 뺀 값
- 분산 = 편차 제곱의 평균
위 글 덕분에 분산과 표준편차에 대해 쉽게 이해했다.
코드 작성
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-최근접 이웃 객체의 메서드로, 가장 가까운 이웃을 찾아 거리와 이웃 샘플의 인덱스를 반환
'Machine Learning' 카테고리의 다른 글
[혼자 공부하는 머신러닝 + 딥러닝] 로지스틱 회귀 (0) | 2023.04.27 |
---|---|
[혼자 공부하는 머신러닝 + 딥러닝] 특성 공학과 규제 (0) | 2023.04.21 |
[혼자 공부하는 머신러닝 + 딥러닝] 선형 회귀 (0) | 2023.04.15 |
[혼자 공부하는 머신러닝 + 딥러닝] k-최근접 이웃 회귀 (0) | 2023.04.11 |
[혼자 공부하는 머신러닝+딥러닝] 훈련 세트와 테스트 세트 (0) | 2023.04.09 |