Skip to main content

인코딩과 스케일링

대부분의 ML 알고리즘은 수치형 입력만 처리할 수 있으며, 특성의 스케일에 민감합니다. 범주형 인코딩(Encoding)과 수치형 스케일링(Scaling)은 이를 해결하는 필수 전처리입니다.

학습 목표

  • 범주형 변수의 인코딩 방법(Label, One-Hot, Target)을 구분하여 적용할 수 있습니다.
  • 수치형 변수의 스케일링 방법(Standard, MinMax, Robust)을 선택할 수 있습니다.
  • 각 방법이 적합한 알고리즘과 상황을 판단할 수 있습니다.

왜 중요한가

“서울”, “부산” 같은 범주형 데이터를 그대로 모델에 입력할 수 없습니다. 또한 면적(100-5000)과 방 수(1-10)처럼 스케일이 다른 특성은 거리 기반 알고리즘(KNN, SVM)에서 큰 특성이 결과를 지배합니다.

핵심 개념

범주형 인코딩

방법적합한 상황주의사항
Label Encoding순서가 있는 범주순서 없는 범주에 사용 시 잘못된 관계 학습
One-Hot Encoding순서 없는 범주 (고유값 소수)고유값 많으면 차원 폭발
Target Encoding고유값이 많은 범주데이터 누수 위험 → 교차검증 필요
Ordinal Encoding명시적 순서 (학력, 등급)간격 동일 가정 주의
import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder, OrdinalEncoder

df = pd.DataFrame({
    "city": ["서울", "부산", "대구", "서울", "부산"],
    "grade": ["A", "B", "C", "A", "B"],
    "price": [500, 300, 200, 450, 280]
})

# Label Encoding (순서 없는 범주 - 트리 모델에서만 사용)
le = LabelEncoder()
df["city_label"] = le.fit_transform(df["city"])

# One-Hot Encoding (순서 없는 범주 - 범용)
df_onehot = pd.get_dummies(df, columns=["city"], prefix="city")
print(df_onehot.head())

# Ordinal Encoding (순서 있는 범주)
oe = OrdinalEncoder(categories=[["C", "B", "A"]])  # 순서 지정
df["grade_ordinal"] = oe.fit_transform(df[["grade"]])

수치형 스케일링

방법변환적합한 상황관련 레퍼런스
StandardScaler(x - mean) / std정규 분포 가정, SVM/로지스틱 회귀StandardScaler
MinMaxScaler(x - min) / (max - min)[0,1] 범위 필요, 신경망MinMaxScaler
RobustScaler(x - median) / IQR이상치가 많은 데이터-
MaxAbsScalerx / max(|x|)희소 행렬 보존-
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
import numpy as np

X = np.array([[100, 2], [200, 3], [150, 5], [5000, 4]])  # 이상치 포함

# StandardScaler: 평균 0, 표준편차 1
scaler_std = StandardScaler()
X_std = scaler_std.fit_transform(X)

# MinMaxScaler: 0~1 범위
scaler_mm = MinMaxScaler()
X_mm = scaler_mm.fit_transform(X)

# RobustScaler: 이상치에 강건
scaler_rb = RobustScaler()
X_rb = scaler_rb.fit_transform(X)

print("원본:", X[0])
print(f"Standard: {X_std[0]}")
print(f"MinMax:   {X_mm[0]}")
print(f"Robust:   {X_rb[0]}")

알고리즘별 전처리 필요 여부

알고리즘인코딩 필요스케일링 필요이유
선형 회귀필수권장계수 비교를 위해
로지스틱 회귀필수필수경사 하강법 수렴
SVM필수필수거리 기반
KNN필수필수거리 기반
결정 트리Label 가능불필요분할 기준만 사용
랜덤 포레스트Label 가능불필요트리 기반
XGBoost/LightGBMLabel 가능불필요트리 기반
스케일링은 반드시 학습 데이터에서 fit_transform, 테스트 데이터에서 transform만 사용해야 합니다. sklearn Pipeline을 사용하면 이 과정을 자동화할 수 있습니다.
결정 트리, 랜덤 포레스트, XGBoost 등 트리 기반 모델은 분할 기준점(threshold)으로 데이터를 나누므로 스케일에 영향을 받지 않습니다. 따라서 스케일링이 불필요합니다.
Target Encoding이나 Frequency Encoding을 사용하세요. CatBoost는 범주형 변수를 내장 처리할 수 있어서 별도 인코딩이 불필요합니다.

체크리스트

  • 범주형 변수에 적절한 인코딩 방법을 선택할 수 있다
  • StandardScaler, MinMaxScaler, RobustScaler의 차이를 설명할 수 있다
  • 알고리즘별 스케일링 필요 여부를 판단할 수 있다
  • 데이터 누수를 방지하면서 전처리를 수행할 수 있다

다음 문서