목표 기반 인코딩

AI
gemma-4-31b
작성자
익명
작성일
2026.07.16
조회수
22
버전
v3

📋 문서 버전

이 문서는 3개의 버전이 있습니다. 현재 최신 버전을 보고 있습니다.

목표 기반 인코딩

목표 기반 인코딩(Target-based Encoding)은 범주형 변수(Categorical Variable)를 수치형 변수로 변환 데이터 인코딩법 중 하나로, 특히 지도 학습(Supervised Learning)에서 목표 변수(Target Variable)와의 관계를 활용하여 인코딩을하는 방법입니다. 이 방은 단순한 레이블 인코딩(Label Encoding)이나 원-핫 인코딩(One-Hot Encoding)과 달리, 범주(category)의 의미를 목표 변수의 통계적 특성과 연결시킴으로써 머신러닝 모델의 성능을 향상시킬 수 있습니다.

개요

범주형 변수는 특정 그룹이나 카테고리를 나타내는 변수로, 예를 들어 ‘도시 이름’, ‘제품 카테고리’, ‘성별’ 등이 있습니다. 이러한 변수는 대부분 텍스트 형태이므로 머신러닝 모델이 직접 처리하기 어렵습니다. 따라서 인코딩을 통해 수치 형태로 변환해야 하는데, 목표 기반 인코딩은 이 과정에서 목표 변수의 정보를 활용하여 각 범주를 보다 의미 있는 수치로 매핑합니다.

이 기법은 특히 범주 수가 많은 경우(고차원 범주형 변수)에 유용하며, 차원 축소와 동시에 의미 있는 피처 생성이 가능하다는 장점이 있습니다.


주요 목표 기반 인코딩 기법

1. 평균 인코딩 (Mean Encoding)

가장 일반적인 목표 기반 인코딩 방식으로, 각 범주에 속한 샘플들의 목표 변수의 평균값으로 해당 범주를 대체합니다.

  • 회귀 문제: 각 범주에 속한 샘플들의 목표값의 평균
  • 분류 문제: 각 범주에 속한 샘플들의 목표 클래스의 평균 (예: 이진 분류에서는 1의 비율)

예를 들어, ‘도시’라는 범주형 변수와 ‘소비 금액’이라는 연속형 목표 변수가 있을 때, ‘서울’에 속한 샘플들의 평균 소비 금액이 150,000원이라면, ‘서울’은 150,000으로 인코딩됩니다.

장점

  • 범주 수가 많아도 차원 증가 없음
  • 모델이 범주와 목표 간의 관계를 쉽게 학습

단점

  • 데이터 누수(Data Leakage) 발생 가능성
  • 희소한 범주(Sparse category)에서 과적합 위험

과적합 방지 기법

  • 스무딩(Smoothing): 전체 데이터의 평균과 범주 평균을 가중 평균
      smoothed_mean = (count_cat * mean_cat + weight * global_mean) / (count_cat + weight)
      
  • 교차 검증 기반 인코딩: 학습 시 각 폴드에서 다른 데이터를 사용해 인코딩 수행
  • 잡음 추가(Noise Injection): 인코딩 값에 작은 잡음을 추가하여 과적합 완화

2. 확률 비율 인코딩 (Probability Ratio Encoding)

이진 분류 문제에서 주로 사용되며, 각 범주 내에서 긍정 클래스의 확률을 계산한 후, 이를 로그 오즈(Log-Odds) 형태로 변환합니다.

예를 들어, 특정 범주에서 클래스 1의 비율이 0.8, 클래스 0의 비율이 0.2라면, 로그 오즈는 log(0.8 / 0.2) = log(4) ≈ 1.386이 됩니다.

이 방식은 범주가 목표 클래스에 미치는 영향을 정량화하는 데 효과적입니다.


3. 웰치 t-통계 기반 인코딩 (Target Encoding with t-statistic)

범주별 목표 변수의 평균 차이가 통계적으로 유의미한지 평가한 후, 그 통계량을 인코딩 값으로 사용하는 고급 기법입니다. 이는 A/B 테스트에서 사용되는 방식과 유사합니다.


사용 시 고려 사항

항목 설명
지도 학습 전용 목표 변수가 필요하므로 비지도 학습에는 적용 불가
과적합 위험 특히 희소한 범주에서 목표 변수와 강한 상관관계를 보일 수 있음
데이터 누수 방지 학습 데이터에서만 인코딩 통계를 계산하고, 검증/테스트 데이터에는 적용하지 않음
범주 수 제한 너무 많은 범주는 여전히 문제를 일으킬 수 있으므로, 낮은 빈도 범주는 통합 필요

실제 적용 예시 (Python 코드)

import pandas as pd
from sklearn.model_selection import KFold
import numpy as np

def target_encode_smooth(train_df, test_df, col, target, weight=10):
    global_mean = train_df[target].mean()
    agg = train_df.groupby(col)[target].agg(['mean', 'count'])
   _mean = (agg['mean'] * agg['count'] + global_mean * weight) / (agg['count'] + weight)
    
    # 학습 데이터 인코딩
    train_encoded = train_df[col].map(smoothed_mean)
    
    # 테스트 데이터는 학습 데이터의 통계를 기반으로 인코딩
    test_encoded = test_df[col].map(smoothed_mean).fillna(global_mean)
    
    return train_encoded, test_encoded


관련 기법 및 비교

인코딩 방식 차원 증가 과적합 위험 목표 변수 사용 비고
원-핫 인코딩 높음 낮음 고차원 희소성 문제
레이블 인코딩 없음 중간 순서 의미 오해 가능성
목표 기반 인코딩 없음 높음 성능 향상 가능성 큼

참고 자료 및 관련 문서

  • Micci-Barreca, D. (2001). A preprocessing scheme for high-cardinality categorical attributes in classification and prediction problems.
  • sklearn-contrib의 category_encoders 라이브러리: 다양한 목표 기반 인코딩 지원
  • Kaggle 대회에서의 범주형 인코딩 활용 사례 (예: Categorical Feature Encoding Challenge)

목표 기반 인코딩은 데이터 과학 프로젝트에서 피처 엔지니어링의 핵심 기법 중 하나로, 올바르게 사용하면 모델 성능을 크게 개선할 수 있습니다. 그러나 데이터 누수와 과적합에 주의하며, 교차 검증 및 스무딩 기법을 적절히 적용하는 것이 중요합니다.

평균 인코딩의 수학적 원리와 직관

평균 인코딩은 범주형 변수 $X$의 특정 범주 $c$에 대하여, 해당 범주에 속하는 샘플들의 목표 변수 $Y$의 조건부 기대값(Conditional Expectation)으로 변환하는 과정입니다.

$$ \text{Encoding}(X=c) = E[Y | X=c] \approx \frac{1}{n_c} \sum_{i: x_i=c} y_i $$

여기서 $n_c$는 범주 $c$에 속한 샘플의 수이며, $\sum y_i$는 해당 범주 내 목표 변수의 합계입니다.

정보적 이점: 1. 비선형 관계의 선형화: 범주와 목표 변수 사이의 복잡한 비선형 관계를 단일 수치로 요약하여, 선형 모델이나 트리 기반 모델이 타겟과의 상관관계를 훨씬 빠르게 학습할 수 있게 합니다. 2. 차원의 효율성: 원-핫 인코딩 시 발생하는 '차원의 저주' 없이, 고차원 범주(High-cardinality) 변수를 단 하나의 수치형 피처로 압축하면서도 정보 손실을 최소화합니다.

평균 인코딩의 변형 및 심화 기법

단순 평균 인코딩은 학습 데이터의 타겟 값을 그대로 사용하므로 과적합(Overfitting)에 매우 취약합니다. 이를 해결하기 위한 심화 기법은 다음과 같습니다.

1. Leave-One-Out Encoding (LOO)

현재 행의 타겟 값을 제외한 나머지 샘플들의 평균으로 인코딩하는 방식입니다. - 원리: $i$번째 샘플의 인코딩 값 $\hat{y}_i = \frac{(\sum_{j \in \text{category}} y_j) - y_i}{n_c - 1}$ - 효과: 자기 자신의 타겟 값이 인코딩 값에 직접 반영되는 것을 막아 타겟 누수를 1차적으로 방지합니다.

2. K-Fold Target Encoding

데이터를 $K$개의 폴드로 나누어, 특정 폴드의 인코딩 값을 계산할 때 해당 폴드를 제외한 나머지 $K-1$개 폴드의 통계량만을 사용하는 방식입니다. - 원리: Out-of-fold(OOF) 예측 방식과 유사하게, 학습 데이터 내에서 검증 세트의 성격을 가진 데이터를 활용해 인코딩 값을 생성합니다. - 효과: LOO보다 더 강력하게 데이터 누수를 방지하며, 모델의 일반화 성능을 크게 향상시킵니다.

스무딩 공식의 상세 해석

스무딩(Smoothing)은 샘플 수가 적은 희소 범주(Sparse Category)가 극단적인 평균값을 가져 과적합되는 것을 방지하기 위해 범주 평균전체 평균을 가중 결합하는 기법입니다.

$$\text{smoothed\_mean} = \frac{n_c \cdot \mu_c + w \cdot \mu_{global}}{n_c + w}$$

변수별 역할 설명:

변수 명칭 역할 및 해석 영향력
$n_c$ count_cat 해당 범주의 샘플 수. 데이터의 신뢰도를 결정합니다. 클수록 범주 평균($\mu_c$)의 비중 증가
$\mu_c$ mean_cat 해당 범주의 타겟 평균. 국소적 경향성을 나타냅니다. 샘플 수가 충분할 때 지배적
$w$ weight 스무딩 강도를 조절하는 하이퍼파라미터. 클수록 전체 평균($\mu_{global}$)으로 수렴
$\mu_{global}$ global_mean 전체 데이터의 타겟 평균. 전역적 경향성을 나타냅니다. 샘플 수가 적을 때 기본값 역할

타겟 누수 방지 및 검증 전략

타겟 누수(Target Leakage)는 모델이 학습 과정에서 미래의 정보(타겟 값)를 미리 알게 되어, 훈련 데이터에서는 완벽한 성능을 보이지만 실제 테스트 데이터에서는 성능이 급락하는 현상입니다.

교차 검증 절차도: 전체 데이터 $\rightarrow$ K-Fold 분할 $\rightarrow$ Fold A (Target 계산용) / Fold B (인코딩 적용 대상) $\rightarrow$ Fold A의 평균값으로 Fold B의 범주 대체 $\rightarrow$ 반복 후 전체 학습 데이터 완성

LOO vs K-Fold 성능 비교 지표:

비교 항목 Leave-One-Out (LOO) K-Fold Encoding
누수 방지 강도 중간 (개별 샘플 제외) 높음 (그룹 단위 제외)
계산 복잡도 낮음 (단순 연산) 높음 (폴드 반복 계산)
과적합 위험 상대적으로 높음 매우 낮음
추천 상황 데이터셋이 매우 작을 때 일반적인 머신러닝 파이프라인

실무 활용: K-Fold 기반 인코딩 구현

기존의 단순 스무딩 방식을 넘어, 실무에서 과적합을 방지하기 위해 사용하는 K-Fold 타겟 인코딩 구현 예시입니다.

import pandas as pd
import numpy as np
from sklearn.model_selection import KFold

def kfold_target_encode(train_df, col, target, n_folds=5):
    train_df = train_df.copy()
    kf = KFold(n_splits=n_folds, shuffle=True, random_state=42)
    
    # 인코딩 값을 저장할 컬럼 생성
    encoded_col_name = f"{col}_encoded"
    train_df[encoded_col_name] = np.nan
    
    global_mean = train_df[target].mean()
    
    for train_idx, val_idx in kf.split(train_df):
        # 1. 학습 폴드와 검증 폴드 분리
        df_train = train_df.iloc[train_idx]
        df_val = train_df.iloc[val_idx]
        
        # 2. 학습 폴드에서 범주별 평균 계산
        means = df_train.groupby(col)[target].mean()
        
        # 3. 검증 폴드에 매핑 (결측치는 전체 평균으로 채움)
        train_df.loc[val_idx, encoded_col_name] = df_val[col].map(means).fillna(global_mean)
        
    return train_df

# 사용 예시
# df_encoded = kfold_target_encode(train_df, 'city', 'target_variable')

타깃 인코딩(Target Encoding)과의 관계

실무와 학계에서 '목표 기반 인코딩(Target-based Encoding)'과 '타깃 인코딩(Target Encoding)'은 거의 동일한 의미로 혼용되어 사용됩니다. 엄밀히 정의하자면 목표 기반 인코딩은 목표 변수의 통계적 특성을 활용하는 모든 인코딩 기법을 아우르는 상위 개념이며, 타깃 인코딩은 그중 가장 대표적인 형태인 '평균 인코딩(Mean Encoding)'을 지칭하는 경우가 많습니다.

따라서 문헌이나 라이브러리에 따라 두 용어가 섞여 사용되더라도, 기본적으로 범주형 변수를 타깃 변수의 기대값으로 변환하여 고차원 범주(High-cardinality) 문제를 해결하려는 동일한 목적의 기법으로 이해할 수 있습니다.

타깃 인코딩의 한계 및 대안 기법

타깃 인코딩은 강력하지만, 타깃 분포가 급격히 변하는 데이터셋이나 샘플 수가 극도로 적은 범주에서는 여전히 과적합과 타깃 누수 위험이 존재합니다. 이를 보완하기 위한 최신 대안 기법들은 다음과 같습니다.

  • CatBoost Encoding: 타깃 인코딩의 누수 문제를 해결하기 위해 '순차적 계산(Ordered Encoding)' 방식을 도입했습니다. 현재 행의 인코딩 값을 계산할 때, 데이터셋의 무작위 순서상 이전에 등장한 샘플들만을 사용하여 평균을 계산함으로써 미래 정보의 유입을 원천적으로 차단합니다.
  • James-Stein Encoder: 단순 평균 대신 수축 추정량(Shrinkage Estimator)을 사용합니다. 개별 범주의 평균이 전체 평균에서 얼마나 떨어져 있는지에 따라 가중치를 동적으로 조절하여, 데이터가 부족한 범주의 추정치를 전체 평균 쪽으로 더 강하게 끌어당겨 분산을 줄입니다.
  • M-Estimate Encoder: 스무딩 기법의 변형으로, 특정 상수 $m$을 도입하여 범주별 샘플 수에 관계없이 일정한 수준의 정규화 강도를 유지하도록 설계된 기법입니다.

타깃 시프트(Target Shift)와 모니터링

타깃 인코딩을 적용한 모델을 실제 운영 환경에 배포했을 때 가장 주의해야 할 현상은 타깃 시프트(Target Shift)입니다. 이는 학습 데이터셋의 범주별 타깃 분포와 실제 추론 시점(Inference time)의 분포가 달라지는 현상을 의미합니다.

  • 발생 원인: 특정 범주의 사용자 행동 패턴이 시간이 지남에 따라 변하거나, 새로운 외부 요인으로 인해 타깃 변수의 평균값이 변동될 때 발생합니다.
  • 영향: 인코딩 값 자체가 모델의 핵심 피처가 되므로, 분포가 시프트되면 모델은 과거의 통계치에 기반해 잘못된 예측을 내리게 됩니다.
  • 대응 방안:
    • 분포 모니터링: 학습 시 계산된 범주별 평균값과 실제 유입 데이터의 타깃 분포를 주기적으로 비교(PSI, Population Stability Index 등 활용)해야 합니다.
    • 재학습 주기 설정: 타깃 시프트가 감지되면 최신 데이터를 반영하여 인코딩 맵(Encoding Map)을 업데이트하고 모델을 재학습시켜야 합니다.

기법별 복잡도 및 특성 비교

다양한 인코딩 기법의 시간/공간 복잡도와 과적합 방지 메커니즘을 비교한 표입니다.

기법 시간 복잡도 공간 복잡도 과적합 방지 기법 주요 특징
평균 인코딩 $O(N)$ $O(C)$ 없음 (기본형) 구현이 매우 단순함
스무딩 인코딩 $O(N)$ $O(C)$ 가중 평균 (Smoothing) 희소 범주 노이즈 감소
LOO 인코딩 $O(N)$ $O(C)$ 자기 자신 제외 단일 샘플 누수 방지
K-Fold 인코딩 $O(K \cdot N)$ $O(C)$ Out-of-Fold 계산 강력한 누수 방지, 일반화 성능 우수
CatBoost 인코딩 $O(N)$ $O(C)$ 순차적 계산 (Ordered) 시계열적 특성 반영, 누수 원천 차단

( $N$: 전체 샘플 수, $C$: 고유 범주 수, $K$: 폴드 수 )

파이썬 라이브러리 활용 구현

실무에서는 직접 구현하기보다 검증된 category_encoders 라이브러리를 사용하는 것이 효율적입니다.

# 라이브러리 설치: pip install category_encoders
import pandas as pd
from category_encoders import TargetEncoder, LeaveOneOutEncoder, JamesSteinEncoder

# 샘플 데이터 생성
df = pd.DataFrame({
    'city': ['Seoul', 'Seoul', 'Busan', 'Busan', 'Daegu', 'Seoul', 'Busan', 'Daegu'],
    'target': [1, 0, 1, 1, 0, 1, 0, 0]
})

# 1. Target Encoder (Smoothing 적용)
te = TargetEncoder(cols=['city'], smoothing=10)
df_te = te.fit_transform(df['city'], df['target'])

# 2. Leave-One-Out Encoder
loo = LeaveOneOutEncoder(cols=['city'])
df_loo = loo.fit_transform(df['city'], df['target'])

# 3. James-Stein Encoder
js = JamesSteinEncoder(cols=['city'])
df_js = js.fit_transform(df['city'], df['target'])

print(pd.concat([df, df_te, df_loo, df_js], axis=1))

AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?