본문 바로가기
데이터 분석/혼자공부하는 머신러닝+딥러닝

02_1 훈련 세트와 테스트 세트

by Toddler_AD 2024. 11. 17.

지도 학습과 비지도 학습의 차이를 배웁니다. 모델을 훈련시키는 훈련 세트와 모델을 평가하기 위한 테스트 세트로 데이터를 나눠서 학습해 봅니다.

 

Situation & Target

  • 지도 학습과 비지도 학습
    • 머신러닝 알고리즘은 크게 지도 학습과 비지도 학습으로 나눌 수 있다.
    • 지도학습에서는 데이터와 정답을 input과 target이라고 하고, 이 둘을  합쳐 훈련 데이터라고 부른다.
    • 입력으로 사용된 특징을 feature 라고 부른다.
    • 비지도 학습은 target 없이 input 데이터만 사용하는 것.
    • 비지도 학습은 정답을 사용하지 않으므로, 무언가를 맞힐 수가 없다.

 

 

  • 훈련 세트와 테스트 세트
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()
print(fish_data[4])

print(fish_data[0:5])

print(fish_data[:5])

print(fish_data[44:])

# 훈련 세트로 입력값 중 0부터 34번째 인덱스까지 사용
train_input = fish_data[:35]

# 훈련 세트로 타깃값 중 0부터 34번째 인덱스까지 사용
train_target = fish_target[:35]

# 테스트 세트로 입력값 중 35부터 마지막 인덱스까지 사용
test_input = fish_data[35:]

# 테스트 세트로 타깃값 중 35부터 마지막 인덱스까지 사용
test_target = fish_target[35:]

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

  • 슬라이싱 연산으로 인댁스 0~34까지 처음 35개 샘플을 훈련 세트로 선택했고,
  • 인덱스 35~48까지 나머지 14개 샘츨을 테스트 세트로 선택
  • 훈련 세트로  fit() 메서드를 호출해 모델을 훈련하고, 
  • 테스트 세트로 score() 메서드를 호출해 평가한다.
  • 정확도 0.0 도출
  • 무엇이 문제인가?

 

  • 샘플링 편향
    • 마지막 14개 세트를 테스트 세트로 분류 하였기 때문에, 훈련 세트에는 빙어가 들어있지 않았다.
    • 훈련 세트와 테스트 세트 데이터에 도미와 빙어가 골고루 섞여 있어야 한다.
    • 그러나, 골고루 섞여 있지 않고 한쪽으로 치우쳐 있는 상황을 샘플링 편향(Sampling bias)이라고 부른다.
    • 위의 예에서는 훈련 세트에 도미만 있기 때문에, 테스트 세트의 정답 빙어를 하나도 맞추지 못한다.
    • 넘파이를 통해 훈련 세트와 테스트 세트의 샘플을 골고루 추출할 수 있다.

 

 

  • 넘파이
import numpy as np

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

for i, data in enumerate(input_arr):
    if i%5 == 0:
        print()  # 6번째 데이터 이후 줄바꿈
    print(data, end=" ")

print(input_arr.shape)

np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)
train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]
print(input_arr[13], train_input[0])

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

  • 넘파이 배열로 변환하여, 49개의 샘플과 2개의 특성이 있는 것을 확인하였다.
  • 앞서 만든 index 배열의 처음 35개를 input_arr와 taret_arr에 전달하여 랜덤하게 35개의 샘플을 훈련세트로 만든다.
  • 나머지 14개를 테스트 세트로 만든다.
  • 파란색이 훈련 테스트고 주황색이 테스트 세트.
  • 의도대로 양쪽에 도미와 빙어가 모두 섞였다.
  • 모델을 다시 훈련시켜보자.

 

Action & Result

  • 두 번째 머신러닝 프로그램
kn.fit(train_input, train_target)

kn.score(test_input, test_target)

kn.predict(test_input)

test_target

 

  • KNeighborsClassifier() 객체를 새로 만든다.
  • 이전에 만든 kn() 객체를 그대로 사용한다.
  • score() = 1.0 으로 확인할수 있듯, 
  • 100%의 점수로 테스트 세트에 있는 모든 생선을 맞혔다.
  • predict()의 예측결과 = test_target 임을 확인할 수 있다.
  • 출력 결과가 array로 감싸 있는 것이 numpy 배열 임을 의미한다.
  • 즉, predict() 메서드가 반환하는 값은 단순한 파이썬 리스트가 아니라 numpy  배열이다.
  • 싸이킷런 모델의 입력과 출력은 모두 numpy 배열이다. 
  • numpy 는 파이썬의 리스트와 비슷하지만,
  • 고차원의 큰 배열을 효과적으로 다룰 수 있고,
  • 다양한 도구를 많이 제공한다.

'데이터 분석 > 혼자공부하는 머신러닝+딥러닝' 카테고리의 다른 글

02_2 데이터 전처리  (3) 2024.11.17
01-3 마켓과 머신러닝  (1) 2024.11.10