[혼공머신] 머신러닝에서의 지도학습과 샘플링 편향

강민우·2022년 1월 11일
1
post-thumbnail

[혼자 공부하는 머신러닝+딥러닝] 책에 기반한 정리글입니다.
전체 소스코드는 아래 Github 링크에서 확인할 수 있습니다.

깃허브 링크

0. 개요

머신러닝에서의 지도학습비지도학습의 차이와 샘플링 편향에 대한 개념,
데이터를 훈련 세트테스트 세트로 나누어 모델을 훈련 · 평가한다.

1. 지도·비지도 학습

지도학습
입력과 타깃을 전달하여 모델을 훈련한 다음 새로운 데이터를 예측하는 데 활용
K-최근접 이웃 또한 지도 학습 알고리즘

비지도학습
타깃 데이터가 없어 무엇을 예측하는 것이 아닌 입력 데이터에서 어떤 특징을 찾는 데 활용

2. 훈련 세트와 테스트 세트, 샘플링 편향

머신 러닝의 성능을 제대로 평가하려면 훈련 데이터와 테스트 데이터가 각각 달라야 한다.

  • 평가를 위해 다른 데이터를 준비하거나,
  • 준비된 데이터 중에 일부를 떼어 내어 활용한다.

아래는 도미, 방어의 길이와 무게 리스트이다.

#도미 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]

#길이와 무게를 합친 2차원 리스트
fish_data = [[i, j] for i, j in zip(fish_length, fish_weight)]
#도미는 1, 빙어는 0으로 놓은 정답 리스트
fish_target = 35 * [1] + 14 * [0]


fish_data의 앞에서 35개는 도미, 이후 14개는 빙어로 편향되어 있다.
index 배열을 만들어 무작위로 셔플하고 훈련·테스트 세트를 만든다.

import numpy as np

#파이썬 리스트를 넘파이 배열로 바꾸기
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)

#배열에서 랜덤하게 샘플을 선택해 훈련세트와 테스트 세트로 만들기
index =np.arange(49) #0~48까지의 배열을 생성하여
np.random.shuffle(index) #무작위로 셔플

#훈련 세트와 테스트 세트를 셔플된 index로 재생성, 배열 인덱싱
train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]

3. 데이터 시각화로 훈련·테스트 세트 분포 확인

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()


훈련 세트와 테스트 세트가 잘 섞인 것을 볼 수 있다.

4. 모델 훈련 후 테스트

from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)

출력 1.0

훈련 세트로는 모델을 훈련하고, 테스트 세트로 모델을 평가했다.
100%의 정확도가 출력되었다.

profile
어제보다 성장한 오늘

0개의 댓글