글 작성자: 만렙개발자

 

데이터셋 만들기

(데이터가 있다고 가정했을 때,) 데이터셋을 만드는 과정은 크게 두 단계로 나눌 수 있습니다.

  1. subsample
  2. split

  supsample은 갖고 있는 데이터에서 일부를 떼내는 작업입니다. 이 과정을 하는데는 두 가지 이유가 있습니다. 첫번째 이유는 데이터셋이 너무 큰 경우입니다. 학습할 수 있는 최고의 환경이 갖춰져 있다면 문제가 되지 않겠지만, 선행 연구의 단계에서는 일부의 데이터로 빠르게 다양한 모델과 파라미터를 시험해보는 것이 효과적입니다. 두번째 이유는 학습에 필요한 데이터만 사용하기 위함입니다. 학습에 필요 없거나, 방해가 되는 데이터들은 배제하는 것이 좋을 수 있습니다. 여기서 말하는 필요 없는 데이터는 column이나 feature를 의미합니다. 즉, 집값 예측을 위한 화장실 수, 방의 수, 준공년도, 붙어있는 트와이스 포스터 수, 아스널 팬인지 여부 등과 같은 feature 중에 필요없을 법한 것을 배제하는 것입니다. 좋은 feature를 찾기 위해서는 데이터를 열심히 들여다봐야합니다.

"좋은" feature ?

  1. 목적(문제)과 연관이 있는 것
  2. 예측(테스트)때에도 알고 있는 것
  3. 의미있는 수치적 값
    • 예를들어 텍스트 정보의 경우 수치적으로 변환할 수 있어야합니다.
  4. 충분한 수
    • 특정한 feature에 대해서 충분한 다양성, 수가 부족하다면 그 feature는 영향력이 약할 수 있습니다.
  5. 문제를 바라보는 인간의 통찰력

Train(학습) / Valid(검증) / Test(시험)

  모델을 잘 학습하기 위해서는 중요한 요소들이 있습니다. 레이어들과, 은닉 유닛들, 학습율, 활성화 함수들, ... 머신러닝을 하는 것은 단순하게 한번만에 완벽히 풀 수 있는 것은 아닙니다. 해결방법을 생각해내고, 코딩을하고, 그리고 학습 데이터셋을 통해 성능을 평가합니다. 그리고 모델 혹은 파라미터를 바꿔보고 위와같은 과정을 반복합니다. 어떻게 보면 매우 단순한 일이지만, 어떤 상황에 사용할 수 있는 모델들이 있는지, 어떤 파라미터들을 바꿀 수 있는지 모를때에는 매우 어려운 일입니다. 어떤 것을 바꿔야할지 이전에, '평가'하는 것이 매우 중요합니다. 학습 데이터셋을 그냥 무작위로 나누어서 하는 것이 일반적이지만, '무작위'라는 것도 엄밀하게 얘기하면 끝도 없이 깊고 심오합니다. 여기서 다루고자하는 것은 랜덤 변수는 아닙니다. 학습 / 검증/ 시험 셋을 잘 분리(split)하는 것을 이야기하고자 합니다. 적절히 검증셋과 시험셋을 설계한다면, 어떠한 평가가 이루어질 수 있고, 그 평가를 기반으로 모델 혹은 파라미터를 변경할 수 있을 것입니다. 

  학습, 검증, 시험 데이터셋은 명확하게 구분이 되어있어야합니다. 학습데이터셋과 검증데이터셋은 정답이 포함된 학습데이터셋에서 모델을 학습하고 성능을 검증하기 위해서 나눕니다. 검증셋은 일반적으로 Valid Set이라고 하지만, Dev(Development) Set이라고도 부릅니다. 그 이유는 반복적인 모델의 성능 검증을 통해 모델 혹은 파라미터를 변경하여 성능을 향상시키는 기반이되기 때문입니다. 시험 데이터셋은 정답이 포함되지 않은 데이터셋으로, 실제 문제 혹은 머신러닝 대회에서는 이것에 대한 예측 결과가 '진짜' 성능을 나타내게 됩니다. 안타깝게도 정답이 포함되어있지 않기 때문에, 우리는 감히 평가할 수 없지만, 시험 데이터셋이 명확하다면 시험 데이터의 분포와 학습 및 검증 데이터의 분포가 얼마나 다른지를 통해서 성능을 높이는 방법도 있습니다. (시험셋에 레이블이 있는 경우도 있고, 검증셋과 분포적으로 다른 방식으로 나눈 경우도 있습니다. 이러한 경우는 '실제 상황을 고려하여 설계한' 데이터셋으로 생각하시면 좋을 것 같습니다. )

  가장 중요한 것은 학습과 검증 데이터셋을 잘 분리하는 것입니다. 혹여나 겹치는 것이 발생한다면, 학습한 데이터에 대해서 검증을 하게 됩니다. 이러한 것을 leakage라고 하며, 학습을 편향적으로 하더라도 높은 성능을 보일 수 있기 때문에, 모델은 좋지 못한 학습을하게 될 것입니다.

  • leakage : 학습 데이터셋과 검증 데이터셋에 교집합이 있는 것.

  데이터셋의 양에 따라서 비율이 조금 달라집니다. 1만 이하의 단위에서는 70%, 20%, 10% 비율 내외로 나누며, 100만의 단위에서는 99%, 0.5%, 0.5% 이러한 비율로 나눕니다. (검증 및 테스트할 수준이 되기 위해서) 학습하기에 충분한 양을 투입시키기 위함입니다.

학습 데이터셋과 서비스할 때 사용하는 데이터가 다른 경우

  학습 데이터셋은 학생, 일반인 혹은 소규모 회사에서 구축하기에는 비용이 너무나도 많이 듭니다. 따라서 우리가 개발, 서비스하고자 하는 시스템에서 실제로 사용(예측)하게 될 데이터와는 다를 수도 있습니다. 예를들어서 과일을 분류하는 문제로 생각해봅시다. 사과, 바나나 등 다양한 과일이 있다고 하였을 때, 학습 이미지는 잘 가공된 데이터셋일 가능성이 높습니다. 흰 배경에 사과만 있는 이미지라던지, 사과가 항상 중심에 있다던지, 이미지간에 사과 크기의 비율이 일정하다던지 말이죠. 그러한 데이터셋으로 학습을 하였고, 실제 개발하는 서비스에서는 스마트폰으로 찍은 사진으로부터 과일을 분류한다고 생각해봅시다. 스마트폰으로 찍은 사진에는 사과 뒤 배경이 있을 것이며, 사과의 크기도 찍는 사람마다 다를 것이고, 위치도 다를 것입니다. 이러한 경우가 학습 데이텃셋과 서비스할 때 사용하는 데이터가 다른 경우입니다.

  그러면 이러한 상황에는 어떻게 해야할까요? 크게 2가지 방법이 있습니다.

1. fine-tuning

2. data augmentation

  먼저 fine-tuning은, 스마트폰으로 찍은 사진들을 어느정도 확보하여 모델을 조금 더 학습하는 것입니다. 스마트폰으로 찍은 사진들로만 학습한 것에 비해서는 성능이 좋지는 않겠지만, 비용적으로 효율적일 수 있습니다. 두번째 방법인 data augmenation은 갖고 있는 흰 배경의 과일 사진을 스마트폰이 찍은 사진인 것처럼 변화를 주며 데이터셋을 증강하는 방법입니다. 크기를 다양하게 한다던가, 위치를 다양하게 한다던가, 배경을 합성한다던가 등 데이터를 증강하여 모델의 강건함을 늘리는 방법이죠.

  최근에는 knowledge distillation이나 domain adoption, semi-supervised learninig 등 데이터셋을 구축하는데 드는 비용을 줄이고자 다양한 방식이 활발히 연구되고 있습니다.

축소된 데이터셋

  앞서 설명했던 것 처럼 두 가지 측면에서 데이터셋을 축소합니다. 행(row)과 열(column)의 측면이죠. 일반적으로 행은 데이터의 수를 나타내고, 열은 feature를 말합니다. 두 측면에서 데이터셋을 축소한다고 하였을 때, 축소된 데이터셋은 전체 데이터셋이 갖는 분포적 특성을 대변할 수 있어야합니다. 따라서 샘플링을 이러한 문제를 고려하여 잘 해야합니다.

  데이터셋을 설계하는 것이 성능에서 매우 중요한 역할을 합니다. 모델이 잘 학습할 수 있게 데이터를 가공/증강 하는 것도 필요하며, 모델을 잘 평가할 수 있게 학습/검증/시험 셋을 나누는 것도 중요합니다.