Skip to content

FE: Target Encoding (or Mean Encoding, Response Encoding)

Categorical Variable을 encoding하는 방법 중의 하나.

  • Kaggle 등에서 많이 쓰이는 편이나
  • overfitting의 위험 때문에
    • Smoothing,
    • Ordered Target Encoding이나
    • permutation등의 기법 등과
  • 같이 사용되지 단독으로는 사용하기 어려움.

one-hot encoding and label encoding과 비교.

One-hot encoding이나 Label encoding의 경우

  • 구분 만을 할 뿐
  • 할당되는 numeric value에 순서 등의 의미를 부여하지 않는 게 일반적

Target Encoding

  • 현재 task를 수행하는데에
  • 보다 효과적인 "의미를 갖는 숫자"을 값으로 할당 한다.

방법

쉽게 애기하면,

  • 현재 task에서 구하고자 하는 Target의 값을 이용하여
  • encoding을 한다.

가장 유명한 Oredered Target Encoding 을 예를 들어 설명하면 다음과 같음.

"education_level" 이 high, medium, low 의 세 분류로 나뉘어지고, 다른 column들과 함께 "income"을 맞추는 regression task를 수행한다고 하자.

  • Label Encoding을 사용하면 "education_level"에 0, 1, 2와 같은 숫자를 각 category를 구분할 수 있도록 다르게만 할당하지만,
  • Target Encoding
  • "education_level"이 high인 sample 들을 뽑고, 이들의 "income"의 평균치를 구한 후 이를 "education_level"의 값으로 할당하는 방식으로 동작함.
  • 이를 medium, low 에도 적용하면
  • "education_level" categorical variable은 3개의 다른 숫자값을 가지면서 task를 잘 예측할 수 있는 정보를 가지게 된다.

장점은 ...

Target encoding을 사용할 경우,

  • one-hot encoding에 비해서 적은 수의 dimension을 가지면서
  • task를 수행하는데 유용한 정보를 가지는 value를 가지는 categorical variable이 된다.

단점은 ...

  • Target의 값을 사용하기 때문에 data leakage가 발생하고 이는 over-fitting으로 이어진다.
  • 더욱이 mean과 같은 대표값으로만 사용(ordered target encoding)하기 때문에 원래 target에 있는 통계적인 분포 정보와 차이가 있으며
  • 이같은 차이는 over-fitting 의 위험도를 높인다.

개선 방안

가장 간단한 방법으로는 Smoothing 기법 이다.

이는

  • 해당 category의 평균을 그대로 사용하는 것이 아닌,
  • 전체 dataset의 global mean과 해당 category의 mean의 weighted sum을 사용한다.
  • 이 때 weight는 hyper-parameter인 smooth factor (보통 \(\alpha\)로 표기)로 결정된다.

수식은 다음과 같음.

\[ \text{code}_c = \frac{n_c\mu_c + \alpha \mu_g }{n_c + \alpha} \]
  • \(\text{code}_c\) : category \(c\)에 할당되는 code. 할당되는 변수값
  • \(n_c\) : category \(c\)에 속한 sample 수
  • \(mu_c\) : category \(c\)에 속한 sample들의 target value의 mean.
  • \(mu_g\) : target의 평균치
  • \(\alpha\) :
    • smoothing 정도를 결정.
    • 클수록 전체 평균이 비슷한 값이 만들어지므로
    • 각 category에 할당된 code의 값이 비슷해진다.

해당 smoothing 외에도,

  • 전체 dataset을 k-fold cross validation처럼 여러 subset으로 나누고
  • 이들 subset에서 Target encoding을 수행하여
  • 하나의 category의 데이터가 k 개의 다른 값을 가지도록 하는 방법(k-fold target encoding)도 있다.

가장 유명한 Target Encoding은 Ordered target encoding 이다.


더 읽어보면 좋은 자료