타겟 인코딩
📋 문서 버전
이 문서는 2개의 버전이 있습니다. 현재 버전 1을 보고 있습니다.
타겟 인코딩
개요
타겟 인코딩(Target Encoding)은 머신러닝에서 범주형 변수(Categorical Variable) 수치형 변수 변환하는 고급코딩 기법 중 하나입니다. 이 방법은주형 변수의 범주(Category)를 그 범주에 속하는 목표 변수(Target Variable)의 통계적 요약값(예: 평균, 중앙값, 분산 등)으로 대체하는 방식을 사용합니다. 특히, 분류 문제나 회귀 문제에서 범주형 피처가 목표 변수와 강한 관계를 가질 때 효과적인 성능 향상을 기대할 수 있습니다.
타겟 인코딩은 레이블 인코딩(Label Encoding)이나 원-핫 인코딩(One-Hot Encoding)과 달리, 범주의 의미를 목표 변수와의 관계를 통해 수치화하므로 정보 손실을 줄이고 모델의 예측력을 높이는 데 유리합니다. 그러나 주의하지 않으면 데이터 누수(Data Leakage) 및 과적합(Overfitting) 문제가 발생할 수 있어, 적절한 정규화와 교차 검증 기법의 적용이 필수적입니다.
타겟 인코딩의 원리
타겟 인코딩은 다음과 같은 기본 아이디어를 따릅니다:
- 범주형 변수의 각 값(예: "서울", "부산", "대구")에 대해, 해당 범주에 속하는 목표 변수의 평균값을 계산합니다.
- 이후 해당 범주를 그 평균값으로 대체합니다.
예를 들어, 주어진 데이터셋에서 도시
라는 범주형 변수와 구매 여부
(0 또는 1)라는 이진 목표 변수가 있을 때:
도시 | 구매 여부 |
---|---|
서울 | 1 |
부산 | 0 |
서울 | 1 |
대구 | 1 |
부산 | 1 |
이 경우 각 도시의 타겟 인코딩 값은 다음과 같이 계산됩니다:
- 서울: (1 + 1) / 2 = 1.0
- 부산: (0 + 1) / 2 = 0.5
- 대구: 1 / 1 = 1.0
이제 도시
변수는 각각 1.0, 0.5, 1.0의 수치로 변환되어 모델에 입력됩니다.
타겟 인코딩의 장점
- 고유 카테고리 수가 많은 경우 효과적: 예를 들어, 우편번호, 사용자 ID, 제품 코드 등 고유값이 수천 개 이상인 경우 원-핫 인코딩은 차원이 과도하게 증가하지만, 타겟 인코딩은 단일 수치 피처로 압축 가능.
- 목표 변수와의 관계 반영: 범주의 실제 영향력을 수치로 표현하므로 모델이 더 의미 있는 패턴을 학습할 수 있음.
- 모델 성능 향상: 특히 부스팅 계열 모델(XGBoost, LightGBM, CatBoost)에서 뛰어난 성능을 보임.
타겟 인코딩의 단점 및 주의사항
1. 데이터 누수 (Data Leakage)
- 전체 데이터셋의 타겟 평균을 사용하면 훈련 데이터와 테스트 데이터가 서로 정보를 공유하게 되어, 검증 단계에서 과적합이 발생할 수 있습니다.
2. 저빈도 범주 (Low-frequency Categories)
- 특정 범주에 샘플이 매우 적을 경우, 타겟 평균이 불안정해지고 노이즈가 커짐. 예: 1개의 샘플만 있는 도시가 타겟 평균 1.0을 가지면 오해의 소지 있음.
3. 과적합 위험
- 특히 작은 데이터셋에서 타겟 인코딩은 모델이 훈련 데이터에 지나치게 최적화되는 경향이 있음.
타겟 인코딩의 정규화 기법
타겟 인코딩의 단점을 완화하기 위해 다음과 같은 정규화 기법이 사용됩니다:
1. Smoothing (스무딩)
- 범주별 평균과 전체 평균을 가중 평균하여 계산:
$$ \text{Encoded Value} = \frac{(\text{count} \times \text{category\_mean}) + (\text{weight} \times \text{global\_mean})}{\text{count} + \text{weight}} $$
여기서 weight
는 하이퍼파라미터로,통 5~10 정도로 설정.
2. Additive Smoothing (라플라스 스무딩)
- 범주별 성공/실패 카운트에 작은 상수를 더하여 불안정성 감소.
3. Leave-One-Out (LOO) 인코딩
- 각 샘플을 인코딩할 때, 자기 자신을 제외한 동일 범주의 타겟 평균을 사용. 데이터 누수를 줄이는 데 효과적.
4. K-Fold 타겟 인코딩
- 훈련 데이터를 K개의 폴드로 나누고, 각 폴드에서 다른 폴드의 평균을 사용하여 인코딩. 교차 검증 기반의 안전한 방법.
활용 예시 (파이썬 코드)
import pandas as pd
import numpy as np
from sklearn.model_selection import KFold
def kfold_target_encoding(train_df, test_df, cat_col, target_col, weight=10):
# 전체 데이터의 글로벌 평균
global_mean = train_df[target_col].mean()
# 결과 저장용
train_encoded = np.zeros(len(train_df))
test_encoded = np.zeros(len(test_df))
# K-Fold 적용
kf = KFold(n_splits=5, shuffle=True, random_state=42)
for train_idx, val_idx in kf.split(train_df):
X_train, X_val = train_df.iloc[train_idx], train_df.iloc[val_idx]
# 학습 데이터 기반 인코딩 맵 생성
encoding_map = X_train.groupby(cat_col)[target_col].agg(['mean', 'count'])
encoding_map['smoothed'] = (
(encoding_map['mean'] * encoding_map['count']) + (global_mean * weight)
) / (encoding_map['count'] + weight)
# 검증 데이터 인코딩
X_val_encoded = X_val[cat_col].map(encoding_map['smoothed']).fillna(global_mean)
train_encoded[val_idx] = X_val_encoded.values
# 테스트 데이터 인코딩
encoding_map_full = train_df.groupby(cat_col)[target_col].agg(['mean', 'count'])
encoding_map_full['smoothed'] = (
(encoding_map_full['mean'] * encoding_map_full['count']) + (global_mean * weight)
) / (encoding_map_full['count'] + weight)
test_encoded = test_df[cat_col].map(encoding_map_full['smoothed']).fillna(global_mean)
return train_encoded, test_encoded
관련 기술 및 대안
기법 | 설명 | 장점 | 단점 |
---|---|---|---|
원-핫 인코딩 | 각 범주를 이진 벡터로 변환 | 간단하고 직관적 | 고차원, 희소성 문제 |
레이블 인코딩 | 범주를 정수로 매핑 | 차원 감소 | 순서 부여 오류 가능 |
임베딩 | 딥러닝에서 저차원 밀집 벡터로 변환 | 복잡한 관계 학습 가능 | 대량의 데이터 필요 |
CatBoost 인코딩 | CatBoost 내장 인코딩 방식 | 자동화, 과적합 방지 | 모델 종속적 |
참고 자료 및 관련 문서
- [1] Micci-Barreca, D. (2001). A Preprocessing Scheme for High-Cardinality Categorical Attributes in Classification and Prediction Problems. ACM SIGKDD Explorations.
- [2] Target Encoding Done the Right Way, Kaggle Blog, 2020.
- [3] scikit-learn-contrib의
category_encoders
라이브러리: https://contrib.scikit-learn.org/category_encoders/ - [4] LightGBM, CatBoost 공식 문서 – 범주형 변수 처리 방식
타겟 인코딩은 데이터 과학 실무에서 자주 사용되는 강력한 기법이지만, 신중한 적용과 정규화가 필수적입니다. 특히 고차원 범주형 피처가 많은 현실 데이터셋에서 그 진가를 발휘하며, 현업의 머신러닝 파이프라인에서 중요한 위치를 차지하고 있습니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.