머신러닝 알고리즘은 크게 지도 학습과 비지도 학습으로 나눌 수 있다.
지도 학습 알고리즘은 훈련하기 위한 데이터와 정답(타겟)이 필요하다.
1강에서 봤던 마켓과 머신러닝에서 도미와 빙어의 길이와 무게를 알고리즘에 사용했다.
이 경우 정답을 도미인지 아닌지 여부이다.
지도 학습에서는 데이터와 정답을 입력(input)과 타겟(target)이라고 하며,
이를 합쳐 훈련 데이터라고 부른다.
입력으로 사용된 생선의 이름과 무게를 특성(feature)이라고 한다.
특성에 의해 타겟이 변경된다.
반면 비지도 학습 알고리즘은 타겟 없이 입력 데이터만 사용한다.
미리 학습하지 못하여 정답을 사용하지 않으므로 무언가를 맞힐 수가 없다.
대신 데이터를 잘 파악하거나 변형하는데 도움을 준다.
머신러닝 알고리즘의 성능을 제대로 평가하려면 훈련 데이터와 평가에 사용할 데이터가 각각 달라야 한다.
가장 간단한 방법은 평가를 위해 또 다른 데이터를 준비하는 것인데
우리는 이미 준비된 데이터중에서 일부를 떼어 내어 활용할 것이다.
이 경우 평가에 사용하는 데이터를 테스트 세트,
훈련에 사용되는 데이터를 훈련 세트라고 부른다.
상식적으로 훈련하는 데이터와 테스트하는 데이터에는 도미와 빙어가 골고루 섞여 있어야 한다.
훈련 세트와 테스트 세트에 샘플이 골고루 섞여있지 않으면
샘플링이 한쪽으로 치우치는 샘플링 편향이 발생한다.
훈련 세트와 테스트 세트를 나누기 전에
데이터를 섞든지 아니면 골고루 샘플을 뽑아서 세트를 만들어야 한다.
1. 랜덤하게 뽑기
numpy의 리스트에서 랜덤하게 요소를 섞을 수 있게
제공해주는 게 random.shuffle 메서드이다.
배열을 무작위로 섞어버린다.
# numpy 리스트에서 랜덤하게 샘플 선택하기
# 무작위로 샘플을 선택할 때 input_arr와 target_arr에서 같은 위치는 함께 선택되야함 -> 인덱스 값 기억 필요
# 항상 인덱스를 기억할 수 없으니 아예 인덱스를 섞은 다음 샘플 선택하기
# numpy의 random은 실행시마다 다른 결과 생성 -> 랜덤 시드 설정
np.random.seed(42)
index = np.arange(49) # 0 ~ n-1 (48)
np.random.shuffle(index) # 배열을 무작위로 섞음 shuffle
print(index)
2. 자동 크로스 밸리데이션 라이브러리
shuffle을 사용했을 때 단점은
무작위로 섞어도 샘플의 비율이 맞지 않을 수 있다는 점이다.
사이킷런이 제공하는 model_selection 라이브러리를 사용하면
자동으로 크로스 밸리데이션을 체크해준다.
from sklearn.model_selection import train_test_split
import numpy as np
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_target = [1]*35 + [0]*14 # 타겟 데이터
fish_data = np.column_stack((fish_length, fish_weight)) # 2차원 리스트로 변경
# 파이썬은 여러개의 값을 return 해줄 수 있다. 자바처럼 dto를 만들 필요 없는것이다.
train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target)
잘 나누어졌는지 확인해보자.
print(train_input.shape)
print(test_input.shape)
print(36/49) # 자연스럽게 약 7:3 비율로 맞춰준다.
나뉜 데이터중 훈련 세트로 훈련시킨 뒤
테스트 세트로 평가해보니 1.0으로 성공했다.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier(n_neighbors=5);
# 훈련
kn.fit(train_input, train_target)
# 평가
kn.score(test_input, test_target)
[출처]