우리가 가공한 데이터들을 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 |
실제 이런 데이터를 테스트 해 본 결과와, 왜 정규화가 필요한 지 자세한 내용들이 궁금하다면, 해당 포스트를 참고 해 주세요.
정규 분포 밀도 함수는 다음과 같습니다.
DataFrame
객체의 내부 메소드를 이용 하여, DataFrame
내의 평균, 표준 편차를 구할 수 있습니다.
DataFrame.mean()
: DataFrame
객체 내부 요소들의 평균을 반환 한다. 단, Column
값에 따라 다르게 적용 한다.
DataFrame.std()
: DataFrame
객체 내부 요소들의 표준 편차를 반환 한다. 단, Column
값에 따라 다르게 적용 한다.
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 정규화의 공식은 다음과 같습니다.
아까 와 같이, DataFrame
객체의 내부 메소드를 이용 하여, DataFrame
내의 최소 값, 최댓 값를 구할 수 있습니다.
DataFrame.min()
: DataFrame
객체 내부 요소들의 최소 값을 반환 한다. 단, Column
값에 따라 다르게 적용 한다.
DataFrame.max()
: DataFrame
객체 내부 요소들의 최댓 값를 반환 한다. 단, Column
값에 따라 다르게 적용 한다.
주의! 데이터에 특이 값(예상 범위를 크게 벗어 난 값)이 있을 경우에는 영향을 받을 수 있습니다.
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 |