[ML] feature scaling

Woong·2023년 8월 23일
0

Python / Machine Learning

목록 보기
10/22

normalization (정규화)

  • 대부분 [0,1] 범위에 맞추는 방식

MinMaxScaler

  • min-max scaling (최소-최대 스케일 변환)

  • 샘플 xix^i 에 대해 아래와 같이 scaling 하여 계산

    • xnorm(i)=xixminxmaxxminx^{(i)}_{norm}=\frac { x^{i} - x_{min} } {x_{max} - x_{min}}
  • dataset 준비
# 의존성
 pipenv install scikit-learn pandas
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler, MaxAbsScaler
import pandas as pd


def get_dataset():
    ## wine dataset
    df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None)
    df_wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash',
                       'Alkalinity of ash', 'Magnesium', 'Total phenols', 'Flavanoids',
                       'Nonflavanoid phenols', 'Proanthocyanidins', 'Color intensity', 'Hue',
                       'OD280/OD315 of diluted wines', 'Proline']

    ## split dataset
    x, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0, stratify=y)
    return x_train, x_test, y_train, y_test
  • scikit-learn MinMaxScaler 를 이용한 구현
def min_max_scaling():
    x_train, x_test, y_train, y_test =get_dataset()

    ## feature scaling
    # min-max scaling (normalization)
    mms = MinMaxScaler()
    x_train_norm = mms.fit_transform(x_train) # train set 으로 파라미터 학습
    x_test_norm = mms.transform(x_test) # 학습한 파라미터로 transform

standardization (표준화)

  • 각 feature 의 평균을 0, 표준편차(standard deviation) 를 1로

    • -> 정규 분포의 특성
  • 이상치 (outlier) 에 덜 민감한 편

    • 위 정규화의 min-max scaling 은 최소, 최대치를 기준으로 scaling 하므로, outlier 로 인해 샘플 구간이 좁아지는 문제가 발생
  • 수식으로는 아래와 같다

    • μxμ_x : feature 샘플 평균
    • σxσ_x : feature 샘플의 표준편차

xstd(i)=xiμxσxx^{(i)}_{std} = \frac {x^{i} - μ_x} {σ_x}

  • scikit-learn StandardScaler 를 이용한 구현
    • fit_transform 으로 train dataset 에만 적용
      • 학습한 파라미터로 테스트 데이터셋, 신규 데이터에 모두 변환 적용 (테스트 데이터셋 재학습 X)
    • tranform 메소드로 변환
  • 희소 행렬(sparse matrix) 은 with_mean=False 지정하면 사용 가능
    • 희소 행렬 : 행렬의 값이 대부분 0인 행렬
def standard_scaling():
    x_train, x_test, y_train, y_test = get_dataset()

    # standardization
    std_scaler = StandardScaler()
    x_train_std = std_scaler.fit_transform(x_train) # train set 으로 파라미터 학습
    x_test_std = std_scaler.transform(x_test) # 학습한 파라미터로 transform

RobustScaler

  • schikit-learn RobustScaler
    • outlier 가 많은 작은 dataset 에 유리
  • 각 feature 별로 중간 값 q2q_2을 빼고, 1사분위수(25백분위수) q1q_1 와 3사분위수(75백분위수) q3q_3로 스케일 조정
    • 사분위수(quartile) : 값을 정렬하여 4등분, 141\over4, 121\over2, 343\over4 변량값
  • 희소 행렬 (sparse matrix) fit 메소드에 사용 불가. 변환은 가능

xrobust(i)=x(i)q2q3q1x^{(i)}_{robust} = \frac {x^{(i)}-q_2} {q_3-q_1}

def robust_scaling():
    x_train, x_test, y_train, y_test = get_dataset()

    # scaling
    robust_scaler = RobustScaler()
    x_train_robust = robust_scaler.fit_transform(x_train) # train set 으로 파라미터 학습
    x_test_robust = robust_scaler.transform(x_test) # 학습한 파라미터로 transform

MaxAbsScaler

  • 각 feature 별로 데이터를 절대값의 최대값으로 나누는 방식
    • -> [-1,1] 범위. 최대값 1
    • 데이터를 중앙에 맞추지 않기 때문에 희소 행렬 (sparse matrix) 사용 가능
def max_abs_scaling():
    x_train, x_test, y_train, y_test = get_dataset()

    # scaling
    max_abs_scaler = MaxAbsScaler()
    x_train_robust = max_abs_scaler.fit_transform(x_train) # train set 으로 파라미터 학습
    x_test_robust = max_abs_scaler.transform(x_test) # 학습한 파라미터로 transform

reference

0개의 댓글