본문 바로가기
카테고리 없음

[정형데이터] Better Features for a Tree-Based Model

by Keep It Simple, Stupid! 2021. 11. 11.

 다시 기록하고 공유하는 습관을 공유하고자 한다. 피드백은 언제나 환영이다. 

What tree models can see, and what they can’t

 모델이 작동하는 방식을 이해하면 성공적인 Features를 만드는 것이 훨씬 쉬워진다. 모델의 강점(strong sides)과 약점(weak sides)을 추론하고 그에 따라 Features를 준비할 수 있기 때문입니다. 트리 기반 모델이 이해할 수 있는 Features와 사용하기 어려운 Features을 함께 살펴보자. (이러한 경우 모델을 어떻게 도울 수 있는지)

How a tree-based model uses features

 먼저 tree-based models이 어떻게 생겼는지 아래 [Figure 1]을 살펴보자.

[Figure 1] Tree-based model example (generated from LightGBM model by the author)

 tree-based models는 위와 같이 binary decision("yes" or "no")들로 구성되어 있다. 특정 feature의 조건에 따라 분할된다. 이러한 많은 decisions이 depth, leaf에 따라 decision tree를 구성하게 된다. 더 나아가 서로 다른 decision tree 들로부터 얻어진 예측값을 평균을 하여 최종 예측값을 제공하게 된다. (아주 일반적인 tree-based model에 대한 설명이므로 model에 따라 tree의 성질이 다를 수 있음), 즉, 일반적인 tree-model에 대한 메카니즘임으로 좋은 feature를 이해하는데는 충분하다고 생각된다.

The number of required splits (or required binary decisions) is an important property of the feature

"요구되는 분할 수 (e.g. binary decisions)는 feature의 아주 중요한 속성(본질)이다." 라고 강조한다.

 이진 속성을 감안하면, tree-based model은 몇 번의 decision들로 충분히 잘 signal을 추출할 수 있게된다. (즉, 예측값을 잘 분류할 수 있음) 이러한 속성이 있는 몇 가지 feature들을 살펴보도록 하자.

  요구되는 분할(required splits)에 대해 더 잘 이해하기 위해 "Feature vs Target" graph를 참고하였다. 각각의 feature 는 x축, target은 y축이며, 또한 split line을 사용하여 낮음(low, 0)과 높음(high, 5)으로 구분된 target(value)값을 구분(예측)하고자 한다.

Easy features requiring one/few splits (visualization by the author)

  보다시피, tree-based models은 graph가 위쪽에서 아래쪽 또는 반대로 방향을 자주 변경하지 않는 feature를 잘 처하는 것을 알 수 있다. feature는 선형(linear)일 필요가 없으며 주요 요구 사항은 낮은 target 값과 높은 target 값을 구분하기 위해 많은 분할 지점이 필요하지 않다는것을 알 수 있다. 

  또한 tree-based models의 장점은 feature interaction (상호작용) 을 처리할 수 있다. 즉, feature A가 작은 feature B값에 대해 한 방향으로 동작하지만 큰 feature B 값에 대해 동작을 변경하는 경우. 다른 모든 model (linear regression, svr, 등)이 이러한 상호작용을 캡처할 수 있는것 아니지만, tree-based model은 모두 가능하다. 

  이제 tree-based model이 처리하기 어려운 몇가지 feature들을 살펴보고자 한다.

Hard features requiring many splits (visualization by the author)

  feature가 위 그림에서 보이고 있는 반복적인 신호(패턴)을 캡처하기 위해 더 많은 split이 필요하므로 더 깊은 tree가 필요하게 된다. 그러나 너무 많은 leaf 및 depth를 가진 tree는 overfitting에 위험이 더 높다는 것을 누구나 알고 있을 것이다. (즉, 모델이 더 depth를 가진다고 해서 test set에서는 정확한 예측을 할 수 없다.)

Feature engineering examples

 이제 tree-based model에 대해 어떤 유형의 feature를 원하는지 직관력이 생겼으므로 실제 feature를 개선하여 features trasnform하는 방법에 대해 몇가지 예를 살펴보고자 한다. 

Capture repeating pattern

Feature with repeating pattern (visualization by the author)

 위 그림에서 반복되는 패턴이 있는 feature를 확인할 수 있다. (e.g. date (날짜)) 많은 데이터 셋에서는 date(1~100)라는 feature가 있다. "date of registration", "date of birth", "date of measurement" 기타 등등.. date feature의 일반적인 속성 중 하나는 계절성 구성 요소가 있다는 것이다. 예를 들어 target variable(y축)는 weekday(요일)에 따라 달라질 수 있다. 예를 들면 주말에는 평일과 다른 패턴 값을 가질 것이다.

 tree-based model은 위와 같은 feature로 정보를 추출하는 것은 어려울 것이다. 주말마다 두 개의 Split이 필요하므로 양쪽에서 분리해야한다. 이것을 해결하기 위해 극단적으로 더 나아가서, 정확한 날짜 값으로 분할하면 날짜가 반복되지 않기 때문에 미래에 보이지 않는 데이터를 예측하는 것은 큰 도움이 되지 않을것으로 판단된다. 

 따라서, tree-based model을 돕는 가장 좋은 방법은 패턴을 훨씬 단순한 binary feature인 "is_weekend"로 추출하는 것이다. 주말에는 "1", 평일에는 "0" 값을 가지게 하고, 각 요일에 대해 월(1), 화(2), ... 일(7) 의 값을 갖는 "요일" feature를 사용하는 것이 더 효과적일 수 있다. 이전 예에서 이것이 시작적으로 의미하는 바를 볼때 데이터의 신호를 완전히 캡처하는데 필요한 split 을 줄여 tree-based model에 적합한 feature를 만들어 준다.

Reduced required splits for a tree-based model to capture the feature signal (visualization by the author)

 기본적으로 모든 반복 간격에 (e.g. weeks)로 설정하고, 모델이 split에 대한 결정을 내리는 데 평균값을 사용하도록 하자. 위의 예를 통해 필요한 split 갯수를 8개에서 2개로 줄 일 수 있다고 한다.

We can improve features by reducing the number of required splits for the model to capture the signal
"모델이 신호를 캡처하는데 필요한 split 수를 줄임으로써 feature를 개선할 수 있다."

기본적으로 모든 반복 간격에 (e.g. weeks)로 설정하고, 모델이 split에 대한 결정을 내리는 데 평균값을 사용하도록 하자. 위의 예를 통해 필요한 split 갯수를 8개에서 2개로 줄 일 수 있다고 한다.

Remove a noise

 tree-based model에서 도움이 필요할 수 있는 또 다른 상황은 noise가 심한 data이다. noise가 크지만, 실제로는 한 point만 의미가 있는 feature를 고려하자. 이 point를 알고 있으면 필요한 split을 직접 수행하여 모델을 더 좋게 개선시킬 수 있다. 이것은 원시 feature를 binary feature로 변한하여 달성할 수 있다.

Example of noisy feature (visualization by the author)

 에를 들어, 상점에서 다른 날짜에 여러 번 구매했으며 이 상점이 다른 위치로 옮겨진 알려진 날짜가 있다고 하자. 이동 전/후의 평균값을 확인하면 평균은 25/30이 된다. 그러나 값이 0에서 60으로 변하는 높은 분산을 감안할때 모델이 올바른 split point(분할점)을 결정하기 어렵다.

 위 예에서 평균 값이 변경되었다는 점을 감안할때, model은 올바른 point 근처에서 split 할 가능성이 가장 높다. 그러나 어느 한쪽 또는 다른 쪽으로 어떤 point를 선택할 수 있으므로 이 이동 지점 주변에서 예측이 더 나빠질 수 있는데, 이 point를 명시적으로 지정하는 새로운 feature를 도입하여 모델의 성능을 개선시킬 수 있다. 예를 들어, 이동 후 모든 행에 대해 값을 1을 갖고, 그 이전에 값을 0을 갖는 "new_location" feature가 될 수 있다.

New feature without noise (visualization by the author)

물론 위와 같은 변환에는 올바른 split point를 선택하기 위한 "domain decision"이 필요하다. 그러나 이것이 가능하면 이러한 feature는 모델이 불필요한 잘못된 분할(noise에 과적합이 발생할 수 있는)을 방지하는데 크게 도움이 될 수 있다.

More on what a tree-based model can/can’t do

Beware of feature values outside the known interval

 tree-based model의 단점 중 하나는 extrapolate가 불가능하다. tree-based model은 일반적으로 훈련 데이터의 가장 작은 값보다 작은 값이나 훈련 데이터의 가장 큰 값보다 큰 값을 예측하지 못한다.

 feature X 와 target Y를 다음과 같이 고려해보자.

  • X = 1, Y = 2
  • X = 2, Y = 3
  • X = 3, Y = 4
  • X = 4, Y = ? (test)

 간단한 선형 모델은 X, Y사이의 선형 관계를 캡처하고 마지막 Y를 5라고 올바르게 예측할 수 있지만, tree-based model은 4 주변의 값을 예측할 가능성이 가장 높을 것이다. 

 위의 문제를 해결하는 안타깝게도 불가능하다...

A tree-based model can’t make splits for feature values outside the interval seen in training data, therefore it can’t distinguish between them.

 실제로 이 제한과 관련된 몇가지 접근 방식이 있지만 일반적으로 대상값의 변환이 포함된다. 이러한 접근 방식의 방향에 대해 단서를 제공할 수 있는데, 실제 목표값이 아니라 이전 값과의 차이를 마지막에 이전 값과 예측된 차이를 하니씩 가산하여 실제 목표값을 재구성하는 경우가 있다.

Don’t need to scale or normalize

 tree-based model을 사용할 때 target을 scale 또는 normalization할 필요가 없다. 0에서 1사이의 간격으로 0.8에서 분할을 만드는 것은 예를 들어 -100에서 900 사이의 간격으로 700이다. 

 시각적으로 보기 위해 값이 30에서 130 사이인 임의의 feature에 대한 "feature vs target" graph를 보자. 그리고 동일한 feature에 대해 동일한 그래프를 표시하지만 간격(0 , 1)로 normalization한 후 표시해본 그림이다.

Normalization doesn’t affect the number of splits needed (visualization by the author)

 

 왼쪽 그림과 오른쪽 그림의 차이는 X축의 scale 차이다. model은 낮은 target 값과 높은 target값을 분리하기 위해 정규화 전과 정확히 동일한 분할이 필요하다는것을 알 수 있다.

 유사하게 tree-based model은 outlier에 민감하지 않다. (linear model과는 반대로)

Conclusions

 최근 딥러닝의 부인할 수 없는 발전에도 불구하고 tree-based model은 아직 경쟁력이 있다. 그리고 우리가 테이블 형식의 데이터에 대해 이야기한다면 많은 경우(대부분 아니겠지만)에서 정확한 feature engineering을 갖춘 tree-based model이 여전히 많은 kaggle 경쟁 결과에서 입증된 딥러닝 접근 방식보다 성능이 뛰어날 수 있다. tree-based model에 feature-engineering을 적용하는 것은 key point다. 

 

▶ 번역이 어색했던점 양해부탁드립니다. 

Reference

 

Better Features for a Tree-Based Model

What tree models can see, and what they can’t

towardsdatascience.com

 

댓글