정규화와 표준화가 왜 필요한 것일까?
머신러닝은 특징들을 받아 결과를 도출해내는 과정인데, 여러 특징들은 모두 다양한 단위를 같고있습니다.
예로들어 특징A는 0~100KM의 거리를 뜻하고 특징B는 0~100000000원을 의미할때 두개의 특징을 모두 동일한 크기단위로 비교하기 위해 값을 변환하는 것입니다. 즉 개별데이터의 크기를 모두 똑같은 단위로 변경하는 것입니다.
정규화
정규화의 공식은 위와 같다.
각 특징들을 최소0에서 최대1까지로 변환하여 준다.
표준화
표준화의 공식은 위와 같다.
각 특징들의 값이 평균에서 얼마나 멀리 떨어져 있는지를 나타낼때 사용한다.
StandScaler
StandScaler는 표준화를 쉽게 지원해주는 클래스이다.
평균을0, 분산이 1인 값으로 변환해준다.
StandardScaler가 어떻게 데이터 값을 변환하는지 데이터 세트로 확인해 보겠습니다.
먼저 데이터세트를 준비하고 각 특징들의 평균값과 분산을 출력해봅니다.
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())
#output
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
이제 StandardScaler로 각특징을 표준화하겠습니다.
from sklearn.preprocessing import StandardScaler
#StandardScaler객체 생성
scaler=StandardScaler()
#StandardScaler로 데이터 세트 변환. 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())
#output
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
모든 칼럼값의 평균이 0에 가까운 값으로, 분산은 1에 가까운 값으로 변환됐음을 알수있습니다.
MinMaxScaler
데이터값을 0~1사이의 값으로 변환합니다.(만약 음수값이 있다면 -1~1사이의 값으로 변환합니다.)
데이터의 분포가 가우시안 분포(정규분포)가 아닐시 MinMaxScaler를 적용해볼수 있습니다.
MinMaxScaler가 어떻게 데이터 값을 변환하는지 데이터 세트로 확인해 보겠습니다.
from sklearn.preprocessing import StandardScaler
#StandardScaler객체 생성
scaler=StandardScaler()
#StandardScaler로 데이터 세트 변환. 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())
#output
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
이제 MinMaxScaler로 각특징을 표준화하겠습니다.
from sklearn.preprocessing import MinMaxScaler
#MinMaxScaler객체 생성
scaler=MinMaxScaler()
#MinMaxScaler로 데이터 세트 변환. 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.min())
print('\nfeature들의 최댓값')
print(iris_df_scaled.max())
#output
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
모든 피처에 0~1사이의 값으로 변환되는것을 볼수있습니다.
728x90
'머신러닝 > sklearn' 카테고리의 다른 글
평가(Accuracy) (0) | 2022.02.08 |
---|---|
평가(Evaluation) -accuracy (0) | 2022.02.08 |