인공지능 공부/머신러닝

2021-04-26 머신러닝 완벽가이드 MinMacScaler, StandardScaler

앨런튜링_ 2021. 4. 26. 17:56
# 피처 스케이리링과 정규화
# 표준화 :표준화는 피처 각각이 평균이 0이고 분산이 1인 가우시안 정규분포를 가진 값으로 변환하는 것을 의미합니다.
# 정규화 :서로다른 피처 크기를 통일하기 위해 크기를 변환해주는 개념 최소를 0 최대는 1
    
# 그러나 사이킷런에서 전처리에 제공하는 Normalizer모듈과 일반적인 정규화는 약간의 차이가 있다. 
# 사이킷런의 Nomalizer모듈은 선형대수에서의 정규화 개념이 적용

# 혼선을 방지하기 위해 일반적인 의미의 표준화와 정규화를 피처스케일링으로 통칭
# 선형대수 개념의 정규화를 백터정규화로 지칭

# 먼저 사이킷런에서 제공하는 대표적인 피처스케일링 클래스인 StandardScaler와 MinMaxScaler를 알아보겠습니다.
StandardScaler
사이킷런에서 구현한 RBF 커널을 이용하는 서포트 벡터머신
선형회귀 , 로지스틱 회긴는 데이터가 가우시안 분포를 가지고 있다고 가정하고 구현됐지 때문에 사전에 표준화를 적용하는것이 예측 성능향상에 중요한 요소가 될 수 있다.
from sklearn.datasets import load_iris
import pandas as pd

#붓꽃 데이터 세트를 로딩하고 DataFrame으로 변환합니다.
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())
feature 들의 평균값:
sepal length (cm)    5.843333
sepal width (cm)     3.057333
petal length (cm)    3.758000
petal width (cm)     1.199333
dtype: float64

feature들의 분산값
sepal length (cm)    0.685694
sepal width (cm)     0.189979
petal length (cm)    3.116278
petal width (cm)     0.581006
dtype: float64
from sklearn.preprocessing import StandardScaler

#StandardScaler객체 생성
scaler = StandardScaler()

#StandardScale로 데이터 세트 변환 .fit()과 transform()호출
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)

#transform() 시 스케일 변환된 데이터 세트가 numpy ndarray로 반환돼 이를 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())
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
MinMacScaler
MinmaxScaker 는 데이터를 0~1사이의 범위값으로 변환합니다.(음수가 있으면 -1에서 1값으로 변환합니다). 데이터 분포가 가우시안 분포가 아닐 경우에 Min, Maxscale 을 적용해 볼 수 있습니다. 다음 예제를 통해 MinMaxScaler 가 어떻게 동작하는지 확인해보겠습니다.
from sklearn.preprocessing import MinMaxScaler

#객체생성
scaler = MinMaxScaler()
#데이터 세트 변환 fit trandform

scaler.fit(iris_df)
iris_scaler = scaler.transform(iris_df)
#transform()시 스케일 변환된 데이터 세트가 Numpy ndarray로 반환돼 이를  DataFrane으로 변환
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())

print(iris_df_scaled)
feature들의 최솟값
sepal length (cm)   -1.870024
sepal width (cm)    -2.433947
petal length (cm)   -1.567576
petal width (cm)    -1.447076
dtype: float64

feature들의 최댓값
sepal length (cm)    2.492019
sepal width (cm)     3.090775
petal length (cm)    1.785832
petal width (cm)     1.712096
dtype: float64
     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
0            -0.900681          1.019004          -1.340227         -1.315444
1            -1.143017         -0.131979          -1.340227         -1.315444
2            -1.385353          0.328414          -1.397064         -1.315444
3            -1.506521          0.098217          -1.283389         -1.315444
4            -1.021849          1.249201          -1.340227         -1.315444
..                 ...               ...                ...               ...
145           1.038005         -0.131979           0.819596          1.448832
146           0.553333         -1.282963           0.705921          0.922303
147           0.795669         -0.131979           0.819596          1.053935
148           0.432165          0.788808           0.933271          1.448832
149           0.068662         -0.131979           0.762758          0.790671