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

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'])

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

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

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'])

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

각 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'])

해당 정규화 방법은 이상치에 강한 특징을 보이기에 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 및 공식채널 회원수, 각 채널의 페이지 뷰, 스트리밍 사이트 음원순위 등을 비교하여 신인 아이돌의 앨범판매량이 어느 수준인지 파악하는데 쓸 수 있을 것 같았어요.

Toplist

최신 우편물

태그