본문 바로가기
데이터 사이언스/하계 AI 중급과정

Ch 2. 훈련 및 테스트 세트 (Train set, Test set)

by 수학과인데 공대생 2023. 7. 11.
728x90

Train_set과 Test_set의 정의는 아래 포스팅을 참고하기 바랍니다.
https://math-love.tistory.com/9

2. 데이터 세트 분리

데이터 세트 분리는 말 그대로 데이터를 분리하는 것이다. 2개의 데이터로 분리할 수 있는데 하나는 train데이터, 나머지 하나는 test데이터이다. train데이터는 말 그대로 훈련 데이터인데, 우리가

math-love.tistory.com

 
 

훈련 및 테스트 세트를 통한 물고기 분류

우선 데이터를 가져와 보겠습니다.
본 데이터는 이전 포스팅을 참고합니다.
https://math-love.tistory.com/15

Ch 1. ML 실습을 위한 환경

1. 환경 설정 import matplotlib import matplotlib.pyplot as plt import numpy as np import pandas as pd # 임의값 속성 정의 np.random.seed(42) # 그래프 속성 정의 plt.rcParams['axes.labelsize'] = 14 plt.rcParams['xtick.labelsize'] = 12 plt.rc

math-love.tistory.com

 

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]

 

plt.scatter(fish_length, fish_weight)
plt.xlabel('Length')
plt.ylabel('Weight')
plt.show()

 
길이와 무게가 작은 물고기와
길이와 무게가 물고기가 잘 분류되어 있는 모습입니다.
 
지난 포스팅에서 fish_length에 대한 정의를 살펴보겠습니다.

fish_length = a_length + b_length

fish_length는 a물고기와 b물고기의 길이의 합입니다.
fish_length[:35]까지는 a물고기의 정보가
fish_length[35:]까지는 b물고기의 정보가 담겨있음을 알 수 있습니다.
 

 

훈련 및 테스트 세트로 분리 (섞는 과정  x)

이제 물고기의 길이와 무게를 하나의 data 정보에 담아보겠습니다.
이후 데이터를 shuffle하지 않고 Train_set과 Test_set으로 분리해보겠습니다.

fish_data = [[l, w] for l, w in zip(fish_length, fish_weight)]
fish_target = [1] * 35 + [0] * 14 # 1 -> a물고기, 2 -> b물고기

지난번과 마찬가지로 a물고기를 '1', b물고기를 '0'이라고 하겠습니다.
 
이제 섞는 과정 없이 데이터를 Train_set과 Test_set으로 분리하겠습니다.

# Train set
train_input = fish_data[:35]
train_target = fish_target[:35]

# Test set
test_input = fish_data[35:]
test_target = fish_target[35:]

 
이제 sklearn을 통해 학습을 시켜보겠습니다.

from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier() #객체 생성
kn.fit(train_input, train_target)

 
Train set을 fit 시켜 model을 학습시켰습니다.
이제 Test set을 통해 model을 evaluate 해보겠습니다.

kn.score(test_input, test_target)
-> 0.0

0점이 나온 것을 확인할 수 있습니다.
아마 데이터를 섞지 않고 있는 그대로 Train set과 Test set을 분리시켰기 때문인 것 같습니다.
 
이제 Train set과 Test set의 shuffle을 통해 데이터를 섞고 분리해보겠습니다.
 
 

훈련 및 테스트 세트로 분리 (섞는 과정  o)

shuffle을 사용하기 위해서는 numpy패키지를 사용해야합니다.
 
우선 각각의 data를 numpy의 array로 변환합니다.

input_arr = np.array(fish_data)
target_arr = np.array(fish_target)

 
총 49개의 index만들고 shuffle 해보겠습니다.

np.random.seed(42) # random state 고정
index = np.arange(49)
np.random.shuffle(index)

 
Train set과 Test set을 설정합니다.

train_input = fish_data[index[:35]]
train_target = fish_target[index[:35]]

test_input = fish_data[index[35:]]
test_target = fish_target[index[35:]]

 
이제 model 객체를 만들고 학습시켜보겠습니다.

from sklearn.neighbors import KNeighborsClassifier

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

 
Test set을 이용해 model 평가를 진행해 보겠습니다.

kn.score(test_input, test_target)
-> 1.0

 
 

sklearn을 통한 DataSet 분리

sklearn모듈을 이용해서도 DataSet을 분리할 수 있습니다.

from sklearn.model_selection import train_test_split

# test_size = 0.2 -> Test set의 크기 지정
train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, test_size = 0.2, random_state = 42)

 

from sklearn.neighbors import KNeighborsClassifier

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

kn.score(test_input, test_target)
-> 1.0

model에 대한 평가가 위와 같은 결과로 나옵니다.

728x90