21.07.15_사이킷런 표준화 / 정규화 스케일링

우니·2021년 7월 16일
1

머신러닝

목록 보기
1/3

피처스케일링

사이킷런에서 서로 다른 변수값을 일정 수준으로 맞추는
작업을 피처 스케일링(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 및 공식채널 회원수, 각 채널의 페이지 뷰, 스트리밍 사이트 음원순위 등을 비교하여 신인 아이돌의 앨범판매량이 어느 수준인지 파악하는데 쓸 수 있을 것 같았어요.

profile
데이터와 머신러닝을 배우는 일본사업 마케터입니다

0개의 댓글