AI/혼자공부하는머신러닝딥러닝

[ML] 02-1 훈련 세트와 테스트 세트

inthyes 2024. 1. 18. 17:44

지도 학습과 비지도 학습

지도 학습

: 입력과 타깃을 전달하여 모델을 훈련한 다음 새로운 데이터를 예측하는 데 활용

비지도 학습

: 타깃 데이터 없이 입력 데이터에서 어떤 특징을 찾는 데 주로 활용

훈련 세트

: 모델을 훈련할 때 사용하는 데이터로 보통 훈련 세트가 클수록 좋기 때문에 테스트 데이터를 제외한 모든 데이터를 사용

테스트 세트

: 일반적으로 전체 데이터에서 20~30%를 테스트 세트로 사용


훈련 세트와 테스트 세트

생선의 길이와 무게를 위한 리스트를 생성한다.

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]

 

 

각 생선의 길이와 무게를 하나의 리스트로 담은 2차원 리스트를 생성한다.

fish_data = [[l, w] for l, w in zip(fish_length, fish_weight)]
fish_target = [1] * 35 + [0] * 14

 

 

사이킷런의 KNeighborsClassifier 클래슬르 임포트하고 모델 객체를 생성한다.

from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()

 

슬라이싱 연산으로 인덱스 0~34까지 처음 35개 샘플을 훈련 세트로 선택하고, 인덱스 35~48까지 나머지 14개 샘플을 테스트 세트로 선택한다.

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

 

아래와 같이 score()메소드를 호출해 평가를 진행하면 0.0, 즉 정확도 0을 확인할 수 있다.

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

샘플링 편향

fish_data에는 처음부터 순서대로 35개의 도미, 14개의 빙어 샘플이 삽입되어 있었기 때문에 마지막 14개를 테스트 세트로 생성할 경우 빙어 데이터만 삽입되는 문제가 발생된다.

 

일반적으로 훈련 세트와 테스트 세트에 샘플이 골고루 섞여 있지 않으면 샘플링이 한쪽으로 치우쳤다는 의미로 샘플링 편향이라고 부른다.


넘파이

import numpy as np

 

아래 코드와 같이 array()함수에 파이썬 리스트를 전달하는 것을 통해 파이썬 리스트를 넘파이 배열로 변경할 수 있다.

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

print(input_arr)

 

input_arr 출력값

 

샘플 수, 특성 수를 출력할 수 있는 shape 속성을 활용하여 출력한다.

print(input_arr.shape)

 

input_arr.shape 출력값

 

무작위로 훈련 세트를 나누기 위해 인덱스를 생성하고 배열을 무작위로 섞는 과정을 수행한다.

np.random.seed(42) # 일정한 결과를 얻기 위한 랜덤시드 지정으로, 매번 다른 랜덤값을 지정받기 위해서는 주석처리 후 코드 실행
index = np.arange(49) # 0부터 N-1까지 1씩 증가하는 배열 생성
np.random.shuffle(index) # 주어진 배열을 무작위로 변경

print(index)

 

 

아래와 같이 넘파이는 배열 인덱싱이 가능하다.

[1,3]일 경우 input_arr에서 두번째와 네번째 샘플을 출력한다.

print(input_arr[[1, 3]])

 

랜덤하게 섞여 있는 샘플들 중 0~ 34에 위치하는 샘플들을 훈련 세트로 지정한다.

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

 

아래와 같이 남은 14개를 테스트 세트로 생성한다.

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

 

 

산점도를 통해 훈련 세트와 테스트 세트가 잘 섞여 있는지 확인 가능하다.

import matplotlib.pyplot as plt
plt.scatter(train_input[:, 0], train_input[:, 1])
plt.scatter(test_input[:, 0], test_input[:, 1])
plt.xlabel('length')
plt.ylabel('weight')
plt.show()


두 번째 머신러닝 프로그램

모델 테스트를 수행한다.

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

 

predict()메서드로 테스트 세트의 예측결과와 실제 타깃을 확인한다.

kn.predict(test_input)

 

test_target

 

테스트 세트에 대한 예측 결과가 정답과 일치하는 것을 확인할 수 있다.

'AI > 혼자공부하는머신러닝딥러닝' 카테고리의 다른 글

[ML] 03-3 특성 공학과 규제  (0) 2024.01.20
[ML] 03-2 선형 회귀  (0) 2024.01.20
[ML] 03-1 k-최근접 이웃 회귀  (0) 2024.01.20
[ML] 02-2 데이터 전처리  (0) 2024.01.20
[ML] 01-3 마켓과 머신러닝  (0) 2024.01.18