본문 바로가기

인공지능(AI) 공부/혼자 공부하는 머신러닝+딥러닝

[혼공머신] 02-1. 훈련 세트와 테스트 세트

머신러닝 알고리즘은 크게 지도 학습, 비지도 학습으로 나눌 수 있다.

지도 학습은 인간이 컴퓨터에게 데이터(문제)와 답(타깃)을 넘겨주고 관련된 규칙성을 찾아내도록 하는 학습 방법이다.

비지도 학습은 인간이 컴퓨터에게 데이터(문제)만 넘겨주고 컴퓨터가 알아서 데이터의 특성에 따라 분류하는 학습 방법이다.

 

지도 학습에서는 데이터와 정답을 입력(input), 타깃(target)이라고 하고, 이 둘을 합쳐 훈련 데이터라고 부른다.

 

머신러닝 알고리즘의 성능을 제대로 평가하려면 훈련 데이터와 평가에 사용할 데이터가 각각 달라야 한다. 평가를 위해서 다른 데이터를 준비하거나 이미 준비된 데이터 중에서 일부를 떼어 내어 활용하는데 후자의 경우를 더 많이 사용한다. 평가에 사용할 데이터를 테스트 세트, 훈련에 사용되는 데이터를 훈련 세트라고 부른다.

 

 

지도 학습의 잘못된 샘플링

도미 데이터 15개, 빙어 데이터 14개를 선언한다. 도미 데이터와 빙어 데이터를 하나의 데이터로 합친다. 그런 다음 zip 함수를 사용하여 각 생선의 길이와 무게를 하나의 리스트로 담은 2차원 리스트 fish_data를 만든다. 이에 해당하는 정답값 fish_target을 생성한다. 

 

 

하나의 생선 데이터를 샘플이라고 부른다. 여기서는 도미 15개, 빙어 14개로 29개의 샘플 데이터가 있다. 이 데이터의 처음 15개를 훈련 세트로, 나머지 14개를 테스트 세트로 사용한다.

 

 

KNeighborsClassifier 클래스를 사용하여 모델 객체 kn을 선언한다. 훈련 세트로 해당 모델을 학습시키고 정확도를 확인해보면 결과는 0이 나온다. 그 이유는 샘플링 편향이 일어났기 때문이다.

샘플링 편향은 훈련 세트와 테스트 세트에 샘플이 골고루 섞여 있지 않으면 샘플링이 한쪽으로 치우친 경우를 말한다.

즉 훈련 세트는 모두 도미, 테스트 세트는 모두 빙어로 하여 정확도가 0이 나온 것을 알 수 있다.

 

 

지도 학습의 올바른 샘플링

넘파이는 파이썬의 대표적인 배열 라이브러리이다. zip함수를 사용해서 2차원 리스트로 표현할 수 있지만 고차원 리스트를 표현하기에는 번거로움이 있어 넘파이를 많이 사용한다.

 

 

샘플링 편향을 막기 위해서 데이터를 섞는 작업을 수행한다.

29개의 숫자가 들어간 배열을 생성하고 shuffle 함수를 사용하여 배열을 무작위로 섞는다. 그런 다음 해당 배열을 토대로 입력 데이터와 타깃 데이터를 훈련 세트와 테스트 세트로 나눈다.

 

 

훈련 세트와 테스트 세트에 도미와 빙어 데이터가 잘 섞여 있는지 산점도를 그려본다. 결과는 잘 섞여있다는 것을 알 수 있다.

 

 

KNeighborsClassifer 클래스 객체인 kn을 훈련 세트로 훈련한다. 그런 다음 테스트 세트를 넣어 정확도를 살펴보면 1.0 즉 정확도가 100%라는 것을 확인할 수 있다.