데이터 전처리 목적은 주어진 원본 데이터를 신경망에 적용하기 쉽도록 만드는 것입니다. 벡터화(vectorization), 정규화(normalization), 누락된 값 다루기, 특성 추출 등이 포함됩니다.
- 벡터화
신경망에서 모든 입력과 타깃은 부동 소수 데이터로 이루어진 텐서여야 합니다(또는 특정 경우에 정수로 이루어진 테서입니다). 사운드, 이미지, 텍스트 등 처리햐야 할 것이 무엇이든지 먼저 텐서로 벼ㅑㄴ환해야 합니다. 이 단계를 데이터 벡터화(data vectorization)라고 합니다. 예를 들어 이전에 나온 2개의 텍스트 분류 예에서 텍스트를 (단어 시퀀스를 의미하는) 정수 리스트로 변환했습니다. 그다음 원-핫 인코딩을 사용하여 float32타입 데이터로 이루어진 텐서로 바꾸었습니다. 숫자 이미지 분류와 주택 가격 예측의 예에서는 이미 데이터가 벡터 형태로 주어졌으므로 이 단계를 건너 뛰었씁니다.
- 값 정규화
숫자 이미지 분류 예에서 이미지 데이터를 그레이스케일 인코딩 0-255 사이의 정수로 인코딩했습니다. 이 데이터를 네트워크에 주입하기 전에 float32 타입으로 변경하고 255로 나누어서 최종적으로 0-1 사이의 부동 소수 값으로 만들었습니다. 주택 가격을 예측할 때는 특성들의 범위가 제각각이었습니다. 어떤 특성은 작은 부동 소수 값이고 다른 특성은 매우 큰 정수 값을 가졌습니다. 이 데이터를 네트워크에 주입하기 전에 각 특성을 독립적으로 정규화하여 평균이 0이고 표준편차가 1이 되도록 만들었습니다.
일반적으로 비교적 큰 값(예를 들어 네트워크의 가중치 초깃값보다 훨씬 큰 여러 자릿수를 가진 정수)이나 균일하지 않은 데이터(옐르 들어 한 특성의 범위는 0-1이고 다른 특성은 100-200인 데이터)를 신경망에 주입한느 것은 위험합니다. 이렇게 하면 업데이트할 그래디언트가 컼져 네트워크가 수렴하는 것을 방해합니다. 네트워크를 쉽게 학습시키려면 데이터가 다음 특징을 따라야 합니다.
1) 작은 값을 취합니다. 일반적으로 대부분의 값이 0-1 사이여야 합니다.
2) 균일해야 합니다. 즉 모든 특성이 대체로 비슷한 범위를 가져야 합니다.
추가적으로 다음에 나오는 엄격한 정규화 방법은 꼭 필수적이지는 않지만(예를 들어 숫자 이미지 분류 예에서는 사용하지 않습니다) 자주 사용되고 도움이 될수 있습니다.
3) 각 특성별로 평균 0이 되도록 정규화합니다.
4) 각 특성별로 표준 편차가 1이 되도록 정규화합니다.
넘파이 배열에서 방법은 간단합니다.
x -= x.mean(ㅁ탼=0) .................. x가 (샘플, 특성)크기인 2D 행렬이라고 가정합니다.
x /= x.std(axis=0)
- 누락된 값 다루기
이따름 데이터에 값이 누락된 경우가 있습니다. 예를 들어 주택 가격 예측 문제에서 첫 번째 특성(데이터에서 인텍스가 0인컬럼)은 1인당 범쥐율입니다.
이 특성이 모든 샘플에 들어 있지 않으면 어떻게 될까요? 훈련 데이터나 테스트 데이터에 누락된 값이 포함됩니다. 일반적으로 신경망에서 0이 사건에 정의된ㄴ 의미 있는 값이 아니라면 누락된 값을 0으로 입력해도 괜찮습니다. 네트워크가 0이 누락된 데이터를 의미한다는 것을 학습하면 이 값을 무시하기 시작할 것입니다.
테스트 데이터에 누라된 값이 포함될 가능성이 있다고 가정합시다. 하지만 네트워크가 누락된 값이 없는 데이터에서 훈련되었다면 이 네트워크는 누라된 값을 무시하는 법을 알지 못합니다. 이런 경우에는 누락된 값이 있는 훈련 샘플을 고의적으로 만들어야 합니다. 훈련 샘플의 일부를 여러별 복사해서 테스트 데이터에서 빠질 것 같은 즉성을 제거합니다.
댓글 없음:
댓글 쓰기