Notice
Recent Posts
Recent Comments
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

SYDev

Chapter 02-1: 훈련 세트와 테스트 세트 본문

KHUDA 4th/머신러닝 기초 세션

Chapter 02-1: 훈련 세트와 테스트 세트

시데브 2023. 7. 30. 19:46

지도 학습과 비지도 학습

  • 지도 학습(supervised learning): 입력타깃을 전달하여 모델을 훈련한 다음 새로운 데이터를 예측하는 데 활용한다.
  • 비지도 학습(unsupervised learning): 타깃 데이터 없이 학습한다. 따라서 입력 데이터에서 어떤 특징을 찾는 데 주로 활용한다. 
  • 지도학습에서 데이터와 정답을 입력(input)타깃(target)이라 부르며, 이 둘을 합쳐 훈련 데이터라 부른다.

 

훈련 세트와 테스트 세트

  • 훈련 세트(train set): 모델을 훈련할 때 사용하는 데이터이다. 보통 훈련 세트는 크면 클수록 좋다.
  • 테스트 세트(test set): 훈련된 모델을 평가할 때 사용하는 데이터이다. 보통 전체 데이터에서 20~30%를 테스트 세트로 사용하는 경우가 많다. 전체 데이터 크기가 커질수록 테스트 세트의 비율을 줄여도 충분해진다.

 

샘플링 편향

 chapter 01-3에서 다루었던 모델을 훈련 세트(처음 35개)와 테스트 세트(나머지 14개)를 나누어 평가해보자.

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 = [[l, w] for l, w in zip(fish_length, fish_weight)]
fish_target = [1] * 35 + [0] * 14

from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()

train_input = fish_data[:35]
train_target = fish_target[:35]
test_input = fish_data[35:]
test_target = fish_target[35:]

kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)

 그러나 위와 같이 균등하지 않게(훈련 세트에는 도미의 데이터만, 테스트 세트에는 빙어의 데이터만 들어감) 데이터를 나누면 다음과 같이 신뢰할 수 없는 정확도가 나오는 모델이 된다.

0.0

  이처럼 훈련 세트와 테스트 세트에 샘플이 균등하게 섞여있지 않은 것샘플링 편향(sampling bias)이라고 부른다.

 

넘파이

  • 넘파이(numpy): 파이썬의 대표적인 배열 라이브러리, 고차원 배열을 쉽게 만들고 조작할 수 있는 간편한 도구를 제공
import numpy as np #numpy의 import문
 
input_arr = np.array(fish_data) #파이썬 리스트를 넘파이 배열로 전환
target_arr = np.array(fish_target)  #파이썬 리스트를 넘파이 배열로 전환
print(input_arr.shape)  #(샘플 수, 특성 수) 출력
(49, 2)

 

문제 해결: 샘플링 편향

 샘플링 편향을 numpy를 이용하여 쉽게 해결할 수 있다.

np.random.seed(42)  #random하게 나오는 결과에 매겨진 시드
index = np.arange(49) #0부터 48까지 1씩 증가하는 인덱스
np.random.shuffle(index)  #인덱스 순서를 무작위로 변형
print(index)
[29 38  2 45 44 39 22 43 10  0 18 30 48 33 21  4 24 32 12 31 20 23 26 42
 14 15 40 41  9 36 11 47 17 28 37  5 46  3 35 16 13 34  7  6 27 19  1 25
  8]

-> 0부터 48까지의 인덱스를 무작위로 섞음

train_input = input_arr[index[:35]] #배열 인덱싱, train_input에 random하게 섞인 35개의 index 순서로 input_arr의 샘플을 전달
train_target = target_arr[index[:35]] #배열 인덱싱, train_target에 random하게 섞인 35개의 index 순서로 target_arr의 샘플을 전달
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]

-> 무작위로 섞인 index를 이용하여 균등하게 훈련 세트와 테스트 세트를 나눔(같은 index를 공유하기 때문에 input과 target 상관관계가 섞이지 않음)

import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1]) #train_input에 저장된 첫 번째 특성이 x축, 두 번째 특성이 y축
plt.scatter(test_input[:,0], test_input[:,1]) #test_input에 저장된 첫 번째 특성이 x축, 두 번째 특성이 y축
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

-> 균등하게 섞인 훈련 세트와 테스트 세트(파란색이 훈련 세트, 주황색이 테스트 세트)

kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)
kn.predict(test_input)
test_target
1.0
array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])
array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])

-> 100%의 정확도, predict를 이용해 출력한 테스트 세트의 예측 결과와 실제 타깃이 일치

-> predict의 결과가 array()로 감싸 있는 것은 해당 값이 넘파이 배열이기 때문

 


참고자료

  • 박해선, <혼자 공부하는 머신러닝+딥러닝>, 한빛미디어(주), 2022.2.4