5. 개발 데이터셋과 테스트 데이터셋

5. 개발 데이터셋과 테스트 데이터셋

앞부분에서 소개한 고양이 사진 사례로 돌아가 보겠습니다. 이 앱 사용자는 모바일 앱을 실행하고, 여러 사진을 앱에 올립니다. 여러분은 이 중에서 고양이 사진을 자동으로 찾고 싶습니다.

개발팀은 여러 웹 사이트에서 고양이 사진(긍정 데이터, Positive Example)과 고양이가 아닌 사진(부정 데이터, Negative Example)을 내려받아 대규모 학습 데이터셋을 만들었습니다. 이 데이터를 70:30 비율로 나누고, 이 비율로 학습 데이터셋과 테스트 데이터셋을 만들었습니다. 이 데이터를 이용하여 고양이 탐지기를 만들었습니다. 이 탐지기는 학습 데이터셋과 테스트 데이터셋에 잘 동작합니다.

그러나 이 고양이 탐지기를 모바일 앱에 배포하고 나서야, 이 고양이 탐지기의 분류 성능이 매우 저조하다는 것을 알게 됩니다.

무슨 일이 벌어진 것일까요?

개발팀은 앱 사용자가 올리는 사진과 학습 데이터셋을 구성하는 웹 사이트에서 내려받은 이미지가 상당히 다르다는 것을 알았습니다. 사용자는 모바일 폰으로 촬영한 사진을 올립니다. 이 사진은 해상도가 낮고 흐릿하며, 조명이 약한 경향이 있습니다. 여러 웹 사이트에서 내려받은 이미지로 학습 데이터셋과 테스트 데이터셋을 만들었기 때문에, 고양이 검출기 알고리즘은 모바일 폰으로 찍은 사진에 일반화(Generalization)되지 않았습니다.

빅데이터 시대 이전에는 머신러닝에 사용할 데이터를 70%:30% 비율로 무작위 분할 하여 학습 데이터셋와 테스트 데이터셋을 만들어 사용하는 것이 일반적으로 사용되는 방법이었습니다. 이런 방법이 효과적일 수는 있지만, 학습 데이터셋(위 예제에서 웹 사이트 이미지)과 궁극적으로 분석해야 하는 데이터(휴대 전화 이미지)의 데이터 분포가 달라질 수 있다는 측면에서 좋은 방법은 아닙니다.

일반적으로 머신런링에 사용하는 데이터셋을 다음과 같이 정의합니다.

  • 학습 데이터셋(Training set) : 알고리즘 학습에 입력하는 데이터 세트
  • 개발 데이터셋(Dev1, development set): 파라미터 튜닝, 피처 선별 및 학습 알고리즘 관련 결정에 내리기 위해 사용하는 데이터 세트. 홀드-아웃 교차 검증 세트(Hold-out cross validation set)라고도 함.
  • 테스트 데이터셋(Test set) : 알고리즘 성능 평가에 사용하는 데이터 세트. 학습 알고리즘이나 파라미터 관련 결정에는 사용하지 말아야 함

개발 데이터셋(dev/developement set)와 테스트 세트를 만들었다면, 개발팀은 여러 학습 알고리즘 파라미터와 같은 다양한 것을 시도해보고, 가장 적합한 것(상태)을 찾을 것입니다. 개발 데이터셋과 테스트 데이터셋을 이용하여 알고리즘이 얼마나 잘 작동하는지 빠르게 확인할 수 있습니다.

다시 말해서, 개발 데이터셋과 테스트 데이터셋의 목적은 머신러닝 시스템에 발생하는 가장 중요한 변경(설정 상태로)에 대하여 개발팀에게 방향을 제시하는 것입니다.2

따라서 다음과 같은 방식을 사용해야 합니다.

개발 데이터셋과 테스트 데이터셋은 앞으로 입력될 데이터의 특성을 잘 반영하는 데이터셋으로 만들어야 합니다.

다시 말해서, 테스트 데이터셋를 단순히 이용 가능한 데이터의 30% 만들어서는 안 됩니다. 특히 알고리즘에 유입될 실제 데이터가 학습 데이터셋(웹사이트 이미지)와 다를 것으로 예상된다면 더 조심해야 합니다.

모바일 앱이 아직 없는 상태라면, 아직 사용자도 없을 것입니다. 이런 상황에서는 앞으로 수행할 작업을 정확하게 반영하는 데이터를 얻을 수 없습니다. 그러나 이런 특성을 반영하는 데이터를 수집하려는 노력을 해야 합니다. 예를 들어, 친구에게 고양이의 휴대 전화 사진을 찍어 보내 줄 것을 요청하십시오. 이런 데이터로 개발/테스트 데이터셋을 만들수 있습니다. 모바일 앱을 런칭한 후에는, 실제 사용자 데이터로 개발/테스트 세트셋을 업데이트합니다.

실제 입력될 것으로 예상되는 데이터와 유사한 데이터를 얻을 방법이 전혀없는 상태라면, 웹 사이트 이미지를 내려 받아 시작하는 것이 최선일 것입니다. 그러나 이렇게 만들어진 데이터로 학습한 시스템은 실제 데이터에 일반화되(Generalization)지 않을 위험성이 크다는 것을 알고 있어야 합니다.

좋은 개발 데이터셋와 테스트 데이터셋을 개발하는데 얼마나 많이 투자할 것인지를 결정해야 합니다. 테스트 데이터셋에 했던 것처럼, 학습 데이터셋의 분포가 실제 데이터 분포와 같을 것이라고 가정하면 안 됩니다. 테스트 데이터셋을 만들때, 학습에 사용하는 데이터보다는 실제로 잘 동작해야하는 데이터의 특성을 잘 반영하는 데이터로 만들어야 합니다.[^3]

이 문서는 Andrew NG 교수님께서 집필 중인 Machine Learning Yearning의 5장 번역입니다. 원제는 “5. Your development and test sets” 입니다. 원문 Ebook은 http://www.mlyearning.org [↗NW] 에서 내려받을 수 있습니다.


  1. <옮긴이> dev를 validation과 같은 표현입니다. dev set은 validation set, 검증 데이터셋을 의미합니다. [return]
  2. <옮긴이> 분석가는 개발 데이터셋과 테스트 데이터셋이 제시하는 여러 지표를 활용하여 현재 알고리즘이 과대적합되어 있느지, 과소적합되어 있는지, 일반화가 필요한 상황인지 등을 파악하고 대처하게 됩니다. 개발 데이터셋과 테스트 데이터셋를 이용하여 이런 방향성을 확보할 수 있습니다.
    [return]
Last updated on 21 Dec 2018 / Published on 21 Dec 2018
김태완 avatar
작성자: 김태완
1999년 부터 Java, Framework, Middleware, SOA, DB Replication, Cache, CEP, NoSQL, Big Data, Cloud를 키워드로 살아왔습니다. 현재는 빅데이터와 Machine Learning을 중점에 두고 있습니다.
E-mail: taewanme@gmail.com

Powered by http://taewan.kim