이 포스팅은 혼자 공부하는 머신러닝 + 딥러닝 책을 공부하고 정리한 것 입니다.
훈련 세트와 테스트 세트
시험에서 연습 문제와 시험 문제가 달라야 올바르게 학생의 능력을 평가할 수 있듯이 머신러닝 알고리즘의 성능을 제대로 평가하려면 훈련 데이터와 평가에 사용할 데이터가 각각 달라야 한다.
이렇게 하는 가장 간단한 방법은 평가를 위해 또 다른 데이터를 준비하거나 이미 준비된 데이터 중에서 일부를 뗴어 내어 활용하는 것이다. 일반적으로 후자의 경우가 많다.
평가에 사용하는 데이터를 테스트 세트(test set), 훈련에 사용되는 데이터를 훈련세트(train set) 라고 한다.
먼저 도미와 빙어의 데이터를 합쳐 하나의 파이썬 리스트로 준비한다.
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
이때 하나의 생선 데이터를 샘플 이라고 부른다. 도미와 빙어는 각각 35,14마리가 있어 전체 데이터는 49개의 셈플이 있다. 사용하는 특성은 길이와 무게 2개이다. 이 데이터의 처음 35개를 훈련 세트로, 나머지 14개를 테스트 세트로 사용한다.
먼저 사이킷런의 KNeighborClassifier 클래스를 임포트하고 모델 객체를 만든다.
from sklearn.neighbors import KNeighborsClassifier
kn=KNeighborsClassifier()
샘플링 편향
만약 train set를 앞에서 35개로 짜르고 test set을 뒤에 14개로 자른다면 train set에는 빙어가 하나도 들어있지 않아 모델을 훈련하면 빙어를 올바르게 분류할 수가 없어 정확도가 0.0이 나오게 된다. 그러므로 훈련 세트와 테스트 세트를 나누려면 도미와 빙어가 골고루 섞이게 만들어야 한다.
일반적으로 훈련 세트와 테스트 세트에 샘플이 골고루 섞여 있지 않으면 샘플링이 한쪽으로 치우쳤다는 의미로 샘플링 편향 (sampling bias)라고 부른다.
input_arr=np.array(fish_data)
target_arr=np.array(fish_target)
np.random.seed(42)
index=np.arange(49)
np.random.shuffle(index)
print(index)
train_input=input_arr[index[:35]]
train_target=target_arr[index[:35]]
test_input=input_arr[index[35:]]
test_target=input_arr[index[35:]]
plt.scatter(train_input[:,0],train_input[:,1])
plt.scatter(test_input[:,0],test_input[:,1])
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
파란색이 훈련 세트이고 주황색이 테스트 세트이다. 양쪽에 도미와 빙어가 모두 섞여 있다.
두 번째 머신러닝 프로그램
앞서 만든 훈련 세트와 테스트 세트로 k-최근접 이웃 모델을 훈련시켜 보자. fit() 메서드를 실행 할 때마다 KNeighborsClassifier 클래스의 객체는 이전에 학습한 모든 것을 잃어버린다. 이전 모델을 그대로 두고 싶다면 KNeighborsClassifier 클래스 객체를 새로 만들어야 한다.
kn=kn.fit(train_input, train_target)
kn.score(test_input,test_target)
--> 1.0
kn.predict(test_input)
test_target
사이킷런 모델의 입력과 출력은 모두 넘파이 배열이다.
결론
모델을 훈련 할 때 사용한 데이터로 모델의 성능을 평가하는 것은 정답을 미리 알려주고 시험을 보는 것과 같다. 공정하게 점수를 메기기 위해서는 훈련에 참여하지 않은 샘플을 사용해야 한다.
테스트 세트를 그냥 무작정 나누어서는 안된다. 도미와 빙어를 분류하는 것이 목적이기 때문에 훈련 세트나 테스트 세트에는 어느 한 생성만 들어가 있다면 올바른 학습이 이루어지지 않을 것이다.
'Machine Learning > Basic' 카테고리의 다른 글
[3-3] 특성 공학과 규제 (0) | 2021.04.06 |
---|---|
[3-2] 선형 회귀 (0) | 2021.04.05 |
[3-1] k-최근접 이웃 회귀 (0) | 2021.04.05 |
[2-2] 데이터 전처리 (0) | 2021.04.04 |
[1] 머신러닝 맛보기 - 마켓과 머신러닝 (0) | 2021.04.03 |