머신러닝 - 인코딩 & 스케일링

dumbbelldore·2024년 12월 30일
0

zero-base 33기

목록 보기
50/97

1. 인코딩(Encoding)과 스케일링(Scaling)

  • 데이터 분석 시, 데이터의 유형 및 분석 기법의 종류에 따라 적절한 인코딩과 스케일링을 병행한다면 더 나은 결과를 도출해낼 수 있음
  • 단, 항상 나은 결과를 보장하는 것은 아니며 데이터의 특성과 분포를 고려하여 적절한 방법을 활용하는 것이 중요
  • 특히, 데이터 누수(Data Leakage) 방지를 위해 Python 환경에서는 훈련 데이터셋에 fit_transform()을, 테스트 데이터셋에 transform()을 적용하여야 함에 유의
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 데이터 분리
X_train, X_test = train_test_split([[1], [2], [3], [4], [5]], test_size=0.2)

# 훈련 데이터: fit_transform() 적용
ss = StandardScaler()
X_train_sc = ss.fit_transform(X_train)

# 테스트 데이터: transform() 적용
# fit_transform() 사용 시, 새롭게 변환 기준을 계산하므로 데이터 누수 발생
X_test_sc = ss.transform(X_test)

2. 인코딩의 특징과 종류

  • 인코딩은 '범주형 데이터'를 '수치형 데이터'로 변환하는 방법
  • 범주형 데이터를 직접 처리하지 못하는 모델은 사전 인코딩 작업이 필수
    ex) 선형 회귀, 로지스틱 회귀, SVM, 인공신경망 등

2-1. One-Hot Encoding

  • 범주형 데이터를 이진 벡터(0, 1)로 변환함

  • 예시: ['Red', 'Green', 'Blue'][[1, 0, 0], [0, 1, 0], [0, 0, 1]]

from sklearn.preprocessing import OneHotEncoder
import pandas as pd

data = pd.DataFrame({'Color': ['Red', 'Green', 'Blue']})
encoder = OneHotEncoder()
encoded_data = encoder.fit_transform(data[['Color']]).toarray()
print(encoded_data)  # [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]

2-2. Label Encoding

  • 범주형 데이터를 대응되는 정수 값으로 변환함 (순서에 의미가 없음)

  • 예시: ['Red', 'Green', 'Blue'][0, 1, 2]

from sklearn.preprocessing import LabelEncoder

data = ['Red', 'Green', 'Blue']
encoder = LabelEncoder()
encoded_data = encoder.fit_transform(data)
print(encoded_data)  # [2 1 0]

2-3. Ordinal Encoding

  • 범주형 데이터를 '순서가 있는 정수 값'으로 변환함

  • 예시: ['Low', 'Medium', 'High'][0, 1, 2]

from sklearn.preprocessing import OrdinalEncoder

data = [['Low'], ['Medium'], ['High']]
encoder = OrdinalEncoder(categories=[['Low', 'Medium', 'High']])
encoded_data = encoder.fit_transform(data)
print(encoded_data)  # [[0.] [1.] [2.]]

3. 스케일링의 특징과 종류

  • 스케일링은 '수치형 데이터'의 크기를 일관된 기법으로 조정하는 방법
  • 거리 기반 계산 모델, 경사하강법 사용 모델은 스케일링의 적용/미적용 시 결과의 차이가 클 수 있음
    ex) KNN, K-Means, DBSCAN, PCA, 선형 회귀, 로지스틱 회귀, SVM, 인공신경망 등

3-1. Min-Max Scaling

  • 데이터를 0과 1 사이로 변환함

    X=XXminXmaxXminX' = \frac{X - X_{\text{min}}}{X_{\text{max}} - X_{\text{min}}}

  • 예시: [1, 5][0.0, 1.0]

from sklearn.preprocessing import MinMaxScaler

data = [[1], [2], [3], [4], [5]]
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(data)
print(scaled_data)  # [[0.  ] [0.25] [0.5 ] [0.75] [1.  ]]

3-2. Standard Scaling

  • 데이터가 평균 0, 표준편차 1의 값을 갖도록 변환함

    X=XμσX' = \frac{X - \mu}{\sigma}

  • 예시: [1, 5][-1.26, 1.26]

from sklearn.preprocessing import StandardScaler

data = [[1], [2], [3], [4], [5]]
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
print(scaled_data)  # [[-1.41421356] [-0.70710678] [ 0.        ] [ 0.70710678] [ 1.41421356]]

3-3. Robust Scaling

  • 데이터의 중앙값과 IQR을 사용하여 변환, 이상치 영향을 최소화 함

    X=XQ2Q3Q1X' = \frac{X - Q2}{Q3 - Q1}

  • 예시: [1, 100][-0.5, 9.5]

from sklearn.preprocessing import RobustScaler

data = [[1], [2], [3], [4], [100]]
scaler = RobustScaler()
scaled_data = scaler.fit_transform(data)
print(scaled_data)  # [[-0.25] [-0.25] [ 0.  ] [ 0.25] [24.25]]

3-4. MaxAbs Scaling

  • 데이터를 '최대 절대값'으로 나눠 -1과 1 사이로 변환함
  • 예시: [1, 5][0.2, 1.0]
from sklearn.preprocessing import MaxAbsScaler

data = [[1], [2], [3], [4], [5]]
scaler = MaxAbsScaler()
scaled_data = scaler.fit_transform(data)
print(scaled_data)  # [[0.2] [0.4] [0.6] [0.8] [1. ]]

*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 분석, 데이터 사이언스 학습 저장소

0개의 댓글