[혼공머] Chp. 02 데이터 다루기

Seyi·2022년 6월 11일
0

Chapter 02 데이터 다루기

1. 훈련세트와 테스트 세트

머신러닝 알고리즘의 성능을 정확히 평가하기 위해서는 훈련 세트와 테스트 세트를 구분해서 사용해야 한다.

  • 훈련 세트: 머신러닝에서 학습에 사용되는 데이터
  • 테스트 세트: 머신러닝에서 성능 평가에 사용되는 데이터

데이터 준비

특성 데이터인 fish_data와 타깃 데이터(라벨이라고도 불립니다)인 fish_target 데이터를 구분해줍니다.


훈련 세트와 테스트 세트 분리

numpy를 import 해준 후, 파이썬 리스트 형태의 데이터를 넘 파이 array() 함수에 전달해 줍니다.

np.random() 함수를 사용해서 인덱스로 사용할 번호를 랜덤하게 섞어줍니다. 여기서 seed 넘버를 지정해주면 실행할 때마다 일정한 결과를 얻을 수 있습니다.

이렇게 만들어진 인덱스 넘버를 사용해서 훈련데이터와 테스트 데이터를 나눠줍니다.

scikitlearn에는 model_selection()이라는 모듈 아래 train_test_split()이라는 훌륭한 함수가 있지만 처음 학습하는 사람들의 이해를 돕기 위해 수작업으로 훈련 세트와 테스트 세트를 나누었습니다. train_test_split() 함수는 아래에서 다뤄보도록 할게요.

데이터가 잘 섞였는지 확인하기 위해서 scatterplot을 그려보았습니다. 파란색은 훈련 세트, 주황색은 테스트 세트입니다. 각각 도미와 빙어에 적절히 잘 섞여 있습니다.

이렇게 구분된 데이터를 활용해서 k-최근접 이웃 알고리즘을 학습 시키고 테스트 데이터로 예측해보는 모델을 작동시킨 결과를 확인해볼 수 있습니다.


2. 데이터 전처리

사이킷런으로 훈련 세트와 테스트 세트 나누기

from sklearn.model_selection import train_test_split 

위의 코드를 사용해서 훈련 데이터와 테스트 데이터를 구분할 수 있습니다. 자동으로 랜덤 하게 데이터를 섞어주는 편리한 기능입니다!

다만, 기존에 도미데이터가 35개이고 빙어 데이터가 14개였던 것을 생각하면 test_target 데이터에 있는 데이터는 1(도미)이 10개, 0(빙어)이 3개로 빙어의 비율이 적게 들어 가 있다는 것을 알 수 있습니다. 이 문제를 해결해 보겠습니다.

train_test_split( ) 에서 stratify를 지정해주면 원하는 비율대로 데이터를 분리할 수 있습니다. 원래 타깃 데이터의 비율만큼 데이터를 나누기 위해 stratify=fish_target으로 지정해주니 원본 데이터의 비율과 비슷하게 데이터가 분리되었네요!

스케일이 다른 특성 처리

길이가 25, 무게가 150인 도미 데이터를 예측해보려고 합니다.

데이터를 학습 시킨 후 예측 결과를 보니 도미가 아닌 빙어로 데이터가 나왔습니다..! 모델에 어떤 문제가 있는 걸까요?

산점도를 그려봤을 때, 해당 도미는 빙어 그룹보다는 도미 그룹에 더 가까운 것으로 보입니다. 그런데 왜 빙어로 판단을 한 걸까요?

KNeighborsClassifier 클래스는 주어진 샘플에서 가장 가까운 이웃을 찾아주는 kneighbors( ) 함수를 제공해줍니다. 길이가 25, 무게가 150인 도미 데이터를 넣어보니 이웃 샘플들의 인덱스를 확인할 수 있습니다. 이웃 샘플의 인덱스 정보를 indexes 변수에 담아주겠습니다.

산점도를 그려서 이웃 샘플들의 위치를 확인해보겠습니다. 초록색 마름모에 해당하는 데이터가 이웃샘플 데이터인데요, 빙어가 이웃 샘플에 더 많이 들어있다는 점을 확인할 수 있습니다. 왜 이런 일이 생긴 걸까요?

두 특성의 스케일이 다르기 때문입니다. 즉, x축의 길이보다 y축의 길이가 훨씬 길기 때문입니다. x축은 0부터 40까지의 범위에서 그려지지만 y축은 무려 1000까지 범위가 주어져 있네요. 그래서 육안으로 봤을 때 y축 길이가 멀지 않은 것 같지만 실제로는 훨씬 더 멀다고 판단되는 것입니다.

이를 육안으로 확인해보기 위해서 x축의 길이도 y축과 마찬가지로 1000으로 변경해보았습니다. 그랬더니 x축의 변화가 분류에 큰 영향을 주지 못한다는 점이 보이네요.

데이터를 표현하는 기준이 다르면 알고리즘이 올바르게 예측할 수 없습니다. 알고리즘이 거리 기반일 때 특히 그러한 현상이 발생하는데요, 이렇듯 특성의 스케일이 다른 경우 데이터 전처리를 통해서 특성 값들을 일정한 기준으로 맞춰주는 작업이 필요합니다.

대표적으로 표준점수를 사용할 수 있습니다.

표준점수 = (기존 값 - 평균) / 표준편차

훈련 데이터의 표준점수를 구해서 train_scaled 변수에 담아줍니다.

예측 대상인 길이 25, 무게 150짜리 도미 데이터도 마찬가지로 표준점수를 구해 new라는 변수에 담아주었습니다.

전처리 데이터로 산점도를 그려보았습니다.

전처리 데이터로 모델을 학습시킨 결과, 길이 25에 무게 150인 생선을 올바르게 도미로 예측한 것을 확인했습니다!!!

kneighbors( ) 함수로 이웃 샘플의 인덱스를 받아 산점도를 그렸더니 이번에는 이웃 샘플들이 도미로 잘 잡히는 것을 볼 수가 있습니다.

다음 장에서는 회귀 모델과 규제에 대해서 학습해보겠습니다~!

profile
머신러닝 딥러닝 학습기록

0개의 댓글