머신러닝에서 데이터는 크게 3가지의 카테고리로 이루어진다. 학습을 위한 Train set, 최적의 모델을 찾아가기 위한 Dev sest, 그리고 생성된 알고리즘의 성능을 보기 위한 Test set.
머신러닝을 하면서 너무 알고리즘의 구조나 여러 파라미터의 값에만 치중을 한 나머지, 정작 알고리즘의 성능에 가장 큰 영향을 미칠 수 있는 요소를 간과하기가 쉬운데 그것이 바로 데이터의 분포에 대한 것다.
아래 예시로 고양이를 분류하는 알고리즘을 생성한다고 하자.
글로벌하게 사용할 수 있는 고양이 분류기를 생성하기 위해서 여러 국가별로 고양이 이미지 사진을 수집을 했다. 나라마다 사람의 피부색과 생김새가 다르듯이, 고양이 또한 그 나라에 많이 퍼져있는 종들이 있을 것이고 아마 나라별 고양이 이미지의 분포 또한 차이가 날 것이다.
자, 이렇게 힘들게 모은 데이터를 가지고 이제 알고리즘을 생성하는 일만 남았다. 그런데 여기서 A라는 머신러닝 엔지니어가 Train/Dev 용으로 미국, 영국, 유럽, 남미에서 수집한 데이터를 사용했고, 몇 주 혹은 몇 달간 열심히 작업해서 최적의 알고리즘과 파라미터의 값을 찾아냈다고 하자. 그리고 아직 학습에 사용하지 않은 중국, 아시아, 호주에서 수집한 데이터를 사용하여 알고리즘의 성능을 Test 하는 일만 남았다.
결과는 과연? 아마 십중팔구 성능이 기대 이하로 나올 것이다.
앞서 국가별로 고양이 종의 분포가 다를 것이다라고 했었다. 우리가 학습에 열심히 사용한 미국, 영국, 유럽, 남미 고양이들의 이미지는 Test에 사용한 다른 국가들의 고양이와는 분명히 분포에 있어서 차이를 보일 것이다. 따라서 이 알고리즘은 일부 국가의 고양이 분포만 학습을 한 것이라, 글로벌하게 사용하기에는 적절치 않은 고양이 분류기가 된 것이다. 백인의 얼굴만 구분하는 것에 특화된 알고리즘이 흑인, 동양인의 얼굴도 과연 잘 구분할 수가 있을까? 안타깝게도 A는 지난 몇 달간 아까운 시간을 날려먹은 셈이다.
따라서 적절한 알고리즘의 설계를 위해서는 사전에 Train/Dev/Test 데이터를 모든 국가에게 랜덤하게 Shuffling 하는 아주 단순하지만 중요한 작업이 선행되었어야 했다. 그리고 학습을 하고 최적의 파라미터를 찾아내었다면 이 고양이 분류기는 비로소 글로벌하게 써먹을 수 있는 알고리즘이 되는 것이다.
학습 및 테스트용 데이터를 분류할 때는 항상 실제로 미래에 추가적으로 들어올 데이터의 분포를 염두에 두고 그와 최대한 비슷하게 분포가 될 수 있도록 한 상태에서 학습을 진행해야 한다.