타겟 인코딩
타겟 인코딩
개요
타겟 인코딩(Target)은 머신러닝과 데이터 과학에서 범주형 변수(categorical variable)를 수치형으로 변환하는 고급 인코딩 기법 중 하나입니다. 이 방법은 각 범주(category)를 해당 범주에 속하는 타겟(target) 변수의 통계적 요약값(예: 평균, 중앙값 등)으로 대체함으로써, 범주형 변수와 타겟 간의 관계를 효과적으로 반영할 수 있게 해줍니다. 특히 고차원 범주형 변수(high-cardinality categorical features)에 대해 원-핫 인코딩(One-Hot Encoding)보다 더 효율적인 성능을 발휘할 수 있습니다.
타겟 인코딩은 회귀 및 분류 문제 모두에 적용 가능하지만, 주로 분류 문제에서 타겟 레이블의 평균값(예: 이진 분류에서 1의 비율)을 사용합니다. 예를 들어, "도시"라는 범주형 변수가 있을 때, 각 도시별로 구매 전환률(타겟이 1인 비율)을 계산하여 그 수치를 해당 도시의 인코딩 값으로 사용할 수 있습니다.
원리와 동작 방식
타겟 인코딩의 핵심 아이디어는 범주형 변수의 각 범주를 타겟 변수의 조건부 기댓값(E[target | category])으로 매핑하는 것입니다. 이는 모델이 범주가 타겟에 미치는 영향을 학습하는 데 도움을 주며, 특히 범주가 많은 경우 차원 축소 효과도 가져옵니다.
기본 수식
범주 ( c )에 대해 타겟 인코딩 값은 다음과 같이 계산됩니다:
[ \text{Target Encoding}(c) = \frac{\sum_{i \in \text{category}=c} y_i}{\text{count}(c)} ]
여기서: - ( y_i ): ( i )번째 샘플의 타겟 값 - ( \text{count}(c) ): 범주 ( c )에 속한 샘플 수
예를 들어, 이진 분류 문제에서 타겟이 0 또는 1일 경우, 각 범주는 해당 범주 내에서 타겟이 1인 비율로 인코딩됩니다.
장점
-
고차원 범주 처리에 효율적
원-핫 인코딩은 범주 수가 많을 경우 차원이 급격히 증가하지만, 타겟 인코딩은 각 범주를 하나의 수치로 표현하므로 메모리와 계산 효율성이 높습니다. -
타겟과의 관계 반영
범주가 타겟에 미치는 영향을 직접 수치로 표현하므로, 모델이 더 강력한 패턴을 학습할 수 있습니다. -
비선형 관계 포착 가능
범주 간의 순서가 없어도 타겟 값에 따라 자연스럽게 스케일링되므로, 순서형 인코딩보다 유연합니다.
단점 및 주의사항
1. 데이터 리크(Data Leakage) 위험
타겟 인코딩은 훈련 데이터 전체의 타겟 평균을 사용하므로, 과적합(overfitting)과 리크가 발생할 수 있습니다. 특히 샘플 수가 적은 범주는 타겟 평균이 불안정해져 노이즈를 학습할 수 있습니다.
2. 스무딩(Smoothing) 필요
이 문제를 완화하기 위해 스무딩 기법을 사용합니다. 일반적인 스무딩 공식은 다음과 같습니다:
[ \text{Smoothed Encoding}(c) = \frac{\sum y_i + \alpha \cdot \text{global_mean}}{n + \alpha} ]
- ( \alpha ): 스무딩 파라미터 (하이퍼파라미터)
- ( \text{global_mean} ): 전체 데이터에서의 타겟 평균
스무딩은 소수의 샘플을 가진 범주가 지나치게 extreme한 값을 가지는 것을 방지합니다.
3. 교차 검증 시 주의 필요
타겟 인코딩은 반드시 훈련 데이터 내에서만 계산되어야 하며, 검증/테스트 데이터에는 훈련 데이터의 인코딩 값을 적용해야 합니다. 잘못 구현하면 정보 누수가 발생합니다.
구현 예시 (Python)
import pandas as pd
import numpy as np
from sklearn.model_selection import KFold
def target_encode_smooth(train_df, test_df, col, target, alpha=5):
global_mean = train_df[target].mean()
# K-Fold를 이용한 교차 검증 기반 인코딩 (리크 방지)
kf = KFold(n_splits=5, shuffle=True, random_state=42)
train_encoded = np.zeros(len(train_df))
for train_idx, val_idx in kf.split(train_df):
X_train, X_val = train_df.iloc[train_idx], train_df.iloc[val_idx]
means = X_train.groupby(col)[target].mean()
train_encoded[val_idx] = train_df.iloc[val_idx][col].map(means).fillna(global_mean)
# 스무딩 적용
temp_df = train_df.copy()
temp_df['encoded'] = train_encoded
smoothing = temp_df.groupby(col).agg({target: 'count', 'encoded': 'mean'})
smoothing['smoothed'] = (smoothing['encoded'] * smoothing[target] + global_mean * alpha) / (smoothing[target] + alpha)
# 테스트 데이터 인코딩
test_encoded = test_df[col].map(smoothing['smoothed']).fillna(global_mean)
return train_encoded, test_encoded
관련 기법
- 원-핫 인코딩(One-Hot Encoding): 단순하지만 고차원 문제 발생
- 레이블 인코딩(Label Encoding): 순서 정보가 없음에도 순서를 부여
- 베이지안 타겟 인코딩(Bayesian Target Encoding): 사전 분포를 사용한 확률적 접근
- Leave-One-Out Encoding: 현재 샘플을 제외하고 평균을 계산하여 리크 완화
참고 자료 및 관련 문서
- Feature Engineering for Machine Learning, O'Reilly
- Target Encoding Done the Right Way, Kaggle Blog
- sklearn-contrib 패키지:
[category_encoders](/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%B6%84%EC%84%9D%20%EB%8F%84%EA%B5%AC/category_encoders)
라이브러리에서[TargetEncoder](/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%B6%84%EC%84%9D%20%EB%8F%84%EA%B5%AC/TargetEncoder)
제공
타겟 인코딩은 적절히 사용하면 강력한 피처 엔지니어링 도구가 되며, 특히 고차원 범주형 변수가 많은 실제 데이터 분석에서 매우 유용합니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.