Normalize란 - normalizelan

오늘은 꽤 중요한 이야기를 하고자 합니다. 기본적이기 때문에 중요합니다. 이것을 간과하면 성능에 치명적인 영향을 끼치기 때문에 중요합니다. 바로 정규화(normalization)와 표준화(standardization)에 대한 이야기입니다. 정규화와 표준화는 모두 머신러닝 알고리즘을 훈련시키는데 있어서 사용되는 특성(feature)들이 모두 비슷한 영향력을 행사하도록 값을 변환해주는 기술입니다. 이것이 무슨 말인지는 좀 더 읽어보시면 이해가 되실 것입니다. 

정규화 또는 표준화는 왜 필요한가? 

머신러닝 알고리즘은 기본적으로 데이터를 가지고 무언가를 해내는 친구들입니다. 많은 양의 데이터를 가지고 머신(기계)를 학습시키는 것이 머신러닝, 한국어로는 기계학습이기 때문입니다. 보통 예측하고자 하는 것과 연관이 있을 만한 여러 개의 특성을 가지고 머신러닝 알고리즘을 훈련시킵니다. 예를 들어, 부동산의 가격을 예측하기 위해서 어떤 머신러닝 알고리즘을 훈련시킨다고 가정해보겠습니다.

그렇다면 부동산 가격과 연관이 있을 것과 같은 특성들을 도출(extract)합니다. 집의 평수, 아파트의 나이, 지하철 역과의 거리, 대형마트와의 거리 등이 관련이 있을 것 같습니다. (저는 부동산을 잘 몰라서, 이것들이 실제로 얼마나 집값과 연관이 있는지는 모르겠습니다. 아무튼 그것은 지금 전혀 중요하지 않습니다.) 실제로 존재하는 집의 평수는 10평부터 100평까지 다양할 것입니다. 또한 아파트의 나이는 1년에서 20년, 지하철 역과의 거리는 0.1km부터 1km, 대형마트와의 거리도 1km에서 20km까지 다양할 것입니다. 

문제는 '평수', '년', 'km' 등 각 특성의 단위도 다르고, 값의 범위도 꽤 차이가 있다는 것입니다. 우선 단위가 다르면 직접적인 비교가 불가능합니다. 사람의 키와 사람의 몸무게를 직접적으로 비교할 수 없는 것처럼 말이죠.

그리고 단위가 같더라도 값의 범위가 크게 차이나는 상황에서도 제대로 비교하는 것이 힘듭니다. 100점 만점에서 90점을 맞는 것과 1000점 만점에서 90점을 맞는 것은 완전히 다른 경우인 것처럼 말이죠. 

범위가 달라도 비교 불가

따라서 특성들의 단위를 무시할 수 있도록, 또한 특성들의 값의 범위를 비슷하게 만들어줄 필요가 있습니다. 그것이 바로 정규화 또는 표준화가 해주는 일입니다. 정규화와 표준화가 해주는 것을 특성 스케일링(feature scaling) 또는 데이터 스케일링(data scaling)이라고 부릅니다. 

정규화와 표준화의 차이는 무엇인가?

그렇다면 정규화와 표준화의 차이는 무엇일까요? 정규화(normalization)는 다음과 같은 공식을 사용해서 특성 값의 범위를 [0, 1]로 옮깁니다. 

$X' = \frac{X - X_{min}}{X_{max} - X_{min}}$   ...(정규화 공식)

이 공식을 사용하면 한 특성 내에 가장 큰 값은 1로, 가장 작은 값은 0으로 변환됩니다. 이 공식을 이용해서 각 특성들의 값을 변환해주면 모두 [0, 1]의 범위를 갖게 됩니다. 이제야 특성들이 평등한 위치에 놓여진 것입니다. 

반면, 표준화(standardization)는 다음과 같은 공식으로 특성들의 값을 변환해줍니다. 

$X' = \frac{X - \mu}{\sigma}$   ...(표준화 공식)

여기서 $\mu$는 한 특성의 평균값이고, $\sigma$는 표준편차입니다. 많이 익숙한 공식이죠? 그렇습니다. 고등학교 때 배운 정규분포의 표준화 공식입니다. 표준화는 어떤 특성의 값들이 정규분포, 즉 종모양의 분포를 따른다고 가정하고 값들을 0의 평균, 1의 표준편차를 갖도록 변환해주는 것입니다. 표준화를 해주면 정규화처럼 특성값의 범위가 0과 1의 범위로 균일하게 바뀌지는 않습니다. 아래 박스 플롯들을 보시면 정규화와 표준화를 통해 값의 범위가 어떻게 변하는지를 대략적으로 확인하실 수 있습니다. 

출처: [1]

정규화와 표준화 중에 어떤 것이 더 나은가?

이 질문에는 쉽게 답하기가 어렵습니다. 케이스 바이 케이스(case by case)이기 때문입니다. 어떤 경우에는 정규화를 해줬을 때 더 좋은 성능을 낼 수 있고, 어떤 경우에는 표준화가 더 나을 수도 있습니다. 따라서 둘 다 해보고 어느 것이 더 나은지 비교해봐야 합니다. 그러나 분명하게 말씀드릴 수 있는 것은 정규화나 표준화를 한 것과 하지 않은 것의 차이는 엄청나게 크다는 것입니다. 따라서, 꼭 해줘야 합니다. 

이 글이 도움이 되셨나요? 그렇다면, 공감버튼 한 번 눌러주시면 감사하겠습니다.^^ 또한 질문과 토론에는 항상 열려 있으니 댓글 남겨주시면 살펴보겠습니다. ㅎㅎ

관련 글

정규 분포와 정규 분포의 표준화의 의미

[MATLAB] 표준화된 z-점수 산출하기, zscore 함수

[python] SVM 분류 문제를 통해 배우는 머신러닝 훈련 및 테스트

참고자료

[1] //www.analyticsvidhya.com/blog/2020/04/feature-scaling-machine-learning-normalization-standardization/, Analytics Vidhya, "Feature Scaling for Machine Learning: Understanding the Difference Between Normalization vs. Standardization"

(본문 내 쿠팡 파트너스 링크를 클릭하셔서 물건을 구매하시면 저에게 일정 금액이 후원됩니다.)

# 정규화를 왜 해야 할까요? 정규화의 방법은 무엇이 있나요?

우리가 아무리 좋은 데이터를 갖고 있어도 모델에 학습시키기 위해선 스케일링(Scaling)을 해줘야 합니다. 머신러닝 모델은 데이터가 가진 feature(특징)을 뽑아서 학습합니다. 이때 모델이 받아들이는 데이터의 크기가 들쑥날쑥하다면 모델이 데이터를 이상하게 해석할 우려가 있습니다. 예를 들어 아파트 가격을 예측한다고 합시다. 아파트 가격에 영향을 미치는 요소로는 지어진 지 몇 년이나 되었는지, 현재 가격은 얼마인지, 연 가격 상승률은 얼마인지 등등이 있을 것입니다. 각각을 5, 1억, 0.1이라고 칩시다. 그렇다면 모델이 세 가지의 feature를 보고 학습할 땐 5와 0.1은 무시하고 1억만 중요하게 볼 수도 있겠죠?

저는 실제로 이러한 문제를 겪은 적이 있습니다. ‘kp지수 예측 경진대회’에 참여했을 때 많은 데이터 전처리가 필요했는데, 당시에 이러한 정규화를 할 생각을 못 해 모델의 성능이 그다지 좋지 않았던 기억이 있습니다. 예를 들면 300이라는 값을 갖는 feature와 0.5라는 값을 갖는 feature를 함께 쓴 꼴이었습니다. 따라서 이런 문제가 발생하지 않도록 모든 데이터가 같은 정도의 스케일(중요도)로 반영되도록 해주는 것이 정규화의 목표입니다. 다시 말하면, 머신러닝 모델에 주입되는 데이터들을 균일하게 만드는 모든 방법이라고 할 수 있습니다.

이제 정규화 방법들을 소개해드리겠습니다.

# Min-Max Normalization (최소-최대 정규화)

먼저 Min-Max Normalization(최소-최대 정규화)이 있습니다. 이 방법은 모델에 투입될 모든 데이터 중에서 가장 작은 값을 0, 가장 큰 값을 1로 두고, 나머지 값들은 비율을 맞춰서 모두 0과 1 사이의 값으로 스케일링해주는 것입니다. 따라서 만약 X라는 값을 Min-Max Normalization 시킨다면 X는 (X - MIN) / (MAX-MIN)라는 값이 될 것입니다. 저 같은 경우는 태양 이미지를 처리할 때 각 이미지의 픽셀값에 대해 Min-Max Normalization을 시켜서 모델에 넣었던 기억이 납니다.

하지만 Min-Max Normalization에는 이상치(outlier)에 대해 취약하다는 점이 있습니다. 예를 들어 100개의 값이 있는데 그중 99개는 0과 40 사이에 있고, 나머지 하나가 100이면 어떨까요? 그러면 99개의 값이 모두 0부터 0.4 사이의 값으로 변환되지만 단 하나뿐인 100은 1.0으로 변환됩니다. 결국, 데이터의 분포가 0부터 0.4 사이의 값들로 치우치게 됩니다. 만약 100개 모두 0과 40 사이에 있었다면 0은 0으로, 40은 1로 변환되어 좀 더 고른 형태의 데이터 분포를 기대할 수 있었을 겁니다.

#  Z-Score Normalization (Z-점수 정규화)

이러한 문제를 해결할 수 있는 Z-Score Normalization(Z-점수 정규화)이라는 방법이 있습니다. 고등학교 통계 시간에 배웠던 표준화 작업을 한다고 보면 됩니다. 그래서 그런지 어떤 글에서는 Min-Max Normalization을 정규화, Z-Score Normalization을 표준화라고도 합니다. 여기선 그냥 둘 다 정규화의 기법들로 보고 설명하려고 합니다. 우리는 이 방법을 이용해 이상치에 해당하는 데이터의 문제를 피할 수 있습니다.

Z = (X – 평균) / (표준편차)를 통해 X라는 값을 Z라는 Z-점수로 바꿀 수 있습니다. 어떤 데이터가 표준 정규 분포(가우시안 분포)에 해당하도록 값을 바꿔준다고 보면 될 것 같습니다. 그래서 데이터 X가 평균값과 같다면 0으로 정규화되겠지만, 평균보다 작으면 음수, 평균보다 크면 양수로 나타납니다. 이때 계산되는 음수와 양수의 크기는 그 feature의 표준편차에 의해 결정됩니다. 그래서 만약 데이터의 표준편차가 크면, 즉 값이 넓게 퍼져있으면, 정규화되는 값이 0에 가까워집니다. 분모에 표준편차가 들어가고 분자에는 원래 데이터의 값에서 전체 데이터의 평균이 빠진다는 것을 유념하시면 이해가 빠를 것 같습니다.

위 그림은 불균형한 데이터 분포를 평균이 0, 표준편차가 1이 되도록 변환한 것을 나타냅니다. 즉, 각각의 축으로 투영(projection)시켰을 때 정규분포가 되도록 한다는 것입니다.

지금까지 데이터 정규화에 대해 알아보았습니다. 한줄로 요약하자면, 데이터 정규화는 어떤 feature가 다른 feature를 지배하지 못하도록 만드는 과정이고, 결국 모델이 더 잘 알아들을 수 있도록 데이터를 정제하는 과정이라고 할 수 있겠습니다.

정규화 기법들 중 L1 정규화, L2 정규화라는 기법이 있는데, 이것들은 정규화라고도 하고 제가 배울 땐 규제(Regularization)라는 용어로 배웠기 때문에 다른 게시물에서 설명하도록 하겠습니다.

Toplist

최신 우편물

태그