인코딩:
범주형 데이터를 숫자로 변환하는 과정
왜 필요할까?
- 머신러닝 모델은 숫자만 입력받을 수 있음
- 문자열 그대로 넣으면 모델이 학습하지 못함
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 |