Gaegul's devlog

파이썬 머신러닝 완벽 가이드 - chap1-2. 데이터 전처리 (feat. 정규화/표준화) 본문

Artificial Intelligence/Data Science

파이썬 머신러닝 완벽 가이드 - chap1-2. 데이터 전처리 (feat. 정규화/표준화)

부지런깨꾹이 2020. 9. 1. 17:14
728x90
반응형

인코딩에 이어 데이터의 스케일링에 관해 알아보도록 하겠습니다.

# 1. Feature Scaling (피쳐 스케일링) 이란.

서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업을 피쳐 스케일링 (Feature Scaling)이라고 합니다. 대표적인 방법으로  표준화(Standardization)와 정규화(Normalization)가 있습니다.

 

# 2. StandardScaler

StandardScaler는 표준화를 쉽게 지원하기 위한 클래스입니다. 개별 피쳐를 평균이 0이고, 분산이 1인 가우시안 정규 분포를 가진 값으로 변환하는 것을 의미합니다. 수식은 다음과 같습니다.

 

Standardization

 

 - numpy : z = (x - mean())/std()

 - scipy.stats : zscore()

 - sklearn.preprocessing : StandardScaler().fit_transform()

 

이렇게 가우시안 정규분포를 가질 수 있도록 데이터를 변환하는 것은 몇몇 알고리즘에서 중요합니다. 특히, 사이킬런에서 구현한 RBF 커널을 이용하는 서포트 백터 머신(SVM) 이나 선형 회귀(Linear Regression), 로지스틱(Logistic Regression) 모델은 가우시안 분포를 가지고 있다고 구현됐기 때문에 사전에 표준화를 적용하는 것은 예측 성능 향상에 도움을 줄 수 있습니다. 

 

# 2. 실습

모든 칼럼 값이 평균 0에 아주 가까운 값으로, 분산은 1에 가까운 값으로 변환됐음을 알 수 있습니다.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

scaler.fit(iris_df)
iris_sc = scaler.transform(iris_df)

iris_sc = pd.DataFrame(data = iris_sc, columns=iris.feature_names)
print('feature 평균 값 : ')
print(iris_sc.mean())

print('feature 분산 값 : ')
print(iris_sc.var())
#결과:
feature 평균 값 : 
sepal length (cm)   -1.690315e-15
sepal width (cm)    -1.842970e-15
petal length (cm)   -1.698641e-15
petal width (cm)    -1.409243e-15
dtype: float64

feature 분산 값 : 
sepal length (cm)    1.006711
sepal width (cm)     1.006711
petal length (cm)    1.006711
petal width (cm)     1.006711
dtype: float64

 

# 3. MinMaxScaler

MinMaxScaler는 데이터 값을 0과 1 사이 범위 값으로 변환합니다. 단, 음수 값이 있으면 -1에서 1 값으로 변환합니다. 일반적으로 정규화는 서로 다른 피쳐의 크기를 통일하기 위해 변환해주는 개념입니다. 

 

예를 들면, 피쳐 A는 거리를 나타내는 변수로써 값이 0~100KM로 주어지고 B는 금액을 나타내는 속성으로 값이 0~100,000,000원으로 주어지면 이 변수를 모두 동일한 크기 단위로 비교하기 위해 모두 최소 0~ 최대 1의 값으로 변환하는 것입니다. 즉, 개별 데이터의 크기를 모두 똑같은 단위로 변경하는 것입니다. 데이터의 분포가 가우시안이 아닐 경우에  MinMaxScaler을 적용해 볼 수 있습니다. 

 

Normalization 

 

#3. 실습

이렇게 모든 칼럼이 최솟값 0과 최댓값 1 사이에 있음을 확인할 수 있었습니다.

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
scaler.fit(iris_df)

iris_mms = scaler.transform(iris_df)
iris_mms = pd.DataFrame(data=iris_mms, columns=iris.feature_names)
print('feature 최소 값 : ')
print(iris_mms.min())

print('feature 최대 값 : ')
print(iris_mms.max())
#결과:
feature 최소 값 : 
sepal length (cm)    0.0
sepal width (cm)     0.0
petal length (cm)    0.0
petal width (cm)     0.0
dtype: float64
feature 최대 값 : 
sepal length (cm)    1.0
sepal width (cm)     1.0
petal length (cm)    1.0
petal width (cm)     1.0
dtype: float64

# 학습 데이터와 테스트 데이터의 스케일링 변환 시 유의할 점

StandardScaler와 MinMaxScaler는 같은 Scaler객체를 이용하여 데이터의 스케일링 변환 시 fit(), fit_transform() 메서드를 이용합니다.

fit() 메서드는 데이터 변환을 위한 기준 정보 설정을 적용, transform() 메소드는 데이터 변환 역할을 수행합니다. 

 

그리고 fit_transform()은 동시에 수행할 수 있는 메서드입니다.

 

하지만, 학습 데이터 세트와 테스트 데이터 세트에 이 fit()와 transform()을 적용하면 테스트 데이터 세트로는 fit()을 수행하지 않고 학습 데이터 세트로 fit()을 수행한 결과를 이용해 transform() 변환을 적용해야 하는 점입니다,.

다시 말하자면, 테스트 세트로 fit()을 다시 하면 새로운 스케일링 기준 정보를 만들기 되면 두 기준 정보가 서로 달라지기 때문에 올바른 예측 결과를 도출하지 못할 수 있습니다.

 

728x90
반응형
Comments