2 분 소요

❗ 문제점 ❗

chap 1-3 에서 만든 K-최근접 이웃 알고리즘 이 문제점이 발견되었다. fish_data에 해당하는 정답인 fish_target을 알려주고, score함수를 통해서 정확도를 판단했기 때문이다. 그렇게 된다면 해결책은 간단하다.

💡 해결책 💡

fish_data와 fish_target 리스트에서 일부는 훈련용으로, 나머지는 테스트용으로 나누면 된다.

✨ 훈련 세트와 테스트 세트

📖 지도 학습과 비지도 학습

🎰 머신 러닝 🎰

  • 지도 학습 : 정답이 있으니 알고리즘이 정답을 맞히는 것을 학습하는 것

    • k-최근접 이웃 알고리즘
  • 비지도 학습 : 타깃 없이 입력 데이터만을 사용

  • 강화 학습

지도 학습에서는 데이터를 입력 이라고 하고, 정답을 타깃 이라고 한다.
입력 + 타깃 = 훈련 데이터 이다.
특성1, 특성2,,, > 입력 > 입력 + 타겟 > 훈련 데이터

1️⃣ 데이터 모으기

chap 1-3과 같은 과정을 통해서 fish_data와 fish_target리스트를 만들어준다.

from sklearn.neighbors import KNeighborsClassifier

bream_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]
bream_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]

smelt_length = [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]
smelt_weight = [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]

length = bream_length + smelt_length
weight = bream_weight + smelt_weight
fish_data = [[l, w] for l, w in zip(length, weight)]
fish_target = [1] * 35 + [0] * 14

하나의 생선 데이터를 샘플 이라고 한다.

2️⃣ 넘파이를 통해서 배열로 바꾸기

파이썬의 대표적인 배열 라이브러리이다. fish_data = [[l, w] for l, w in zip(length, weight)] 를 통해서 간단히 2차원 배열을 만들 수 있는데 굳이 왜 넘파이를 사용할까? 2차원 리스트를 넘파이를 통해서 배열로 바꾸게 된다면 넘파이에서 사용할 수 있는 함수들을 사용하기에 유리하다.

import numpy as np

input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
print(input_arr.shape)  # -> (49, 2)
  • array() 함수 : 파이썬 리스트를 넘파이 배열로 바꾸어 줌
  • shape() 함수 : 출력값이 (샘플 수, 특성 수)로 출력된다.(= (행, 열))

3️⃣ 샘플링 편향 없이 훈련 세트와 테스트 세트 나누기

현재, 배열로 가지고 있는 값은 input_arr과 target_arr이다. 이 두 배열을 서로 매칭이 되어있기 때문에 무작정 랜덤으로 훈련 세트와 테스트 세트를 뽑으면 안된다.

💡 sol

  1. 샘플 개수만큼의 인덱스가 들어있는 배열을 만든다.(arrange()) 이때, 랜덤이지만, 진짜 랜덤처럼 출력할 때마다 샘플의 순서가 달라진다면 제대로된 정확도를 알 수 없기 때문에 랜덤같지만 순서는 출력할 때마다 같게 만들어 준다.(seed())
np.random.seed(42)
index = np.arange(49)
  1. 인덱스를 랜덤으로 섞어준다.(shuffle())
np.random.shuffle(index)
  1. 섞어진 인덱스에 해당하는 입력과 타깃을 훈련 세트와 테스트 세트로 분리해준다.
train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]
  • 배열 인덱싱 : 한 번에 여러 인덱스 사용 가능

🌗 두 번째 머신러닝 프로그램

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

댓글남기기