대학원 일기

전처리 기법: 정규화(Normalization) 본문

AI/인공지능 기초

전처리 기법: 정규화(Normalization)

대학원생(노예) 2023. 11. 12. 22:21

이전 포스팅인 '전처리 기법: 이상치(Outlier)'를 이어서 작성합니다.

https://kys0411.tistory.com/176

 

전처리 기법: 이상치(Outlier)

이전 포스팅인 '결측치: 중복 데이터'를 이어서 작성합니다. https://kys0411.tistory.com/175 전처리 기법: 중복 데이터 데이터는 앞선 포스팅에서 사용한 데이터를 이용한다. https://kys0411.tistory.com/174 전

kys0411.tistory.com

 

정규화(Normalization)

정규화는 데이터베이스에서 사용되는 개념으로 테이블 간에 중복된 data를 허용하지 않는 것이다. 중복된 데이터를 허용하지 않음으로 무결성(Intergrity)을 유지할 수 있다. 

 

머신러닝 모델은 데이터가 가진 특성(feature)을 비교하여 데이터의 패턴을 찾는다. 여기서, 데이터가 가진 특성의 스케일의 차이가 크게 나는 경우 문제가 발생한다. 따라서 모든 데이터가 동일한 스케일로 반영되도록 해주는 것이 정규화이다.  즉, 데이터를 특정 구간으로 바꾸는 척도법이다. 머신러닝에 사용되는 데이터는 값이 너무 크거나 작지 않고 적당한 범위(-1 ~ 1)에 있어야 모델의 정확도가 대체로 높아진다. 

 

데이터 스케일링을 해야할 때(스케일링이 중요한 알고리즘)

  • 경사하강법(Gradient descent) 기반 알고리즘
    • mini-batch Gradient Descent  
    • stochastic Gradient Descent
  • 거리 기반 알고리즘
    • KNN
    • K-means
    • SVM
  • PCA를 사용한 feature engineering

 

 

데이터 정규화 방법 중 대표적인 표준화(Standardization)와 Min-Max Scaling을 알아보겠다.

 

표준화(Standardization)

표준화(또는 z-score 정규화)의 결과는 다음과 같은 표준정규분포의 속성을 갖도록 특징이 재조정되는 것이다. 각 특징의 표준편차와 평균으로 값을 정규화한다. 데이터의 평균은 0, 분산은 1로 변환한다($\mu =0, \sigma = 1$). 표준화는 보통 평균이 0이고, 표준편차가 1일 때 사용하므로 데이터가 가우시안 분포를 따를 때 유용하다.

  • 이상치를 잘 처리함
  • 특성들의 스케일이 동일하지 않음
  • 데이터가 정규분포를 따라야할 때 유용함(SVM, Linear Regression, Logistic Regression)

$z = \frac{X - \mu }{\sigma }$

 

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

# sklearn dataset에서 iris data 불러오기 
iris = load_iris()
iris_data = iris.data
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)

print('feature 들의 평균 값')
print(iris_df.mean())
print('\nfeature 들의 분산 값')
print(iris_df.var())

# StandardScaler객체 생성
scaler = StandardScaler()
# StandardScaler 로 데이터 셋 변환. fit( ) 과 transform( ) 호출.  
scaler.fit(iris_df) # fit = 데이터 변환을 위한 기준 정보 설정
iris_scaled = scaler.transform(iris_df) # transform = 설정된 정보를 이용한 데이터 변환

# iris_df_scaled DataFrame 생성
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature 들의 평균 값')
print(iris_df_scaled.mean())
print('\nfeature 들의 분산 값')
print(iris_df_scaled.var())

 

Min-Max Scaling

Min-Max Scaling은 모든 특징이 0과 1 사이에 위치하도록 데이터를 변경하는 방법이다. 

  • 데이터의 최솟값은 0, 최댓값은 1로 변환한다.
  • Min-Max Scaling은 특징의 범위가 다를 때 주로 사용하며 확률분포를 모를 때 유용하다.

$x_{new} = \frac{x - x_{min}}{x_{max} - x_{min}}$

import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.datasets import load_iris

# sklearn dataset에서 iris data 불러오기
iris = load_iris()
iris_data = iris.data
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)

print('feature들의 최소 값')
print(iris_df.min())
print('\nfeature들의 최대 값')
print(iris_df.max())

# MinMaxScaler객체 생성
scaler = MinMaxScaler()
# MinMaxScaler 로 데이터 셋 변환. fit() 과 transform() 호출.  
scaler.fit(iris_df) # fit = 데이터 변환을 위한 기준 정보 설정
iris_scaled = scaler.transform(iris_df) # transform = 설정된 정보를 이용한 데이터 변환

# iris_df_scaled DataFrame 생성
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature들의 최소 값')
print(iris_df_scaled.min())
print('\nfeature들의 최대 값')
print(iris_df_scaled.max())

 

 

Comments