훈련 세트와 테스트 세트

2025. 5. 1.·AI

지도 학습과 비지도 학습

머신러닝 알고리즘은 크게 지도 학습, 비지도 학습으로 나뉘는데요. 지도 학습 알고리즘은 훈련하기 위한 데이터와 정답이 필요합니다. 지도 학습에서는 데이터와 정답을 각각 입력(input)과 타깃(target)이라고 하고, 이 둘을 합쳐 훈련 데이터(training data)라고 부릅니다.


훈련 세트와 테스트 세트

머신 러닝 알고리즘의 성능을 제대로 평가하려면 훈련 데이터와 평가에 사용할 데이터가 각각 달라야 하는데요. 이렇게 하기 위한 가장 간단한 방법은 평가를 위한 또 다른 데이터를 준비하거나, 이미 준비된 데이터 중 일부를 떼어 내어 활용하는 것입니다. 평가에 사용하는 데이터를 테스트 세트(test set), 훈련에 사용되는 데이터를 훈련 세트(train set)라고 부릅니다.


구현해 보기

데이터 준비

하나의 데이터를 샘플(sample)이라 부름

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

2개의 특성(length, weight)을 가짐

데이터의 처음 35개를 훈련 세트로, 나머지 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.fit(train_input, train_target)
kn.score(test_input, test_target)

🤔 어라? 실행해 보니까 0.0이 출력되는데요?

🐢 훈련 세트와 테스트 세트에 샘플이 골고루 섞여 있지 않으면 샘플링이 한쪽으로 치우쳐져 샘플링 편향(sampling bias)이 발생합니다. 특정 종류의 샘플이 과도하게 많은 샘플링 편향을 가지고 있다면 제대로 된 지도 학습 모델을 만들 수 없죠!

 

넘파이(numpy) 배열 준비

import numpy as np

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

print(input_arr.shape) # 이 명령을 사용하면 (샘플 수, 특성 수) 출력

 

랜덤하게 샘플 선택; 랜덤하게 훈련 세트와 테스트로 만들기

input_arr와 target_arr에서 같은 위치는 함께 선택되어야 함

타깃이 샘플과 함께 이동하지 않으면 올바르게 훈련 X

np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)

넘파이에서 무작위 결과를 만드는 함수들은 실행할 때마다 다른 결과 만듦

일정한 결과를 얻기 위해서는 초기에 랜덤(random seed) 지정하기

np.arrange(N)

0에서부터 N-1까지 1씩 증가하는 배열 만듦

np.random.shuffle()

주어진 배열을 무작위로 섞음

 

배열 인덱싱(array indexing)

넘파이는 슬라이싱 외에 배열 인덱싱 기능 제공

배열 인덱싱은 1개의 인덱스가 아닌 여러 개의 인덱스로 한 번에 여러 개의 원소 선택 가능

train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]

넘파이 배열을 인덱스로 전달

앞서 만든 index 배열의 처음 35개를 input_arr와 target_arr에 전달하여 랜덤하게 35개의 샘플을 훈련 세트로 만듦

test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]

나머지 14개를 테스트 세트로 만듦

 

산점도를 그려 잘 섞였는지 체크

import matplotlib.pyplot as plt

plt.scatter(train_input[:, 0], train_input[:, 1])
plt.scatter(test_input[:, 0], test_input[:, 1])
# 2차원 배열은 행과 열 인덱스를 콤마(,)로 나누어 지정
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

 

k-최근접 이웃 모델 훈련

넘파이를 통해 만든 훈련 세트와 테스트 세트로 훈련

kn.fit(train_input, train_target) # 모델 훈련
kn.score(test_input, test_target) # 모델 테스트
# 1.0 출력(100% 정확도)
kn.predict(test_input)
# array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])
test_target
# array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])

 

출처: 박해선 님의 '혼자 공부하는 머신러닝 + 딥러닝'

저작자표시 비영리 변경금지 (새창열림)

'AI' 카테고리의 다른 글

데이터 전처리  (1) 2025.05.02
k-최근접 이웃 알고리즘(k-NN)  (0) 2025.03.14
시작하며  (0) 2025.03.10
'AI' 카테고리의 다른 글
  • 데이터 전처리
  • k-최근접 이웃 알고리즘(k-NN)
  • 시작하며
우는거북이
우는거북이
  • 우는거북이
    거북이는 울고 있다
    우는거북이
  • 전체
    오늘
    어제
    • 알아보기 (74) N
      • AI (4)
      • 언어 (16)
        • Python (15)
        • C언어 (1)
      • 알고리즘 (7)
      • 백준 (22)
      • 자료구조 (10)
      • 컴퓨터네트워크 (6)
      • 운영체제 (1)
      • 데이터통신 (8) N
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
우는거북이
훈련 세트와 테스트 세트
상단으로

티스토리툴바