머신러닝

인코딩(Encoding)

Wat_zy 2025. 12. 1. 11:01

인코딩: 

범주형 데이터를 숫자로 변환하는 과정

 

왜 필요할까?

  • 머신러닝 모델은 숫자만 입력받을 수 있음
  • 문자열 그대로 넣으면 모델이 학습하지 못함

One-Hot Encoding

  • 순서가 없는 범주형 변수(Nominal)
    예: 성별, 혈액형, 지역, 색상
  • 범주 개수가 너무 많지 않을 때
# Blood_type
A  → (1,0,0,0)
B  → (0,1,0,0)
O  → (0,0,1,0)
AB → (0,0,0,1)
import pandas as pd
df_encoded = pd.get_dummies(df, columns=['blood_type'])

 

Label Encoding

  • 순서가 있는 범주형 변수(Ordinal)
    예: 낮음 < 중간 < 높음
  • 범주 개수가 너무 많아서 One-hot이 비효율적일 때
  • 트리 기반 모델(RandomForest, XGBoost)에서는 순서가 없더라도 사용해도 됨
    → 트리는 숫자의 크고 작음을 계산하지 않기 때문
  • LE는 결정트리, 랜덤포레스트, XGBoost, LightGBM 등에 사용된다.
# Satisfaciton
불만(0), 보통(1), 만족(2)
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
df['satisfaction_encoded'] = le.fit_transform(df['satisfaction'])

범주 수가 많을 경우

Target Encoding

  • 각 범주를 “그 범주의 평균 타깃값”으로 변환
    예: red → 평균 구매율 0.37
    사용 모델: LightGBM, XGBoost 등에서 매우 효과적

⚠ 단점: 데이터 누수 위험
→ 반드시 Train/Test split 이후에 적용해야 함.

# Color
색상 | 구매여부
red   | 1
red   | 0
blue  | 1
green | 0

red = (1+0)/2 = 0.5
blue = 1.0
green = 0.0
import category_encoders as ce

encoder = ce.TargetEncoder(cols=['color'])

X_train_encoded = encoder.fit_transform(X_train, y_train)
X_test_encoded = encoder.transform(X_test)

 

Frequency Encoding

  • 각 범주가 등장한 횟수로 변환
    예: 지역=서울 → 25000회 등장
    → 간단하지만 surprisingly strong
city = [서울, 부산, 서울, 대전, 서울, 부산]

서울 → 3  
부산 → 2  
대전 → 1
freq = X_train['city'].value_counts()

X_train['city_freq'] = X_train['city'].map(freq)
X_test['city_freq'] = X_test['city'].map(freq).fillna(0)

 

Binary Encoding

  • 범주를 이진수(binary) 형태로 변환
  • 범주 개수가 많은 경우 차원을 압축할 수 있음
A, B, C, D, E
A=1, B=2, C=3, D=4, E=5
A → 001
B → 010
C → 011
D → 100
E → 101
import category_encoders as ce

encoder = ce.BinaryEncoder(cols=['product_id'])

X_train_encoded = encoder.fit_transform(X_train)
X_test_encoded = encoder.transform(X_test)

 

인코딩 종류 Train/Test split 이전? 이후? 이유
One-hot ❌ 위험 Train/Test 범주 불일치 위험
Label Encoding ✔ 가능 단순 매핑이라 leakage 낮음
Target Encoding ❌ 절대 금지 ✔ 필수 타깃 y 정보 누수 위험
Frequency Encoding ✔ 가능 위험도 낮음

 

모델 유형별 인코딩 선택

1) 선형 모델(Linear/Logistic Regression)

  • 숫자 크기를 그대로 사용함
  • Label Encoding 절대 금지
  • 반드시 One-hot Encoding 사용

2) 거리 기반 모델(KNN, SVM)

  • 거리 계산에 숫자가 직접 사용됨
  • Label Encoding은 숫자 크기 때문에 왜곡 심함
    ✔ One-hot 또는 Frequency Encoding 사용

3) 트리 기반 모델(RandomForest, XGBoost, LightGBM)

  • 숫자의 크고 작음을 해석하지 않음
  • 단순히 “특성값이 특정 기준보다 크냐/작냐”만 봄
    ✔ Label Encoding 사용 가능
    ✔ One-hot도 가능
    ✔ Target Encoding과 궁합이 제일 좋음 (특히 LGBM)

4) 딥러닝

  • 범주형을 Embedding으로 처리하는 경우 많음
  • LightGBM처럼 Target Encoding도 잘 먹힘
  • 단순 dense layer라면 One-hot 사용 가능
    ✔ 범주가 너무 많으면 One-hot은 비추 → Embedding or Target Encoding

'머신러닝' 카테고리의 다른 글

회귀 분석 (Regression Analysis)  (0) 2025.12.22
스케일링(Scaling)  (0) 2025.12.01
지도학습 & 비지도학습  (0) 2025.11.28