키워드

  • permutation importances
  • Feature importance
  • gradient boosting: xgboost

특성중요도 3가지

1. Feature Importances(Mean decrease impurity, MDI)

sklearn 트리 기반 분류기에서 디폴트로 사용되는 특성 중요도는 속도는 빠르지만 결과를 주의해서 봐야 합니다. 각각 특성을 모든 트리에 대해 평균불순도감소(mean decrease impurity)를 계산한 값입니다.

  • 주의점
    • 특성의 범주가 많을 경우 해석하는데 주의할 것 → 전체적인 일반화보다는 범주가 많은 그룹에 편향된 결과가 나올 수 있다. (과적합, 불순도 감소값이 높게 나오는 오류현상 발생)

2. Drop-Column Importance

이론적으로 가장 좋아 보이는 방법이지만, 매 특성을 drop한 후 fit을 다시 해야 하기 때문에 매우 느리다는 단점이 있습니다.

특성이 n개 존재할 때 n + 1 번 학습이 필요합니다.

  • 단점
    • 특성이 많을 때 모델마다 만들어야 하므로 계산이 오래걸린다.

3. 순열중요도, (Permutation Importance, Mean Decrease Accuracy,MDA)

  • 순열 중요도는 기본 특성 중요도와 Drop-column 중요도 중간에 위치하는 특징을 가진다고 볼 수 있습니다.
  • 중요도 측정은 관심있는 특성에만 무작위로 노이즈를 주고 예측을 하였을 때 성능 평가지표(정확도, F1, R2 등)가 얼마나 감소하는지를 측정합니다.
  • Drop-column 중요도를 계산하기 위해 재학습을 해야 했다면, 순열중요도는 검증데이터에서 각 특성을 제거하지 않고 특성값에 무작위로 노이즈를 주어 기존 정보를 제거하여 특성이 기존에 하던 역할을 하지 못하게 하고 성능을 측정합니다. 이때 노이즈를 주는 가장 간단한 방법이 그 특성값들을 샘플들 내에서 섞는 것(shuffle, permutation) 입니다.

순열 중요도를 사용하는 데이터 셋은?

  • val & test
    • 모델의 평가지표를 train 데이터로 정할 수 없기 때문입니다.
    • 모델에 데이터가 좋지 않다면, 성능 하락으로 신뢰도가 하락하기 때문입니다.

순열 중요도의 단점

  • 특성끼리 상관관계가 있다면
    • 중요도를 나누어 가져서 중요도 점수가 낮게 나옵니다.

Boosting(xgboost for gradient boosting)

분류문제를 풀기 위해서는 트리 앙상블 모델을 많이 사용합니다.

  • 트리 앙상블은 랜덤포레스트나 그래디언트 부스팅 모델을 이야기 하며 여러 문제에서 좋은 성능을 보이는 것을 확인하였습니다.
  • 트리모델은 non-linear, non-monotonic 관계, 특성간 상호작용이 존재하는 데이터 학습에 적용하기 좋습니다.
  • 한 트리를 깊게 학습시키면 과적합을 일으키기 쉽기 때문에. 배깅(Bagging, 랜덤포레스트)이나 부스팅(Boosting) 앙상블 모델을 사용해 과적합을 피합니다.
  • 랜덤포레스트의 장점은 하이퍼파라미터에 상대적으로 덜 민감한 것인데, 그래디언트 부스팅의 경우 하이퍼파라미터 셋팅에 따라 랜덤포레스트 보다 더 좋은 예측 성능을 보여줄 수도 있습니다.

부스팅과 배깅의 차이점은?

랜덤포레스트나 그래디언트 부스팅은 모두 트리 앙상블 모델이지만 트리를 만드는 방법에 차이가 있습니다.

가장 큰 차이는, 랜덤포레스트의 경우 각 트리를 독립적으로 만들지만 부스팅은 만들어지는 트리가 이전에 만들어진 트리에 영향을 받는다는 것입니다.

부스팅 알고리즘 중 AdaBoost는 각 트리(약한 학습기들, weak learners)가 만들어질 때 잘못 분류되는 관측치에 가중치를 줍니다.

그리고 다음 트리가 만들어질 때 이전에 잘못 분류된 관측치가 더 많이 샘플링되게 하여 그 관측치를 분류하는데 더 초점을 맞춥니다.

  • AdaBoost의 알고리즘 예시 입니다.
  • Step 0. 모든 관측치에 대해 가중치를 동일하게 설정 합니다.
  • Step 1. 관측치를 복원추출 하여 약한 학습기 Dn을 학습하고 +, - 분류 합니다.
  • Step 2. 잘못 분류된 관측치에 가중치를 부여해 다음 과정에서 샘플링이 잘되도록 합니다.
  • Step 3. Step 1~2 과정을 n회 반복(n = 3) 합니다.
  • Step 4. 분류기들(D1, D2, D3)을 결합하여 최종 예측을 수행합니다.

AdaBoost와 Gradient Boost의 차이

AdaBoost는 stump로 구성되어 있습니다. 하나의 stump에서 발생한 error가 다음 stump에 영향을 줍니다. 이런식으로 여러 stump가 순차적으로 연결되어 최종 결과를 도출합니다.

AdaBoost

  • 간단한 약분류기(weak classifier)들이 상호보완 하도록 단계적(순차적)으로 학습, 이들을 조합하여 최종 강분류기(strong classifier)의 성능을 증폭시키는 부스팅 알고리즘

머신러닝 - 14. 에이다 부스트(AdaBoost)

Gradient Boost

머신러닝 - 15. 그레디언트 부스트(Gradient Boost)

  • 반면, Gradient Boost는 stump나 tree가 아닌 하나의 leaf (single leaf)부터 시작합니다. 이 leaf는 타겟 값에 대한 초기 추정 값을 나타냅니다.
  • 보통은 초기 추정 값을 평균으로 정합니다. 그 다음은 AdaBoost와 동일하게 이전 tree의 error는 다음 tree에 영향을 줍니다.
  • 하지만 AdaBoost와 다르게 stump가 아닌 tree로 구성되어 있습니다. 보통은 leaf가 8개에서 32개되는 tree로 구성합니다.

Xgboost

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

  • 왜 n_estimators 최적화를 위해 GridSearchCV나 반복문 대신 early stopping을 사용할까요?
  • n_iterations 가 반복수라 할때, early stopping을 사용하면 우리는 n_iterations 만큼의 트리를 학습하면 됩니다.
  • 하지만 GridSearchCV나 반복문을 사용하면 무려 sum(range(1,n_rounds+1)) 트리를 학습해야 합니다! 거기에 max_depthlearning_rate 등등 파라미터 값에 따라 더 돌려야 합니다.
  • early stopping을 잘 활용하는게 훨씬 효과적이겠지요.

sklearn 외에 부스팅이 구현된 여러가지 라이브러리를 사용할 수 있습니다

python libraries for Gradient Boosting

  • scikit-learn Gradient Tree Boosting — 상대적으로 속도가 느릴 수 있습니다.
    • Anaconda: already installed
    • Google Colab: already installed
  • xgboost — 결측값을 수용하며, monotonic constraints를 강제할 수 있습니다.
    • Anaconda, Mac/Linux: conda install -c conda-forge xgboost
    • Windows: conda install -c anaconda py-xgboost
    • Google Colab: already installed
  • LightGBM — 결측값을 수용하며, monotonic constraints를 강제할 수 있습니다.
    • Anaconda: conda install -c conda-forge lightgbm
    • Google Colab: already installed
  • CatBoost — 결측값을 수용하며, categorical features를 전처리 없이 사용할 수 있습니다.
    • Anaconda: conda install -c conda-forge catboost
    • Google Colab: pip install catboost

하이퍼파라미터 튜닝

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 문제인 경우 적용시도)

보다 자세한 내용은 다음을 참고하세요

profile
ENTJ 데이터 분석가 준비중입니다:)

0개의 댓글