훈련 & 학습 데이터(train & test set), 무작위 추출, 샘플링 편향(1)

G·2023년 1월 9일
0

지도학습이란

머신러닝 알고리즘은 지도 학습(supervised learning)비지도 학습(unsupervised learning)으로 나눌 수 있다.
지도학습은 학습 알고리즘을 위한 데이터와 정답이 필요하다.
지도학습에서 생선의 길이와 무게는 입력(input)타깃(target)이라 하고 이 둘을 합쳐 훈련 데이터(training data)라고 부른다.

지도 학습은 정답이 있으니 알고리즘이 정답을 맞히는 것을 학습한다.
비지도 학습은 정답이 주어지지 않고 입력 데이터만 사용한다.
이런 종류의 알고리즘은 정답을 사용하지 않으므로 무언가를 맞힐 수 없다.
(대신 데이터를 파악하거나 변형하는데 도움을 준다.)

훈련 세트와 테스트 세트

훈련 세트(train set)는 모델을 학습시킬 때 사용하는 데이터이고 테스트 세트(test set)는 모델의 성능을 평가할 때 사용한다.
일반적으로 준비된 데이터 세트의 일부를 떼어내어 사용한다.
(만약 훈련 세트로 학습을 시키고 훈련 세트로 성능을 평가한다면 무조건 100%가 나올 것이다)

하나의 데이터를 sample이라 부른다.

이제 생선의 두 class를 두 개의 feature(길이, 무게)로 나눈 후 학습 및 정확도 계산을 진행합니다.

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: 45, test: 14 나누기
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

scroe는 0이 나온다.

score가 0이 나오는 이유가 뭘까? fish_length, fish_weight를 유심히 보면 알겠지만 앞에서 35개는 도미, 14개는 빙어의 샘플이 존재했기 때문이다.
도미 데이터만 학습하고 빙어로 테스트를 했기 때문에 당연한 결과이다.
이를 두고 샘플링 편향이라 부른다.

무작위 추출

이를 위해 numpy를 사용해야한다. 샘플링 편향을 일으키지 않기 위해 샘플을 임의로 뽑아
train set과 test set을 추출하는 과정을 알아보자
(배열을 섞은 후 나누는 방식과 무작위로 샘플을 고르는 방식이 있다. 후자를 택한다.)

import numpy as np
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
# 인덱스 무작위 추출
np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)
# train, test set 나누기 35, 14
train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]
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.fit(train_input, train_target)
kn.score(test_input, test_target) # 정확도
print(kn.predict(test_input)) # 샘플 예측
print(test_target) # 기존 샘플과 비교

산점도


위와 같이 train set과 data set이 나뉘어진 것을 확인할 수 있다.

Colab codes

Source codes

profile
열심히 안 사는 사람

0개의 댓글