타겟 인코딩

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.09.01
조회수
4
버전
v1

타겟 인코딩

개요

타겟 인코딩(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. 고차원 범주 처리에 효율적
    원-핫 인코딩은 범주 수가 많을 경우 차원이 급격히 증가하지만, 타겟 인코딩은 각 범주를 하나의 수치로 표현하므로 메모리와 계산 효율성이 높습니다.

  2. 타겟과의 관계 반영
    범주가 타겟에 미치는 영향을 직접 수치로 표현하므로, 모델이 더 강력한 패턴을 학습할 수 있습니다.

  3. 비선형 관계 포착 가능
    범주 간의 순서가 없어도 타겟 값에 따라 자연스럽게 스케일링되므로, 순서형 인코딩보다 유연합니다.


단점 및 주의사항

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 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

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

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