본문 바로가기
개발 Tools/파이썬_Deep learning & ML

머신러닝 StandardScaler(표준화)

by 전컴반 2021. 7. 15.
반응형

우린 전처리 과정에서 다른 단위를 가진 애들을 분석해야 할 때가 있다. 한 놈은 kg, 한놈은 cm 이라면 어떻게 해야 할까??

2가지 방법이 있다. 하나는 표준화와 하나는 정규화이다.

 

표준화 = StandardScaler

정규화 = MinMaxScaler

 

이번에는 표준화를 볼 것이고 다음에는 정규화를 볼 것이다.

 

StandardScaler 개념

 

간단하다. 모든 애들을 평균이 0이고 분산이 1인 정규 분포로 만드는 것이다.

 

수학식부터 살펴보면 굉장히 간단하다. 

 

(Xi - (X의 평균)) / (X의 표준편차)

 

아이패드가 없어서 이렇게...글로 적어본다. 젠장

예시로 설명을 하자면, 만약 평균이 50이인데 임의 숫자는 49라 하자, 그러면 어떻게 되는 것일까?

정답은 (49-50) / 1 = -1이다. 여기서 표준편차란 평균으로부터 얼마나 떨어져있는지를 구한 것이다. 

 

라이브러리

 

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

 

평균, 분산 구하기

 

어김없이 붓꽃데이터를 가져와서 본다. 

 

iris = load_iris()
iris_data = iris.data
iris_df = pd.DataFrame(iris_data, columns=iris.feature_names)
print(iris_df.mean())
print(iris_df.var())

출력
sepal length (cm)    5.843333
sepal width (cm)     3.057333
petal length (cm)    3.758000
petal width (cm)     1.199333
dtype: float64

sepal length (cm)    0.685694
sepal width (cm)     0.189979
petal length (cm)    3.116278
petal width (cm)     0.581006
dtype: float64

 

평균과 분산을 보기 위해 데이터 프레임에 담아서 본다.

 

StandardScaler

 

사용법은 간단하다. 학습시키고 변환한다.

 

scaler = StandardScaler()
scaler.fit(iris_df)

iris_scaled = scaler.transform(iris_df) 

iris_scaled_df = pd.DataFrame(iris_scaled, columns=iris.feature_names) 
print(iris_scaled_df)
print(f"평균\n{iris_scaled_df.mean()}")
print(f"분산\n{iris_scaled_df.var()}")

출력
     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

[150 rows x 4 columns]

평균
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

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

 

먼저 객체를 생성하여 학습시킨다. 그 안에 데이터를 집어 넣어서 transfrom을 한다. 

정규화는 됐지만 리스트의 형태로 돼 있어서 다시 데이터 프레임의 형태로 바꿔줘야 한다.

 

츨력을 보니, 평균이 0, 분산이 1이에 가까운 정규분포로 확인된다.

-1.690315e-15 은 -1.690315 x 10^-15 이다.

반응형

댓글