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