K-Fold 타겟 인코딩
K-Fold 타 인코딩
개요
K-Fold 타겟 인코딩(K-Fold Target Encoding)은 범주형 변수(Categorical Variable)를 수치형 변수로 변환 고급 인코 기법 중 하나로, 특히 과적합(Overfitting) 방지하기 위해계된 방법입니다. 범주형 변수의 카테고리를 해당테고리에하는 타겟 변수의 평균값으로 대체하는 타겟 인딩(Target Encoding은 강력한 성을 보이지만 전체 데이터의 타겟 평균을 사용할 경우 테스트 데이터의 정보가 훈련 과정에 유출되어 데이터 리크(data leakage)가 발생할 수 있습니다. K-Fold 타겟 인코딩은 이 문제를 해결하기 위해 교차 검증(Cross-Validation)의 원리를 활용하여, 각 샘플이 속한 카테고리의 타겟 평균을 계산할 때 자기 자신을 제외한 데이터만 사용함으로써 과적합을 완화합니다.
이 문서에서는 K-Fold 타겟 인코딩의 개념, 작동 원리, 장단점, 구현 방법, 그리고 실무 적용 시 고려할 점을 상세히 설명합니다.
타겟 인코딩의 문제점
타겟 인코딩은 범주형 변수의 각 카테고리에 대해 타겟 변수의 평균(회귀일 경우) 또는 평균 확률(분류일 경우)을 계산하고, 이를 해당 카테고리의 수치형 표현으로 사용하는 기법입니다. 예를 들어, 도시
라는 범주형 변수가 있고, 타겟이 이탈 여부(0/1)라면, 각 도시별 평균 이탈률을 계산하여 그 값을 피처로 사용합니다.
하지만 단순한 타겟 인코딩은 다음과 같은 문제를 야기할 수 있습니다:
- 데이터 리크: 전체 데이터셋의 타겟 평균을 사용하면, 훈련 샘플이 자신의 타겟 값을 알고 인코딩되는 셈이 되어 과적합이 발생합니다.
- 희소 카테고리(Sparse Categories): 빈도가 매우 낮은 카테고리의 경우, 소수의 샘플에 의해 인코딩 값이 크게 왜곡될 수 있습니다.
이러한 문제를 해결하기 위해 K-Fold 타겟 인코딩이 제안되었습니다.
K-Fold 타겟 인코딩의 원리
K-Fold 타겟 인코딩은 전체 데이터셋을 K개의 폴드(fold)로 나누고, 각 폴드 내의 샘플을 인코딩할 때 다른 K-1개의 폴드만 사용하여 타겟 평균을 계산합니다. 이를 통해 각 샘플은 자신의 타겟 값을 포함하지 않은 데이터를 기반으로 인코딩되므로, 정보 유출을 방지할 수 있습니다.
작동 과정
- 데이터셋을 K개의 폴드로 분할 (예: K=5).
- 각 폴드 i에 대해:
- 폴드 i를 검증 세트로 사용.
- 나머지 K-1개의 폴드를 훈련 세트로 사용.
- 훈련 세트에서 각 범주별 타겟 평균을 계산.
- 검증 세트의 각 샘플에 대해, 해당 범주에 대한 훈련 세트의 타겟 평균을 인코딩 값으로 할당.
- 모든 폴드에 대해 반복하여 전체 데이터셋에 대한 인코딩 완료.
이 방식은 Out-of-Fold(OOF) 예측과 유사한 개념으로, 모델 평가에서 일반화 성능을 신뢰성 있게 추정하는 데 도움을 줍니다.
장점과 단점
장점
항목 | 설명 |
---|---|
과적합 감소 | 자기 자신을 제외한 데이터를 기반으로 인코딩하므로 데이터 리크 방지 |
일반화 성능 향상 | OOF 방식으로 인해 테스트 데이터에 더 잘 일반화됨 |
높은 예측 성능 | 특히 고유 카테고리가 많은 데이터에서 효과적 |
단점
항목 | 설명 |
---|---|
계산 비용 증가 | K번의 폴드별 계산이 필요하여 단순 인코딩보다 느림 |
구현 복잡성 | 직접 구현 시 주의가 필요하며, 오타나 논리 오류 발생 가능 |
희소 카테고리 여전히 문제 | 매우 적은 샘플을 가진 카테고리는 여전히 불안정할 수 있음 |
구현 예시 (Python)
다음은 [scikit-learn](/doc/%EA%B8%B0%EC%88%A0/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D/%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%20%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC/scikit-learn)
과 [pandas](/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/pandas)
를 활용한 K-Fold 타겟 인코딩의 간단한 구현 예시입니다.
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, k=5):
"""
K-Fold Target Encoding을 수행하는 함수
"""
train_encoded train_df[cat_col].copy()
test_encoded = test_df[cat_col].copy()
kf = KFold(n_splits=k, shuffle=True, random_state=42)
train_encoded_col = np.zeros(len(train_df))
for train_idx, val_idx in kf.split(train_df):
# 훈련 폴드에서 범주별 타겟 평균 계산
mapping = train_df.iloc[train_idx].groupby(cat_col)[target_col].mean()
# 검증 폴드에 매핑 적용
train_encoded_col[val_idx] = train_df.iloc[val_idx][cat_col].map(mapping)
# 테스트 데이터 인코딩: 전체 훈련 데이터 기반 평균 사용 (자기 정보 없음)
global_mean = train_df[target_col].mean()
mapping = train_df.groupby(cat_col)[target_col].mean()
test_encoded_col = test_df[cat_col].map(mapping).fillna(global_mean)
return train_encoded_col, test_encoded_col
🔍 참고: 테스트 데이터는 전체 훈련 데이터를 기반으로 인코딩되며, 이는 훈련 과정에서의 정보 유출을 방지합니다.
관련 기법 및 확장
K-Fold 타겟 인코딩 외에도 다음과 같은 관련 기법이 존재합니다:
- Leave-One-Out Encoding: 각 샘플을 제외한 나머지 데이터로 인코딩 (희소 데이터에 민감).
- Smoothing: 폴드 평균과 전체 평균을 가중 평균하여 안정성 향상.
- Bayesian Target Encoding: 사전 분포를 도입하여 베이지안 추정 방식으로 인코딩.
특히, 스무딩(Smoothing)은 다음과 같은 수식으로 적용할 수 있습니다:
[ \text{encoded_value} = \frac{\text{count} \times \text{category_mean} + \text{weight} \times \text{global_mean}}{\text{count} + \text{weight}} ]
여기서 weight
는 정규화 하이퍼파라미터로, 카테고리의 샘플 수가 적을수록 전체 평균에 더 가깝게 만듭니다.
참고 자료 및 관련 문서
- Scikit-learn Documentation - Preprocessing
- Target Encoding Done the Right Way (Blog)
- A Comparative Study of Target Encoding Techniques, Kaggle
K-Fold 타겟 인코딩은 범주형 변수를 효과적으로 수치화하면서도 과적합을 제어할 수 있는 강력한 기법으로, 특히 머신러닝 경진대회 및 실제 데이터 과학 프로젝트에서 널리 사용됩니다. 적절한 전처리와 함께 사용하면 모델 성능을 크게 향상시킬 수 있습니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.