[TIL] Feature Importances / Boosting

키키·2021년 11월 2일
0

TIL

목록 보기
17/19
post-thumbnail

1 Feature Importances

1.1 Feature Importance(Mean decrease impurity, MDI)

: 각각 특성을 모든 트리에 대해 평균 불순도 감소(mean decrease impurity)를 계산한 값

장점

  • 속도가 빠르다.

단점

  • high cardinality 특성의 경우 중요도가 높게 나올 수 있음

1.2 Drop-column Importance

: 모든 특성을 한번씩 제거하고, 제거하기 전/후 성능을 비교함으로써 중요도를 계산해보는 방법

장점

  • 정확한 중요도 계산이 가능한다.

단점

  • 특성이 n개 존재할 때 n + 1 번 학습이 필요
  • 이론적으로는 좋아보이나, 특성이 많아질 수록 매우 느려져서 현실적으로 불가능하다.

1.3 순열중요도(Permutaion Importance, Mean Decrease Accuracy, MDA)

: 검증데이터에서 각 특성을 제거하지 않고 특성값에 무작위로 노이즈를 주어 기존 정보를 제거하여 특성이 기존에 하던 역할을 하지 못하게 하고 성능을 측정.

  • 특성중요도가 마이너스(-)는 모델에 영향을 주지 못하므로 제거해도 괜찮다.
  • 모델을 재학습해줄 필요가 없기 때문에 drop에 비해 계산 시간이 빠르다.

feature의 중요도는 ‘partial importance’가 아님

  • 각 feature의 중요도 안에는 다른 feature들과의 교호작용도 포함
  • 특정 feature의 값들을 랜덤으로 섞으면, 다른 feature들과의 연결고리도 끊어지게 되어, 해당 feature와 관련이 있는 모든 교호작용의 영향이 사라짐
  • 두 feature 간 교호작용의 영향은 그 두 개의 feature importance 각각에 중복 포함

shuffle

: feature의 값들을 무작위로 섞어서(shuffle, permutation) 그 feature를 노이즈로 만드는 것

  • 무작위로 섞게 되면, 목표 변수와 연결고리를 끊게 되는 것이므로, feature를 안쓴다고 할 수 있음
  • 이렇게 섞었을 때 예측값이 실제 값보다 얼마나 차이가 더 생겼는지를 통해 해당 feature의 영향력을 파악
  • 모델이 이 변수에 크게 의존하고 있을 경우에는 예측 정확도가 크게 감소
  • 이렇게 학습한 모델과 데이터만 있으면 변수 중요도를 뽑아주는 방법이기 때문에, 모델의 학습 과정, 내부 구조에 대한 정보가 필요 없어서 어느 모델이든 적용가능

주의할 점

할 때마다 결과가 매우 달라질 수 있음

  • 값을 무작위로 섞는 것이 특징이기 때문

무작위로 섞다보면 매우 비현실적인 데이터 인스턴스(instance)를 생성할 가능성도 높음

  • 특히, 변수들 간 상관관계가 높을 경우 이러한 문제점이 발생하기 쉬움
  • 예를들어 상당한 연관이 있는 변수인 '키'와 '몸무게' 변수가 있을 때, 키의 값들을 랜덤으로 섞다보면 키가 2m인데 몸무게가 30kg인 인스턴스를 만들 수도 있음

장점

  • 각 특성을 제거하지 않고, 특성을 무력화하여 성능을 비교할 수 있다.

단점

  • feature간 상관관계가 있을 때 오류가 생길 수 있다.

📎 [Paper] Please Stop Permuting Features
📎 모델 상관없이 변수 중요도의 파악: Permutation Feature Importance

2 Boosting

: 부스팅은 오분류된 데이터에 초점을 맞추어 더 많은 가중치를 주는 방식

  • 초기에는 모든 데이터가 동일한 가중치를 가지지만, 각 round가 종료된 후 가중치와 중요도 계산

  • 복원추출 시에 가중치 분포 고려

  • 부스팅의 종류: Adaboost, Gradient Boosting, LPBoost, TotalBoost, MadaBoost, LogitBoost

2.1 부스팅과 랜덤포레스트의 공통점

  • 부스팅과 배깅 모두 Tree기반 앙상블 모델에 속한다.
  • 트리기반 모델은 비선형적인 관계, 특성상호작용이 존재하는 데이터에서 사용하기 좋다.
  • 부스팅 모델도 마찬가지이다.

2.2 부스팅과 랜덤포레스트의 차이점

  • 가장 큰 차이! 랜덤포레스트의 경우 각 트리가 독립적으로 만들어지지만, 부스팅은 만들어지는 트리가 이전에 만들어진 트리에 영향을 받음
  • 부스팅은 Weak learner가 sequential하게 가중치를 달리하며 영향력을 행사함
  • 배깅은 독립(병렬적), 부스팅은 종속(순차적)

2.3 Adaboost

: 각 트리가 만들어질 때 잘못 분류되는 관측치에 가중치를 더 주어 다음 트리가 만들어질 때 더 많이 샘플링 되도록 함으로써 해당 관측치가 잘 분류 될 수 있도록 한다.

  • 기본모델: stump(one node two leaves)
  • adaboost는 트리마다 중요도가 다르다
  • 트리를 만드는 순서도 중요하다.
  • 예측할때 트리들의 가중치가 다르므로 가중합을 통해 구한다.

2.4 Gradient boosting(Xgboost, LightGBM, Catboost)

: Weak learner의 잔차(residual)를 학습하여 Strong learner를 만든다.

  • 잔차라고 해서 회귀문제에만 적용되는 것은 아니다. 회귀 분류 모두 사용가능하다.

  • 그래디언트 부스팅이 랜덤포레스트 알고리즘보다 성능이 항상 좋은 것은 아니다.

  • 불균형 클래스의 경우 일반적으로 그래디언트 부스팅이 랜덤포레스트 보다 성능이 좋다.

  • 하지만, 데이터에 노이즈가 많을 경우 과대적합 될 가능성이 랜덤포레스트보다 높으며, 하이퍼파라미터 튜닝을 하기에 랜덤포레스트보다 더 민감하고 순차적으로 트리를 만들어 학습하기 때문에 학습에 더 오랜 시간이 걸린다.

  • 시간을 들여서 튜닝을 할 수 있다면 부스팅이 좋다. 랜덤포레스트 먼저 써보고, 그다음 부스팅을 쓰자.

2.4.1 Xgboost

  • 부스팅은 직렬, Xgboost는 병렬(빠름)
  • 데이터 별 오류를 다음 round 학습에 반영 시킨다.
  • Level-wise 로 트리를 만듦
  • 그래디언트 부스팅과 달리, Regularization term이 추가되어 모델이 과적합(overfitting) 되는 것을 방지해준다.
  • 시간이 오래걸린다.

monotonic constraints

단조 증가한다고 명확히 알고 있는 특성이 있다면, 옵션을 주어 적용이 가능하다.

  • 예를 들어 우상향인 데이터에서 데이터가 부족하여 하강하는 특성이 있다면, 옵션을 주어 우상향하게 할 수 있다.

Early Stopping

Early Stopping 사용하여 과적합을 피한다.

  • 왜 n_estimators 최적화를 위해 GridSearchCV나 반복문 대신 early stopping을 사용할까?
  • Early Stopping은 트리를 만들고, 더이상 점수 개선이 없다면 학습을 멈춘다.
  • 하지만 GridSearch를 사용하면 트리개수만큼 학습해야 한다.
  • 따라서 Early Stopping이 효과적이다.
encoder = OrdinalEncoder()
X_train_encoded = encoder.fit_transform(X_train) # 학습데이터
X_val_encoded = encoder.transform(X_val) # 검증데이터

model = XGBClassifier(
    n_estimators=1000,  # <= 1000 트리로 설정했지만, early stopping 에 따라 조절됩니다.
    max_depth=7,        # default=3, high cardinality 특성을 위해 기본보다 높여 보았습니다.
    learning_rate=0.2,
#     scale_pos_weight=ratio, # imbalance 데이터 일 경우 비율을 적용합니다.
    n_jobs=-1
)

eval_set = [(X_train_encoded, y_train), 
            (X_val_encoded, y_val)]

model.fit(X_train_encoded, y_train, 
          eval_set=eval_set,
          eval_metric='error', # #(wrong cases)/#(all cases)
          early_stopping_rounds=50
         ) # 50 rounds 동안 스코어의 개선이 없으면 멈춤

2.4.2 LightGBM

  • xgb와 달리, Leaf-wise loss를 사용하여 loss를 줄일 수 있다.
  • 속도가 빠르다. (GPU 지원)
  • 과적합에 민감하다.

2.4.3 Catboost

  • 잔차 추정의 분산을 최소로 하면서 bias를 피하는 기법
  • Level-wise
  • 관측치를 포함한 채로 부스팅하는 것이 아닌, 관측치를 뺸채로 학습해서 그 관측치에 대한 unbiased residual을 구함

📎 What’s so special about CatBoost?
📎 Decision trees: leaf-wise (best-first) and level-wise tree traverse

2.5 하이퍼파라미터 튜닝

Random Forest

  • max_depth (높은값에서 감소시키며 튜닝, 너무 깊어지면 과적합)
  • n_estimators (적을경우 과소적합, 높을경우 긴 학습시간)
  • min_samples_leaf (과적합일경우 높임)
  • max_features (줄일 수록 다양한 트리생성, 높이면 같은 특성을 사용하는 트리가 많아져 다양성이 감소)
  • class_weight (imbalanced 클래스인 경우 시도)
    XGBoost
  • learning_rate (높을경우 과적합 위험이 있습니다)
  • max_depth (낮은값에서 증가시키며 튜닝, 너무 깊어지면 과적합위험, -1 설정시 제한 없이 분기, 특성이 많을 수록 깊게 설정)
  • n_estimators (너무 크게 주면 긴 학습시간, early_stopping_rounds와 같이 사용)
  • scale_pos_weight (imbalanced 문제인 경우 적용시도)

질문

  1. 부스팅은 어떤 인코딩을 하면 좋나요?
  • 부스팅도 트리와 유사, 부스팅도 원핫인코딩보다 다른 인코딩을 사용하는 것이 좋다
  1. monotonic constraints에서 왜 단조 증가하는 특성을 조정해주어야 하나요?
  • 원래 단조증가하는 특성인데 오류에 의해서 비단조로 특성으로 나왔을 때 조정
  1. 불균형 class 조정
  • 대부분 오버, 언더 샘플링이나 class weight으로 조정 가능
  1. 순열 중요도 계산 마지막 부분에서 순열 중요도의 평균 감소값과 그 표준편차의 차를 계산하여 양수인 특징을 왜 골라내는지 이해가 잘 안됩니다.
  • 전체 표준편차보다 중요하게 쏠려있는 특징을 고려한다.

0개의 댓글