한 그루의 사과나무에서는 좋은 사과와 벌레 먹은 사과가 같이 열립니다. 그러나 과일 가게에서 판매하는 과일들은 모두 최고의 품질을 자랑합니다. 유통 과정 중간에서 누군가가 심혈을 기울여 불량한 과일을 솎아내고 약간 흠집이 있는 과일을 깨끗이 손질한 것입니다. ML 엔지니어 역시 불량한 예를 솎아내고 약간 문제가 있는 예를 깨끗이 손질하는 데 막대한 노력을 기울입니다. '나쁜 사과' 몇 개가 거대한 데이터 세트를 망칠 수 있습니다.
특성 값 조정
조정이란 부동 소수점 특성 값을 100~900 등의 자연 범위에서 0~1 또는 -1~+1 등의 표준 범위로 변환하는 작업입니다. 특성 세트가 단일 특성으로만 구성된 경우 조정에 따르는 실질적인 이점은 거의 없습니다. 그러나 특성 세트가 여러 특성으로 구성되었다면 특성 조정으로 다음과 같은 이점을 누릴 수 있습니다.
경사하강법이 더 빠르게 수렴됩니다.
'NaN 트랩'이 방지됩니다. NaN 트랩이란 모델의 숫자 중 하나가 NaN(예: 학습 중에 값이 부동 소수점 정밀도 한도를 초과하는 경우)이 된 후 수학 연산 과정에서 모델의 다른 모든 숫자가 결국 NaN이 되는 상황입니다.
모델이 각 특성의 적절한 가중치를 익히는 데 도움이 됩니다. 특성 조정을 수행하지 않으면 모델에서 범위가 더 넓은 특성을 과도하게 중시합니다.
모든 부동 소수점 특성에 동일한 척도를 부여할 필요는 없습니다. 특성 A는 -1~+1로, 특성 B는 -3~+3으로 조정해도 심각한 부작용은 없습니다. 그러나 특성 B를 5000~100000으로 조정하면 모델이 부정적으로 반응할 것입니다.
조정에 대해 자세히 알아보려면 여기를 클릭하세요.
숫자 데이터를 조정하는 알기 쉬운 방법 중 하나는 [최소값, 최대값]을 [-1, +1] 등의 작은 척도로 선형 매핑하는 것입니다.
각 값의 Z 점수를 계산하는 조정 방식도 널리 사용됩니다. Z 점수는 표준편차를 기준으로 평균에서 벗어난 정도를 계산합니다. 다시 말하면 다음과 같습니다.
아래와 같은 예를 들어 보겠습니다.
평균 = 100
표준편차 = 20
원래 값 = 130
결과는 다음과 같습니다.
scaled_value = (130 - 100) / 20
scaled_value = 1.5
Z 점수로 조정하면 대부분의 조정 값이 -3~+3 범위에 놓이지만, 이 범위보다 약간 높거나 낮은 값도 다소 존재하게 됩니다.
극단적 이상점 처리
다음은 캘리포니아 주택 데이터 세트에서 얻은 roomsPerPerson이라는 특성을 나타낸 플롯입니다. roomsPerPerson 값은 지역의 전체 방 수를 해당 지역의 인구로 나누어 계산합니다. 플롯을 보면 캘리포니아의 대부분 지역은 1인당 1~2개의 방을 갖추고 있습니다. 그러나 x축을 한번 살펴보시기 바랍니다.
roomsPerPerson 플롯에서 거의 모든 값이 0~4 범위에 모여 있지만 1인당 방 55개까지 꼬리가 매우 길게 늘어져 있는 모습
이러한 극단적 이상점이 주는 영향을 최소화하려면 어떻게 해야 할까요? 모든 값의 로그를 취하는 방법이 있습니다.
log(roomsPerPerson) 플롯에서 99%의 값이 약 0.4~1.8 범위에 모여 있지만 여전히 4.2 근처까지 꼬리가 길게 늘어져 있는 모습
로그 조정을 거치면 상황이 다소 개선되지만, 이상점 값의 꼬리가 아직도 상당히 남아 있습니다. 다른 접근법을 시도해 보겠습니다. roomsPerPerson의 최대값을 4.0 같은 임의의 지점에서 잘라내어 제한을 두면 어떻게 될까요?
roomsPerPerson 플롯에서 모든 값이 -0.3~4.0 범위에 놓인 모습 종 곡선 모양이지만 4.0 지점에 비정상 경사가 있는 플롯
특성 값을 4.0에서 잘라낸다는 말은 4.0보다 큰 값을 모두 무시한다는 의미가 아니라, 4.0보다 큰 값을 모두 4.0으로 인식하겠다는 의미입니다. 따라서 4.0 지점에 부자연스러운 경사가 생깁니다. 하지만 조정된 특성 세트는 원래 데이터보다 훨씬 유용해진 상태입니다.
비닝
다음은 캘리포니아의 위도에 따른 상대적인 주택 분포를 보여주는 플롯입니다. 클러스터링을 잘 살펴보세요. 로스앤젤레스의 위도는 약 34도이고 샌프란시스코의 위도는 약 38도입니다.
위도별 주택 수 플롯위도 36도 부근에 침체 구간이 있고 34도 및 38도 부근에 급상승이 있는 매우 불규칙적인 플롯
데이터 세트에서 latitude는 부동 소수점 값입니다. 그러나 이 모델에서 latitude를 부동 소수점 특성으로 표현할 수는 없는데, 이는 위도와 주택 값 사이에 선형적 관계가 없기 때문입니다. 예를 들어 위도 35도에 위치한 주택이 위도 34도에 위치한 주택보다 35/34만큼 싸거나 비싸지는 않습니다. 그러나 각각의 위도 값은 주택 가격을 예측하는 좋은 지표일 가능성이 높습니다.
위도를 유용한 예측 지표로 사용하기 위해 다음 그림과 같이 위도를 여러 '빈(bin)'으로 나누어 보겠습니다.
위도별 주택 수 플롯분할된 플롯
이제 부동 소수점 특성 하나가 아니라 11개의 개별 부울 특성(LatitudeBin1, LatitudeBin2, ..., LatitudeBin11)이 생겼습니다. 11개의 개별 특성은 다소 번잡하므로 하나의 11원소 벡터로 통일하겠습니다. 이렇게 하면 위도 37.4도를 다음과 같이 표현할 수 있습니다.
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
비닝을 사용하면 모델에서 각 위도에 대해 완전히 다른 가중치를 익힐 수 있습니다.
비닝 경계에 대해 자세히 알아보려면 여기를 클릭하세요.
위도 예제에서는 이해하기 쉽도록 빈 경계로 정수를 사용했습니다. 해상도를 더 높여야 한다면 빈 경계를 1/10도 간격으로 나눌 수도 있습니다. 빈을 더 추가하면 모델에서 위도 37.4도와 37.5도에 대해 서로 다른 동작을 익힐 수 있지만, 1/10도 간격으로 충분한 수의 예가 확보되어야 한다는 전제가 붙습니다.
분위를 기준으로 빈을 나누는 방법도 있는데, 이렇게 하면 각 버킷에 같은 개수의 예가 포함됩니다. 분위별 비닝을 사용하면 이상점에 대해 전혀 신경쓸 필요가 없습니다.
스크러빙
지금까지는 학습 및 테스트에 사용되는 모든 데이터를 신뢰할 수 있다고 가정했습니다. 그러나 실무에서는 다음과 같은 이유로 데이터 세트의 여러 예를 신뢰할 수 없습니다.
- 값 누락. 예를 들어 사용자가 주택의 연령을 실수로 입력하지 않았을 수 있습니다.
- 중복 예. 예를 들어 서버에서 같은 로그를 실수로 두 번 업로드했을 수 있습니다.
- 잘못된 라벨. 예를 들어 사용자가 참나무 사진에 실수로 단풍나무 라벨을 지정했을 수 있습니다.
- 잘못된 특성 값. 예를 들어 사용자가 숫자를 실수로 입력했거나 온도계를 햇빛에 두었을 수 있습니다.
잘못된 예가 발견되면 일반적으로 데이터 세트에서 삭제하여 해당 예를 '수정'합니다. 값 누락이나 중복 예를 탐지하고자 간단한 프로그램을 작성할 수 있습니다. 잘못된 특성 값 또는 라벨을 탐지하기는 훨씬 더 까다로울 수 있습니다.
잘못된 개별 예를 탐지하는 것 외에 집계에서도 잘못된 데이터를 탐지해야 합니다. 히스토그램은 집계 데이터를 시각화하는 유용한 메커니즘입니다. 또한 다음과 같은 통계를 구하면 도움이 될 수 있습니다.
- 최대 및 최소
- 평균 및 중앙값
- 표준편차
불연속 특성에서 가장 자주 나타나는 값으로 목록을 생성해 보세요. 예를 들어 country:uk가 예상한 숫자와 일치하는 예의 개수를 세어 보세요. 데이터 세트에서 language:jp를 가장 자주 나타나는 언어로 보아야 할까요?
철저한 데이터 파악
다음과 같은 규칙을 따르세요.
- 정상적인 데이터가 어떠한 모습이어야 하는지 항상 생각하세요.
- 데이터가 이러한 예상과 일치하는지 확인하고, 그렇지 않다면 그 이유를 파악해 보세요.
- 학습 데이터가 대시보드 등의 다른 소스와 일치하는지 재차 확인하세요.
- 핵심적인 코드를 다룰 때와 마찬가지로 데이터에 온 정성을 쏟아야 합니다. 좋은 데이터가 좋은 ML을 만듭니다.
그다음 실습
주요 용어
'DATA Science > Google Machine Learning' 카테고리의 다른 글
특성교차: 원-핫 벡터 교차 (0) | 2021.07.25 |
---|---|
특성교차: 비선형성 인코딩 (0) | 2021.07.25 |
표현: 좋은 특성의 조건 (0) | 2021.07.25 |
표현: 특성 추출 (0) | 2021.07.25 |
추가 분할(검증데이터 추가?) (0) | 2021.07.25 |
댓글