타깃 인코딩
📋 문서 버전
이 문서는 2개의 버전이 있습니다. 현재 버전 1을 보고 있습니다.
타깃 인코딩
요
타깃 인코딩(Target Encoding)은 머신러닝에서 범주형 변수(Categorical Variable)를 수치형 변수로 변환하는 고급 인딩 기법 중 하나입니다. 이 방법은 범주형 변수의 각 범주(Category)를 해당 범주에 속하는 타깃 변수(Target Variable)의 통계적 값(예: 평균, 중앙값, 분산 등)으로 대체하는 방식으로, 특히 회귀 및 분류 문제에서 유용하게 사용됩니다. 타깃 인코딩은 레이블 인코딩이나 원-핫 인코딩과 비교해 범주형 변수의 정보를 더 효과적으로 표현할 수 있다는 장점이 있습니다.
하지만 타깃 인코딩은 과적합(Overfitting)이나 데이터 누수(Data Leakage)의 위험이 있어, 적절한 정규화나 교차 검증 기법을 함께 적용해야 합니다. 이 문서에서는 타깃 인코딩의 원리, 장단점, 구현 방법 및 실무에서의 주의사항을 다룹니다.
타깃 인코딩의 원리
타깃 인코딩은 범주형 변수의 각 고유 값(레이블)을 타깃 변수와의 관계를 기반으로 수치화하는 기법입니다. 예를 들어, 분류 문제에서 타깃이 이진 변수(0 또는 1)라면, 각 범주에 대해 해당 범주에 속하는 샘플들의 타깃 평균값을 계산하여 그 범주를 대표하는 수치로 사용합니다.
예시
다음과 같은 데이터가 있다고 가정해 봅시다:
지역 | 타깃 |
---|---|
서울 | 1 |
부산 | 0 |
서울 | 1 |
대구 | 0 |
부산 | 1 |
- 서울: 타깃 평균 = (1 + 1) / 2 = 1.0
- 부산: 타깃 평균 = (0 + 1) / 2 = 0.5
- 대구: 타깃 평균 = 0 / 1 = 0.0
이 값을 이용해 '지역' 열을 다음과 같이 변환할 수 있습니다:
지역 | 타깃 인코딩 |
---|---|
서울 | 1.0 |
부산 | 0.5 |
대구 | 0.0 |
이렇게 변환된 수치형 변수는 모델이 범주형 변수의 의미를 더 잘 이해하도록 도와줍니다.
타깃 인코딩의 종류
1. 단순 평균 인코딩 (Simple Mean Encoding)
가장 기본적인 형태로, 각 범주에 대해 타깃의 평균을 계산하여 인코딩합니다. 회귀 문제에서는 연속형 타깃의 평균을, 분류 문제에서는 양성 클래스의 평균(즉, 확률)을 사용합니다.
2. 스무딩 (Smoothing)
소수의 샘플만 있는 범주의 경우 평균값이 불안정해질 수 있습니다. 이를 방지하기 위해 스무딩 기법을 사용합니다. 일반적인 스무딩 공식은 다음과 같습니다:
[ \text{Encoded Value} = \frac{(\text{그룹 평균} \times n) + (\text{전체 평균} \times m)}{n + m} ]
여기서: - ( n ): 해당 범주의 샘플 수 - ( m ): 스무딩 파라미터 (하이퍼파라미터로 설정)
이 방식은 소규모 그룹의 영향을 완화하고, 전체 데이터의 경향성을 반영함으로써 과적합을 줄입니다.
3. 교차 검증 기반 인코딩 (CV-based Target Encoding)
학습 데이터 전체를 사용해 인코딩하면 데이터 누수가 발생할 수 있습니다. 이를 방지하기 위해 교차 검증(Cross-Validation) 기반 인코딩을 사용합니다. 예를 들어, K-Fold CV를 사용할 경우, 각 폴드의 검증 데이터는 다른 폴드의 학습 데이터에서 계산된 타깃 평균으로 인코딩됩니다. 이는 검증 데이터에 대한 정보 누수를 차단합니다.
4. 시간 기반 인코딩 (Temporal Encoding)
시계열 데이터에서는 시간 순서를 고려하여 인코딩해야 합니다. 과거의 타깃 평균만을 사용하여 현재 범주를 인코딩함으로써 미래 정보의 누수를 방지합니다.
장점과 단점
✅ 장점
- 고유 범주 수가 많을 때 효과적: 원-핫 인코딩은 고유 값이 많을 경우 차원 폭발을 일으키지만, 타깃 인코딩은 차원을 유지하면서 정보를 보존합니다.
- 범주의 의미를 수치로 반영: 범주가 타깃에 미치는 영향을 직접 반영하므로 모델 성능 향상에 기여할 수 있습니다.
- 비선형 관계 포착 가능: 범주와 타깃 간의 복잡한 관계를 간접적으로 표현할 수 있습니다.
❌ 단점
- 과적합 위험: 특히 샘플 수가 적은 범주에서 타깃 평균이 극단적으로 치우칠 수 있습니다.
- 데이터 누수: 학습 데이터 전체의 타깃을 사용하면 검증/테스트 데이터의 예측에 학습 데이터의 타깃 정보가 노출됩니다.
- 테스트 데이터 처리 문제: 테스트 데이터에 등장하는 새로운 범주는 인코딩할 수 없으므로, 평균값이나 사전 확률로 대체해야 합니다.
구현 예시 (Python)
import pandas as pd
from sklearn.model_selection import KFold
import numpy as np
def target_encode_cv(df, col, target, n_splits=5, smoothing=1.0):
# 전체 데이터의 타깃 평균
global_mean = df[target].mean()
encoded = np.zeros(len(df))
kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)
for train_idx, val_idx in kf.split(df):
X_train, X_val = df.iloc[train_idx], df.iloc[val_idx]
# 학습 데이터 기반 타깃 평균 계산
target_means = X_train.groupby(col)[target].mean()
# 스무딩 적용
counts = X_train[col].value_counts()
smoothed_means = (target_means * counts + global_mean * smoothing) / (counts + smoothing)
# 검증 데이터 인코딩
encoded[val_idx] = X_val[col].map(smoothed_means).fillna(global_mean).values
return encoded
# 사용 예
data = pd.DataFrame({
'category': ['A', 'B', 'A', 'C', 'B', 'A'],
'target': [1, 0, 1, 0, 1, 0]
})
data['category_encoded'] = target_encode_cv(data, 'category', 'target')
print(data)
관련 기 및 자료
- 원-핫 인코딩 (One-Hot Encoding): 단순하지만 고유 값이 많을 경우 비효율적.
- 레이블 인코딩 (Label Encoding): 순서 정보가 없는데 순서를 부여해 오해의 소지 있음.
- 카운트 인코딩 (Count Encoding): 각 범주의 등장 빈도를 사용.
- 베이지안 인코딩: 베이지안 추론을 기반으로 타깃 인코딩을 정규화.
참고 자료
- Micci-Barreca, D. (2001). A Preprocessing Scheme for High-Cardinality Categorical Attributes in Classification and Prediction Problems.
- Kaggle 커널: "Target Encoding Best Practices"
- scikit-learn, category_encoders 라이브러리 문서
타깃 인코딩은 고유 범주 수가 많은 범주형 변수를 처리할 때 강력한 도구이지만, 신중한 적용이 필요합니다. 정규화, 교차 검증, 스무딩 등의 기법을 함께 활용하면 안정적이고 성능 좋은 모델을 구축할 수 있습니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.