Sklearn 정규화 - Sklearn jeong-gyuhwa

파이썬 사이킷런 스케일러 사용 예제, 특징 정리

안녕하세요. 이번 글에서는 파이썬 scikit-learn 라이브러리에서

각 feature의 분포를 정규화 시킬 수 있는 대표적인 Scaler 종류인

StandardScaler, MinMaxScaler 그리고 RobustScaler에 대하여

사용 예제와 특징을 살펴보도록 하겠습니다.

여기서는 아주 간단한 예시로 0~10의 숫자가 차례로 있는 x1 column

0~10의 제곱수가 차례로 있는 x2 column의 정규화 결과를

각 Scaler에서 비교해보며 대략적인 특징을 살펴보겠습니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'x1' : np.arange(11), 'x2' : np.arange(11) ** 2})

df
Sklearn 정규화 - Sklearn jeong-gyuhwa

StandardScaler : 평균 0, 표준편차 1 기준 정규화

StandardScaler는 각 열의 feature 값의 평균을 0으로 잡고,

표준편차를 1로 간주하여 정규화시키는 방법입니다.

사용 방법은 Scaler를 import한 뒤, 데이터셋을 fit_transform시켜주시면 됩니다.

이 사용법은 뒤에서 설명할 다른 Scaler에서도 동일합니다.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df_std = scaler.fit_transform(df)

pd.DataFrame(df_std, columns = ['x1_std', 'x2_std'])
Sklearn 정규화 - Sklearn jeong-gyuhwa

각 데이터가 평균에서 몇 표준편차만큼 떨어져있는지를 기준으로 삼게 됩니다.

데이터의 특징을 모르는 경우 가장 무난한 종류의 정규화 중 하나입니다.

MinMaxScaler : 최솟값 0, 최댓값 1 기준 정규화

MinMaxScaler는 각 feature의 최솟값과 최댓값을 기준으로

0~1 구간 내에 균등하게 값을 배정하는 정규화 방법입니다.

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
df_minmax = scaler.fit_transform(df)

pd.DataFrame(df_minmax, columns = ['x1_minmax', 'x2_minmax'])
Sklearn 정규화 - Sklearn jeong-gyuhwa

이상치에 민감하다는 단점이 있긴 하지만,

각 feature의 범위가 모두 0~1로 동등하게 분포를 바꿀 수 있다는 장점이 있습니다.

RobustScaler : 중앙값 0, 사분위수 IQR 기준 정규화

RobustScaler는 각 feature의 median(Q2)에 해당하는 데이터를 0으로 잡고,

Q1, Q3 사분위수와의 IQR 차이 만큼을 기준으로 정규화를 진행합니다.

공식 : (데이터 값 - Q2) / (Q3 - Q1)

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()
df_robust = scaler.fit_transform(df)

pd.DataFrame(df_robust, columns = ['x1_robust', 'x2_robust'])
Sklearn 정규화 - Sklearn jeong-gyuhwa

해당 정규화 방법은 이상치에 강한 특징을 보이기에 RobustScaler라는 이름이 붙었으며,

이상치가 많은 데이터를 다루는 경우 유용한 정규화 방법이 될 수 있습니다.

피처스케일링

사이킷런에서 서로 다른 변수값을 일정 수준으로 맞추는
작업을 피처 스케일링(Feature Scaling)이라고 합니다.

용어

  1. 피처(Feature) : 변수
  2. 표준화 (Standard Scaling)
  3. 정규화 (MinMax Scaling)

각 용어 사용 목적

  1. 피처 : 데이터에 담겨져 있는 값.
    Standard Scaling 또는 MinMax Scaling을 하면 값의 범위들이 일정수준으로 맞춰지면서 비교, 분석을 할 수 있게 됩니다.
  1. 표준화 (Standard Scaling) : 평균값(.mean())과 분산값(.var())을 구하기 위해 사용합니다.
  • 데이터를 평균이 0, 분산이 1인 정규분포로 만들어 주는 과정입니다.
  • 전처리 단계에서 스탠다드 스케일링을 하면 성능 향상에 좋다고 하네요.
  1. 정규화 (MinMax Scaling) : 피쳐 단위를 맞춰준 다음 최대값과 최소값을 구할 때 사용합니다.
  • 사이킷런에서 제공하는 MinMaxScaler는 음수값이 없으면 0~1의 값으로 바뀝니다.
  • 음수값이 있으면 -1 ~ 1 값으로 변환되고요
  • 표준화가 가능하면 표준화를 하면되지만 아닐 때는 정규화를 하면 됩니다.
  • 하지만 둘 다 쓰는 경우가 많을 것 같네요.

바로 보스턴 주택 가격 데이터 셋을 활용하여 예시를 보겠습니다.


import pandas as pd

from sklearn.datasets import load_boston
boston = load_boston()
print(boston.keys())
boston.target #보스턴 집값
print(boston.DESCR)
print(boston.feature_names)

df_boston = pd.DataFrame(boston.data, columns=boston.feature_names)

#종속변수 target추가하며 전체 컬럼을 데이터 프레임에 넣음 
df_boston['target'] = boston.target
df_boston.head()



#정규화준비

from sklearn.preprocessing import StandardScaler
import pandas as pd


df_boston = load_boston()
df_boston_data = boston.data
df_boston = pd.DataFrame(data=df_boston_data, columns=boston.feature_names)

#표준화(Standard Scaling)

scaler = StandardScaler()
scaler.fit(df_boston)
boston_scaled = scaler.transform(df_boston)

df_boston_scaled = pd.DataFrame(data=boston_scaled, columns=boston.feature_names)

#각 컬럼의 평균값
print(df_boston_scaled.mean())

print('\n')

#각 컬럼의 분산값
print(df_boston_scaled.var())


#결과

CRIM      -8.787437e-17
ZN        -6.343191e-16
INDUS     -2.682911e-15
CHAS       4.701992e-16
NOX        2.490322e-15
RM        -1.145230e-14
AGE       -1.407855e-15
DIS        9.210902e-16
RAD        5.441409e-16
TAX       -8.868619e-16
PTRATIO   -9.205636e-15
B          8.163101e-15
LSTAT     -3.370163e-16
dtype: float64


CRIM       1.00198
ZN         1.00198
INDUS      1.00198
CHAS       1.00198
NOX        1.00198
RM         1.00198
AGE        1.00198
DIS        1.00198
RAD        1.00198
TAX        1.00198
PTRATIO    1.00198
B          1.00198
LSTAT      1.00198
dtype: float64


#표준화(MinMaxScaling)

from sklearn.preprocessing import MinMaxScaler

Scaler = MinMaxScaler()
scaler.fit(df_boston)


df_boston_scaled = pd.DataFrame(data=boston_scaled, columns=boston.feature_names)

#최소값 구하기
print(df_boston_scaled.min())

print()

#최대값 구하기
print(df_boston_scaled.max())



#결과 

CRIM      -0.419782
ZN        -0.487722
INDUS     -1.557842
CHAS      -0.272599
NOX       -1.465882
RM        -3.880249
AGE       -2.335437
DIS       -1.267069
RAD       -0.982843
TAX       -1.313990
PTRATIO   -2.707379
B         -3.907193
LSTAT     -1.531127
dtype: float64

CRIM       9.933931
ZN         3.804234
INDUS      2.422565
CHAS       3.668398
NOX        2.732346
RM         3.555044
AGE        1.117494
DIS        3.960518
RAD        1.661245
TAX        1.798194
PTRATIO    1.638828
B          0.441052
LSTAT      3.548771

사족1.

단위가 다른 값을 비교할 때 일정한 기준치를 두고 비교할 때 자주 쓸 것 같아요.

개인적으로는 이번달에 데뷔한 아이돌의 브랜드를 분석하기 위하여, 같은 시기에 컴백한 데뷔연차 5년 이상된 아이돌의 지표를 분석할 때 쓸 것 같아요. (또는 해당 기획사에서 가장 대중적으로 잘 알려진 선배 아이돌의 지표랑) 앨범 판매량, 유튜브 채널 구독자수, 각 sns 및 공식채널 회원수, 각 채널의 페이지 뷰, 스트리밍 사이트 음원순위 등을 비교하여 신인 아이돌의 앨범판매량이 어느 수준인지 파악하는데 쓸 수 있을 것 같았어요.