ML 엔지니어에게는 유저로 부터 수집된 여러 데이터들이 주어집니다. 이러한 데이터들 중에는 유저의 실수 혹은 서버의 오류와 같은 문제들로 인해 나쁜 데이터가 있을 수 있습니다. ML 엔지니어들은 일반적인 데이터의 상황과 다른 나쁜 데이터를 찾아 정제하는 과정을 수행하여야 합니다.
이번 포스트에서는 나쁜 데이터를 정제하는 방법에 대해서 다뤄보도록 하겠습니다.
특성 값 조정(Scaling feature values)
조정(Scaling)이란, 수집된 특성 값을 0~1 또는 -1~+1의 표준 범위로 변화하는 것을 말합니다. 만약 특성이 하나인 데이터 세트에서는 조정(Scaling)하는 과정이 불필요하겠지만, 데이터 세트가 여러 특성으로 구성되어 있다면 특성 조정(Feature Scaling)을 통해 다음과 같은 이점을 누릴 수 있습니다.
- 더 빠르게 경사하강법이 수렴함
- 'NaN(Not a Number) 트랩'이 방지됨
- 모델이 특성의 적절한 가중치를 익히는데 도움이 됨
모든 특성을 동일한 범위로 할 필요는 없습니다. 예를 들어 특성 A는 -1~+1, 특성 B는 -3~+3으로 조정해도 큰 문제는 없습니다. 하지만 특성 B만 -1000~+1000과 같이 너무 큰 차이가 나게 설정을 하면 모델이 적절한 가중치를 찾지 어려울 것입니다.
극단적 이상점 처리(Handling extreme outliers)
우리에게 주어지는 데이터 중에 비이상적으로 튀는 값이 있을 수 있습니다. 아래의 예시는 1인당 몇 개의 방을 가지고 있는지를 나타내는 그래프입니다.

위의 그림을 보면, 1인당 평균 방의 개수가 50개인 유독 튀는 한 점을 볼 수 있습니다. 이러한 데이터는 데이터 수집 단계에서 유저 혹은 서버의 문제로 인해 발생한 이상점입니다.
이러한 극단적 이상점이 주는 영향을 최소화하는 방법은 두 가지가 있습니다.
- 모든 값에 로그를 취해(Logarithmic scaling) 값의 범주를 줄임
- 특정 값에서 잘라(Clipping), 이를 넘어서는 값은 잘라낸 값으로 인식함

왼쪽의 그림은 모든 값에 로그를 취해 전체 값의 범주를 줄인 모습입니다. 오른쪽 그림은 원래의 데이터 중 4가 넘는 값을 잘라내어 모두 4로 인식시킨 모습입니다.
비닝(Binning)
한국의 위도에 따른 상대적인 주택 분포를 나타내는 데이터가 아래의 그림과 같이 주어졌다고 생각해 보겠습니다.

주어진 데이터에서 위도(Latitude)는 부동 소수점 값입니다. 하지만, 이 모델에서 위도는 주택 수와의 선형적인 관계가 없기 때문에(위도를 나타내는 숫자와 주택 수는 아무런 관계가 없음으로), 위도를 부동 소수점 특성(floating-point value)으로 표현할 수 없습니다.
예를 들어, 위도 35도에 위치한 주택이 위도 34도에 위치한 주택보다 35/34 만큼 싸거나 비싸지는 않습니다. 그러나 각각의 위도 값은 주택 가격을 예측하는 좋은 지표가 될 수 있습니다.
위도를 부동 소수점 값이 아닌, 하나의 지표로 이용하기 위해서 여러 '빈(Bin)'으로 나누겠습니다.
Binning 이란, 연속적인 하나의 특성을 Bin이라고 하는 그룹의 특성으로 변환하는 작업.(연속적인 값을 일정한 크기의 범주로 나누는 것)

위의 그림은 위도를 11개의 빈(Bin)으로 나눈 것(LatitudeBin1, LatitudeBin2, ..., LatitudeBin11) 입니다. 이렇게 하면 위도 32.6도를 다음과 같이 원-핫 벡터로 표현 할 수 있습니다.
[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
이렇게 비닝(Binning)을 이용하면 모델에서 각 위도에 따라 완전히 다른 가중치를 학습시킬 수 있습니다.
스크러빙(Scrubbing)
ML을 진행하면서 우리에게 다루는 데이터로 100% 신뢰할 수 있는 데이터만 주어지지는 않을 것 입니다. 아마 다음과 같은 문제를 갖고 있는 데이터 세트를 주로 접하게 될 것입니다.
- 값 누락(Omitted Value): 유저가 실수로 연령 정보를 입력하지 않았을 수도 있습니다.
- 중복 예(Duplicate Examples): 서버에서 같은 정보를 실수로 두 번 업로드 했을 수도 있습니다.
- 잘못 된 라벨(Bad Labels): 사용자가 고양이 사진에 실수로 강아지 라벨을 지정했을 수도 있습니다.
- 잘못된 특성 값(Bad Feature Values): 사용자가 숫자를 실수로 입력했을 수도 있습니다.
일반적으로 위와 같은 잘 못된 예를 발견하면 데이터를 삭제하는 데이터 세트 수정과정을 거침니다. 값 누락과, 중복 예 같은 경우 간단한 프로그램을 통해 탐지 하기 용이하지만, 잘못 된 라벨, 잘못 된 특성 값을 탐지하기는 매우 까다롭습니다.
철저한 데이터 파악
철저한 데이터를 파악을 위해 다음의 규칙을 항상 상기하여야 합니다.
- 정상적인 데이터가 어떠한 모습이어야 하는지 항상 생각하자
- 데이터가 예상과 일치하는지 확인하고, 그렇지 않다면 그 이유를 파악하자
- 학습 데이터가 대시보드 등의 다른 소스와 일치하는지 확인하자