Pandas에서 데이터 정규화 하기
데이터 전처리 방법 중 하나인 정규화 2020-05-03
주의! Caution!
해당 게시글은 Archive된 게시글 입니다.
Archive된 사유는 다음 중 하나에 해당 됩니다.
  • 작성 된지 너무 오랜 시간이 경과 하여, API가 변경 되었을 가능성이 높은 경우
  • 주인장의 Data Engineering으로의 변경으로 질문의 답변이 어려워진 경우
  • 글의 퀄리티가 좋지 않아 글을 다시 작성 할 필요가 있을 경우
이 점 유의하여 게시글을 참고 하시길 바랍니다.

우리가 가공한 데이터들을 Pandas 객체에 녹여 내는 것을 성공 했다고 치겠습니다! 이를 바로 Tensor 등으로 변환하여 학습을 시도 하면 어떻게 될까요? 만약 feature마다 범위가 1-100, 0-10000 등 천차만별이라면? 역전파를 통해 원하는 기울기가 될 때 까지 오랜시간이 걸리고, 정확도도 정확하지 않을 것 입니다.

만약 이런 데이터라면..?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = {
    'A': np.random.choice(10000, 1000),
    'B': np.random.choice(1000000, 1000),
    'C': np.random.choice(100, 1000),
    'D': np.random.choice(10, 1000)
}

df = pd.DataFrame(data)
df.head()
A B C D
0 6076 221976 58 0
1 6786 555048 73 1
2 8024 79842 10 7
3 1926 125274 76 9
4 1776 590684 85 5

실제 이런 데이터를 테스트 해 본 결과와, 왜 정규화가 필요한 지 자세한 내용들이 궁금하다면, 해당 포스트를 참고 해 주세요.

https://medium.com/@urvashilluniya/why-data-normalization-is-necessary-for-machine-learning-models-681b65a05029

정규분포를 이용 한 전처리

정규 분포 밀도 함수는 다음과 같습니다.

Z=XμσZ = X - \mu \over \sigma
  • μ\mu: 평균
  • σ\sigma: 표준 편차

DataFrame 객체의 내부 메소드를 이용 하여, DataFrame 내의 평균, 표준 편차를 구할 수 있습니다.

DataFrame.mean(): DataFrame 객체 내부 요소들의 평균을 반환 한다. 단, Column 값에 따라 다르게 적용 한다. DataFrame.std(): DataFrame 객체 내부 요소들의 표준 편차를 반환 한다. 단, Column 값에 따라 다르게 적용 한다.

Code

normalization_df = (df - df.mean())/df.std()
normalization_df.head()
A B C D
0 0.398771 -0.893266 0.289179 -1.564749
1 0.643429 0.253257 0.808350 -1.222503
2 1.070029 -1.382529 -1.372171 0.830973
3 -1.031271 -1.226140 0.912185 1.515465
4 -1.082959 0.375925 1.223688 0.146481

Min-Max를 이용 한 전처리

Min-Max 정규화의 공식은 다음과 같습니다.

X=xxminxmaxxminX = x - x_{min} \over x_{max} - x_{min}
  • xminx_{min}: 최소 값
  • xmaxx_{max}: 최댓 값

아까 와 같이, DataFrame 객체의 내부 메소드를 이용 하여, DataFrame 내의 최소 값, 최댓 값를 구할 수 있습니다.

DataFrame.min(): DataFrame 객체 내부 요소들의 최소 값을 반환 한다. 단, Column 값에 따라 다르게 적용 한다. DataFrame.max(): DataFrame 객체 내부 요소들의 최댓 값를 반환 한다. 단, Column 값에 따라 다르게 적용 한다.

주의! 데이터에 특이 값(예상 범위를 크게 벗어 난 값)이 있을 경우에는 영향을 받을 수 있습니다.

Code

normalization_df = (df - df.min())/(df.max() - df.min())
normalization_df.head()
A B C D
0 0.606085 0.221727 0.585859 0.000000
1 0.677377 0.555184 0.737374 0.111111
2 0.801687 0.079428 0.101010 0.777778
3 0.189376 0.124913 0.767677 1.000000
4 0.174315 0.590862 0.858586 0.555556
Recent Posts in Data-Science Category