개발은 처음이라 개발새발

파이썬 데이터 정규화[python/pandas] 본문

파이썬/판다스

파이썬 데이터 정규화[python/pandas]

leon_choi 2022. 8. 7. 17:22
반응형

오랜만입니다. 오늘은 데이터분석에서 가장 중요한 정규화 작업에 대해 알아보도록하겠습니다. 정규화는 여러 열의 데이터가 들어 있을 때 모든 열의 데이터의 단위가 동일하면 더할나위 없이 좋지만 저희에겐 그런 행운은 없기에 단위가 서로 다른 열을 가지고 머신러닝을 하게 되면 머신러닝 분서 결과가 달라질 수 있습니다. 그렇기에 숫자 데이터간의 상대적인 크기 차이를 제거해 각 열에 속하는 데이터 값을 동일한 크기 기준으로 나눈 비율로 나타내는데 이를 두고 정규화(normalization)이라고 합니다. 정규화를 거친 데이터의 범위는 0~1 또는 -1~1이 됩니다. 

 

정규화 작업중 기본적인 방법으로는 해당 열의 데이터를 열의 최대값의 절대값으로 나누는 방법이 있습니다. 이렇게 되면 가장 큰 값은 자기 자신과 나눈 것이니 1이 되겠죠. 이번 시간에는 auto-mpg 파일에서 horsepower 컬럼을 활용해 해보겠습니다. 

import pandas as pd
import numpy as np

df= pd.read_csv('auto-mpg.csv',header=None)

#열 이름 저장
df.columns = ['mpg','cylinders','displacement','horsepower',
	'weight','acceleraiton','model year','origin','name']

#horsepower 누락 데이터 삭제하고 실수형으로 변환
df['horsepower'].replace('?', np.nan, inplace=True) # ?값을 nan으로 변경
df.dropna(subset=['horsepower'], axis=0, inplace=True) # 누락 데이터 행 삭제
df['horsepower']= df['horsepower'].astype('float') # horsepower 열의 타입을 실수로 변경

print(df['horsepower'].describe())
print('\n')

#절대값으로 나눠서 저장
df.horsepower = df['horsepower']/abs(df['horsepower'].max())

print(df.horsepower.head())
print('\n')
print(df.horsepower.describe())
count    392.000000
mean     104.469388
std       38.491160
min       46.000000
25%       75.000000
50%       93.500000
75%      126.000000
max      230.000000
Name: horsepower, dtype: float64


0    0.565217
1    0.717391
3    0.652174
4    0.608696
Name: horsepower, dtype: float64


count    392.000000
mean       0.454215
std        0.167353
min        0.200000
25%        0.326087
50%        0.406522
75%        0.547826
max        1.000000
Name: horsepower, dtype: float64

네 이렇게 최대 230이었던 마력이 최대 1로 정규화가 됐습니다. 여기서 알아야 할 건 abs() 함수인데요. abs 함수를 통해 절대값을 구할 수 있다는 걸 알아가시면 좋을 듯 합니다. 다음에는 "최소최대 정규화(minmax normalization)"를 활용해보겠습니다. 최소최대 정규화는 각 열 데이터에서 해당 열의 최소값을 뺀 값을 분자로, 해당 열의 최대값과 최소값의 차를 분모로 하는 수를 계산하는 것으로 가장 큰 값은 1이 됩니다. 이를 가지고도 정규화를 시켜보도록 하겠습니다. 

 

min_x = df['horsepower']-df['horsepower'].min()
min_max = df['horsepower'].max() - df['horsepower'].min()

df.horsepower = min_x /min_max

print(df.horsepower.head())
print('\n')
print(df.horsepower.describe())
0    0.456522
1    0.646739
2    0.565217
3    0.565217
4    0.510870
Name: horsepower, dtype: float64


count    392.000000
mean       0.317768
std        0.209191
min        0.000000
25%        0.157609
50%        0.258152
75%        0.434783
max        1.000000
Name: horsepower, dtype: float64
반응형