Library for Categorical Features Encoding
[3]의 파이썬 패키지에 다양한 categorical encoding이 구현되어있다.
import category_encoders as ce
encoder = ce.BackwardDifferenceEncoder(cols=[...])
encoder = ce.BaseNEncoder(cols=[...])
encoder = ce.BinaryEncoder(cols=[...])
encoder = ce.CatBoostEncoder(cols=[...])
encoder = ce.CountEncoder(cols=[...])
encoder = ce.GLMMEncoder(cols=[...])
encoder = ce.GrayEncoder(cols=[...])
encoder = ce.HashingEncoder(cols=[...])
encoder = ce.HelmertEncoder(cols=[...])
encoder = ce.JamesSteinEncoder(cols=[...])
encoder = ce.LeaveOneOutEncoder(cols=[...])
encoder = ce.MEstimateEncoder(cols=[...])
encoder = ce.OneHotEncoder(cols=[...])
encoder = ce.OrdinalEncoder(cols=[...])
encoder = ce.PolynomialEncoder(cols=[...])
encoder = ce.QuantileEncoder(cols=[...])
encoder = ce.RankHotEncoder(cols=[...])
encoder = ce.SumEncoder(cols=[...])
encoder = ce.TargetEncoder(cols=[...])
encoder = ce.WOEEncoder(cols=[...])
encoder.fit(X, y)
X_cleaned = encoder.transform(X_dirty)
모든 데이터셋에 최고 성능을 내는 encoder는 없다.
여기서는 간단히 원리(혹은 가정), 장점과 단점을 정리한다.
encoder순서는 알파벳 순서로 정리한다.
1. Backward Difference
회귀분석에서 범주형 변수를 인코딩하는데 사용되는 방법이다.
주로 ordinal feature에 사용된다. (order, ranking 등)
$N$개의 categorical variable이 있다면, $N-1$개로 인코딩된다.
장점
- 순서의 의미를 유지하면서 해석할 수 있다
- (선형회귀에서) ordinal variable의 각 level에 따라 $y$의 증분 변화를 포착할 수 있다.
단점
- nominal에는 적용X
- 각 계수의 의미는 직접적 효과가 아니라 범주간의 차이를 나타낸다.
개인적 의견) 태생이 regression이어서 classification에는 못쓸것같다.
2. BaseN
$M$개의 카테고리가 있다면, $0$부터 $M-1$의 정수로 카테고리를 매핑한다.
매핑된 정수를 $N$진수로 나타낸다.
예를 들어, $5$로 매핑된 범주를 base=2로 인코딩하면 $101$로 인코딩된다.
base가=2이면 Binary encoding이고, base=10이면 ordinal encoding과 비슷하다.
장점
- (유연성) base를 조정하여 새로운 feature를 얼마든지 생성할 수 있다.
- (효율성) cardinality가 높으면 one-hot 방법보다 더 간결한 표현을 갖는다.
단점
- base가 커지면서 정보가 손실되거나 해석이 어려워진다.
- base를 선택하는 것도 문제가 된다. 물론 대부분의 경우 base=2도 충분하지만 다른 base가 효과적일 수도 있다.
3. Binary
2의 BaseN encoder에서 base=2인 특별한 경우이다.
4. CatBoost Encoder
CatBoost에서 제안된 새로운 target encoding 방법이다.
target statistics은 categorical feature를 새로운 numerical feature로 매핑하는 방법이다.
주로 $y$의 통계량을 이용하기 때문에 target statistics(TS)라 부른다.
그런데 TS는 gradient boosting의 이전 단계에 의존한다. (rely only on the observed history)
CatBoost에서는 각 boostring의 step마다 서로 다른 random permutation을 이용한다.
자세한 내용은 [2]의 섹션 3.2 Target statistics의 Ordered TS를 참고
CatBoost 패키지이에서 CatBoostClassifier(cat_features=my_cat_features)를 이용한다면 필요없다.
모델 안에서 알아서 encoding한다.
장점
- (prevents overfitting) 대부분의 target encoding에서는 오버피팅의 위험이 있는데, catboost는 permutation을 이용하기 때문에 오버피팅의 위험을 낮출 수 있다.
- (effective) cardinality가 매우 높은 경우에도 잘 동작한다.
- (no target leakage) cumulative mean을 사용하기 때문에 target leakage를 방지할 수 있다.
단점
- (computation) permutation과 cumulative sum 때문에 다른 인코딩 방법들에 비해 계산량이 많다.
- unsupervised learning에는 X
5. Count
데이터셋에서 존재하는 각 범주의 등장 횟수로 인코딩한다.
예를 들어, Color 범주에 [R, B, B, G, R, R]가 있다면 R=3, B=2, G=1로 매핑이 되고 Color_freq = [3, 2, 2, 1, 3, 3]으로 인코딩된다.
장점
- (simple) 굉장히 직관적이며 구현, 해석이 쉽다. 계산 역시 매우 간단하다.
- (effective) counting만 하기 때문에 cardinality가 높은 경우에도 적용 가능하다
- (information) frequency information을 반영할 수 있다.
단점
- (loss of info.) freq. info는 반영하지만, 그 외의 다른 정보는 손실될 수 있다.
- (new category) 새로운 카테고리 값이 있는 경우에는 적용할 수 없다.
- (collinearity) frequency는 횟수와 연관되어 있는 다른 변수가 존재할 가능성이 높다
6. GLMM Encoder (Generalized Linear Mixed Model Encoder)
GLM 모델에서 범주형 변수를 처리하는 방법이다. 고정효과(fixed effect)와 무작위효과(random effect)를 무시할 수 있다.
범주형 변수과 $y$의 관계가 복잡할 때 유용하다.
TargetEncoder와 MEstimateEncoder와 비슷하지만, 통계적 이론(기반)이 튼튼하다는 것과 hyper-parameter가 없다는 것이 장점이다.
장점
- (capture relationship) 범주와 $y$의 복잡한 관계도 포착할 수 있다. (계층 등)
- (flexibility) binary, count continuous 등의 다양한 type 적용 가능
단점
- (computation)
- (model selection)
- (expert)
7. Gray (Gray code encoding)
https://en.wikipedia.org/wiki/Gray_code
범주형 데이터에 순서가 있으며 범주간의 작은 변화가 의미있는 데이터셋에서 유용하다.
장점
- (Hamming distance) 인접한 범주끼리의 해밍거리는 1이다. ML 모델에 적합하다.
- (해석의 어려움과 별개로) 잘못된 해석을 할 가능성은 매우 적다.
단점
- (complexity in interpretation) 인코딩된 값이 매우 비직관적이어서 해석이 어렵다.
- (specific use cases) ordered data에는 유용하지만 nominal에는 유용하지 않다.
8. Hashing
범주형 데이터를 해싱을 이용하여 인코딩하는 방법이다.
document와 같이 very-high cardinality data에 적합하다.
장점
- (efficiency) cardinality가 매우 큰 경우에도 범주를 정수로 빠르게 매핑할 수 있다.
- (scalable) 인코딩 과정이 쉽게 병렬화 가능하며, large-scale, distributed data에도 적용가능하다.
단점
- (info. loss) 해싱 자체가 collision이 생길 수 있고 이 경우에 정보 손실이 발생할 수 있다. 매핑할 숫자를 크게하면 이 부작용을 줄일 수 있다.
- (interpretability) 해싱된 값은 해석이 불가능하다. 이는 모델 해석에도 영향을 준다.
- (irreverible) 해시함수 특성상 역연산이 불가능하다. 즉 해싱된 값이 원래 어떤 범주였는지 재구성할 수 없다.
9. Helmert
회귀분석 및 통계 모델링에서 범주형 데이터를 수치로 매핑하는 통계 기법이다.
특히 정렬되지 않은 nominal feature에 유용하다.
contrast coding system이므로 기준선(baseline)과 비교하여 범주 변수의 level을 나타낸다.
장점
- (meaningful) 범주형 변수의 level을 후속 수준(subsequent level)과 비교할 수 있다. 어떤 맥락에서는 유용한 insight를 얻을 수 있다.
- (regression) collinearity를 방지할 수 있다.
단점
- (interpretation complexity) 계수를 해석하는 방법은 비직관적이다.
- (specifyc usecase) nominal data에 적합하다.
10. James-Stein
James-Stein estimator를 이용한 방법이다.
범주 특성이 level이 많고 일부 label이 적은 경우에 유용하다.
sample 수가 적은 경우에 일반적으로 사용된다.
[3]에 의하면 $i$의 James-Stein estimater는 다음과 같다.
\[ JS_i = (1-B) \mu_{y_i} + B \mu_{y}, \quad B = \cfrac{Var(y_i)}{Var(y_i) + Var(y)} \]
장점
- (robust to overfitting)
- 예측 모델의 성능 향상을 기대할 수 있다.
단점
- target distribution에 의존한다.
- 인코딩 변수 및 모델 해석이 복잡하다.
11. Leave-one-out (Leave One Out, LOO)
kaggle과 같은 competition에 정말 많이 사용된다.
특별한 통계적 이론은 없지만, 범주형 값이 $y$와 어떠한 상관성이 있을 것이라 가정한다.
target encoding의 한 부류이다.
해당 범주가 나타나는 다른 모든 인스턴스(혹은 샘플)에 대한 $y$의 평균으로 인코딩한다.
이때 해당 row의 $y$는 제외하고 평균값을 계산한다.
testset에서 새로운 category가 input으로 들어오면, $y$의 global mean으로 대체한다.
장점
- 자기 자신의 값을 제외한 평균값을 이용하므로 overfitting을 조금 줄일 수 있다,
- (target leakage prevention) 자기 자신의 값을 제외한 평균값을 이용
- 범주형 값이 많은 경우에 유용하다. (high cardinality)
단점
- (high variance) encoded value의 분산은 상당히 크다. 특히 관측 데이터가 적은 경우.
- small sample size에는 적합하지 않다.
12. M-Estimate
target encoder의 simple version이다.
tunable parameter로 $m$ 한개 있고 regularization의 역할을 한다. (target encoder는 2개이다)
$c$는 categorical feature 중 하나의 값이고, $n_c$는 $c$에 해당하는 샘플의 개수, $n$는 전체 샘플의 개수, $p_c$는 $c$의 사전확률(prior)일 때 $c$의 posterior는 다음과 같이 정의한다.
\[ p_c^* = \cfrac{n_c + p_cm}{n+m} \]
일부 카테고리 값이 적은 경우에 유용하다. $m$이 없다면 특정 $c$가 존재하지 않을 수 있는데 이 경우 $p_c=0$으로 잘못해석할 수 있다.
장점
- $m$의 도입으로 overfitting을 방지한다
- category와 global의 balance
단점
- $m$의 값을 고르는 것은 domain 의존적이다. 혹은 cross-validation으로 검증한다.
- 모델 해석시, 비교적 덜 직관적이다.
13. One-Hot Encoder (OHE)
범주형 변수를 숫자로 매핑하는 가장 많이 사용되는 인코딩 방법이다.
순서가 없는 nominal feature에 유용하다.
$N$개의 범주가 있다면 $N$개의 컬럼을 만들고, 해당하는 범주의 컬럼에만 $1$을, 아닌 컬럼에는 $0$으로 채운다.
Color에 R, G, B 이렇게 3개의 범주가 있다고 하자. 그러면 Color_R, Color_G, Color_B 이렇게 3개의 컬럼을 생성한다.
B에 해당하는 범주는 Color_R=0, Color_G=0, Color_B=1 이렇게 매핑한다.
일반적으로 unknown category는 모두 $0$인 벡터 $[0, \dots, 0]$ 으로 매핑한다.
regression, classification, clustering 등 많은 task에 적용가능하다.
그러나 데이터 차원이 증가하므로 인코딩 전에 범주의 개수를 파악한다.
장점
- 간단하고 범주 해석이 쉽다
- prevent false numerical relationship
단점
- 데이터의 차원이 증가한다.
- 데이터 행렬이 sparse해진다. 이 경우 memory, computation 모두 악영향을 준다
- No relationship: 범주끼리 어떠한 해석이 불가능하다
14. Ordinal Encoder
순서가 있는 ordinal feature에 적합하다.
일반적으로 $0$부터 $N-1$까지 오름차순으로 매핑한다.
15. Polynomial
회귀분석, 그리고 ordinal feature에 대하여 유용하다.
$1$부터 $N$으로 매핑한 후에, $d$차원으로 매핑한다.
balanced encoding으로 의도된 디자인이다.
각 feature끼리 independent(or orthogonal)해야한다.
16. Quantile
M-estimate encoder의 변형으로, mean 대신에 quantile을 이용한다.
일반적으로 median인 quantile=0.5를 사용한다.
\[ x_c^* = \cfrac{q(x_c)n_c + q(x)m}{n_c + m} \]
장점
- target과의 relationship을 포착할 수 있다.
- (reduces overfitting) mean을 이용한 것보다 quantile을 이용한 것이 일반적으로 overfitting을 피한다
- (adapable) 문제에 따라 quantile=0.5말고도 다양한 quantile을 이용할 수 있다.
단점
- target distribution에 의존적이고 민감하다. (depency on and sensitive to target distribution)
- complex interpretation
17. Rank Hot (Thermometer Encoding)
one-hot encoding의 변형으로, ordinal feature에 유용하다.
one-hot에서는 해당하는 $i$번째 컬럼만 $1$이지만, rank-hot encoding에서는 $i$번째까지 $1$로 매핑한다.
Size라는 category에 {Small, Medium, Large}가 있다고 하자. 그러면
Small = $[1, 0, 0]$, Medium = $[1, 1, 0]$, Large=$[1, 1, 1]$이 된다.
장점
- relative order를 포착할 수 있다
- richer representation
단점
- predictive task에 항상 적합한 것은 아니다.
- one-hat의 변형이므로 complexity가 증가한다.
18. Sum Encoder
baseline category는 $[-1, \dots, -1]$이고 나머지 category는 $[0, \dots, i, \dots, 0]$으로 인코딩한다.
이때 $N$개의 범주에 대하여 인코딩 벡터의 길이는 $N-1$이다.
예를 들어 A, B, C 이렇게 3개의 범주가 있다고 하자. A가 baseline이라 하자.
그러면 A=[-1, -1], B=[1, 0], C=[0, 1]이 된다.
장점
- baseline과 비교할 수 있는 의미있는 값을 얻을 수 있다
단점
- interpretation complexity
19. Target Encoding
target이 category: ($c$의 posterior prob)과 (global prior prob.)의 blending
target이 continuous: ($c$의 평균값)과 (global 평균값)의 blending
target이 $N$개의 category일 경우, $N-1$개의 (m-estimator 등으로 계산한) 확률벡터로 생성해야한다.
([4]의 3.3 Extension to Multi-Valued Categorical Targets을 참고)
예를 들어, (m-estimator 등으로 계산한) 3개의 클래스 확률이 $[0.2, 0.3, 0.5]$라면 이를 feature로 활용하는 것이다.
optional로 임의의 딱 하나의 클래스의 확률을 drop할 수 있다.(중복되므로)
category의 개수에 영향을 받지 않지만, class의 개수만큼의 차원이 증가한다.
ZIP code를 one-hot encoding하는 것보다는 예측하고자 하는 클래스 차원만큼 늘어나는 것이 낫다는 입장이다.
일반적으로 classification에서 강력하게 동작한다고 알려져있다.
장점
- effective with high cardinality
- target information을 통합하여 예측 성능을 향상시킬 수 있다
단점
- overfitting
- target information leakage
20. Weight of Evidence (WOE, WoE)
binary classification에 사용가능한 방법이다.
positive outcome과 negative outcome의 비율에 로그를 씌운 값의미한다.
\[ \text{WoE} = \ln \left( \cfrac{\text{Dist. of Good}}{\text{Dist. of Bad}} \right) \]
categorical encoding에서 Bad는 $y=0$, Good은 $y=1$을 의미한다.
장점
- predictive power를 반영한다.
- Monotonic Relationship
- Handling Imbalanced Classes
단점
- Only Binary Classification
- Loss of Information: 만약 많은 범주가 거의 비슷한 WoE라면 오히려 정보 손실이다.
- Risk of Overfitting: target을 이용한다는 점에서 target-based encoding과 본질적으로 같다.
References
[1] https://www.kaggle.com/code/residentmario/encoding-categorical-data-in-sklearn/notebook
[2] (CatBoost) https://arxiv.org/pdf/1706.09516.pdf
[3] (category_encoders lib) https://contrib.scikit-learn.org/category_encoders/
[4] A preprocessing scheme for high-cardinality categorical attributes in classification and prediction problems https://dl.acm.org/doi/pdf/10.1145/507533.507538
[5] (weight of evidence) https://anakin297.medium.com/feature-engineering-categorical-encoding-weight-of-evidence-counts-frequency-9d4d8a1b325f
'스터디 > 데이터사이언스' 카테고리의 다른 글
[CS246] Bandits (2) - Epsilon-Greedy Algorithm (0) | 2024.02.27 |
---|---|
[CS246] Bandits (1) - Problem Settings (0) | 2024.02.23 |
Non-negative Matrix Factorization (NMF), 비음수 행렬 분해 (0) | 2024.01.02 |
[CS246] Counting Frequent Elements in a stream (0) | 2023.12.28 |
[CS246] Flajolet-Martin (FM) Algorithm: Counting Distinct Elements from Data Stream (0) | 2023.12.22 |