Prepare Data
- Import H1N1 Data
1 |
|
Permutation Importances(순열 중요도)
- 모델 해석과 Feature selection을 위해 Permutation Importances(순열중요도)를 계산한다.
- 기본 Feature importance는 빠르지만 특성 종류에 따라 부정확한 결과가 나올 수 있어 주의가 필요하다.
- Permutation importance를 사용하면 더욱 정확한 계산이 가능하다.
특성 중요도 계산 방법 3가지
Feature Importances(Mean decrease impurity, MDI)
- sklearn tree 기반 분류기에서 default로 사용되는 Feature importance는 속도는 빠르지만 결과를 주의해야 한다.
- 각 특성을 모든 트리에 대해 평균불순도감소(Mean Decrease Impurity)를 계산한 값이다.
- 상위노드에서 하위노드의 가중평균 불순도 차를 계산한 것이다.
- 불순도감소(Impurity Decrease)
- $\displaystyle \frac{N_t}{N}$ * (impurity - $\displaystyle\frac{N_{tR}}{N_t}$ * right_impurity - $\displaystyle\frac{N_{tL}}{N_t}$ * left_impurity)
- $N$: 전체 관측치 수, $N_t$: 현재 노드 t에 존재하는 관측치 수
- $N_{tL}$, $N_{tR}$: 노드 t 왼쪽(L)/오른쪽(R) 자식노드에 존재하는 관측치 수
- 만약
sample_weight
가 주어진다면, $N$, $N_t$, $N_{tR}$, $N_{tL}$는 가중합 - Warning : impurity-based feature importances can be misleading for High cardinality features (many unique values).
- 높은 Cadinality에 대해 Group이 편향되어 과적합을 일으키고 불순도가 높게 나오는 오류가 나서 잘못된 해석을 하기 쉽다.
1 |
|
- 다른 특성에 비해 비교적 High cardinality인 51개의 Category로 구성 된
state
는 유의해서 봐야한다. - Tree 구성 중 분기에 이용될 확률이 높아 과적합 위험이 있다.
1 |
|
Drop-Column Importance
- 이론적으로 가장 좋아 보이지만, 매 특성을 drop한 후 fit을 다시 해야하기 때문에 느리다는 단점이 있다.
- 특성이 n개 존재할 때 n + 1번 학습이 필요하다.
1 |
|
순열중요도(Permutation Importance, Mean Decrease Accuracy, MDA)
- Permutation Importance는 기본 Feature Importance와 Drop-column Importance의 중간에 위치하는 특징이 있다.
- Importance 측정은 관심있는 특성에만 무작위로 Noise를 주고 예측했을 때 Confusion Matrix(Acc, F1, $R^2$ 등)가 얼마나 감소하는지 측정한다.
- Drop-column importance를 계산하기 위해 Retraining을 해야했다면, Permutation improtance는 Val data에서 각 특성을 제거하지 않고 특성값에 무작위로 Noise를 주어 기존 정보를 제거하여 특성이 기존에 하던 역할을 하지 못하게 하고 성능을 측정한다.
- 이때 Noise를 주는 간단한 방법이 그 특성값들을 Sample 내에서 Shuffle or Permutation 하는 것이다.
- 주로 쓰게 된다.
1 |
|
Feature Selection
- Improtance를 이용하여 Feature selection 한다.
- Importance가 음수인 특성은 제외해도 성능에 영향이 없으며 모델학습 속도가 개선된다.
1 |
|
Boosting(xgboost for gradient boosting)
- Classifier 문제에서 Tree Ensemble Model을 많이 사용한다.
- Tree Ensemble Modeld은 RandomForest나 Gradiant Boosting Model을 이야기 하며 여러 문제에서 좋은 성능을 보인다.
- Tree Model은 non-linear, non-monotonic 관계, 특성간 상호작용이 존재하는 데이터 학습에 적용하기 좋다.
- 한 Tree를 깊게 학습시키면 과적합을 일으키기 쉽기 때문에 Bagging(RandomForest)나 Boosting Ensemble Model을 사용해 과적합을 피한다.
- RandomForest의 장점은 Hyperparameter에 상대적으로 덜 민감한 것인데, Gradiant Boosting의 경우 Hyperparameter의 setting에 따라 RandomForest보다 좋은 예측 성능을 보여준다.
Boosting과 Bagging의 차이점
- 가장 큰 차이는 RandomForest의 경우 각 Tree를 독립적으로 만들지만 Boosting은 만들어지는 Tree가 이전에 만들어진 Tree에 영향을 받는다는 것이다.
- AdaBoost는 각 Tree(Weak learners)가 만들어질 때 잘못 분류되는 관측치에 Weight을 준다.
- 다음 Tree가 만들어질 때 이전에 잘못 분류된 관측치가 더 많이 Sampling되게 하여 그 관측치를 분류하는데 더 초점을 맞춘다.
- AdaBoost Algorithm
- 모든 관측치의 Weight을 동일하게 Setting한다.
- 관측치 복원추출하여 Leak learners $Dn$을 학습하고 +,- 분류한다.
- 잘못 분류된 관측치에 Weight을 부여해 다음 과정에서 Sampling이 잘되게 한다.
- 2-3 과정을 $n$회 반복한다.
- 분류기($D1, D2, D3$)를 결합하여 최종 예측을 수행한다.
- Final learner H(x) 는 Weak learners($h_t$)의 가중($\alpha$)합으로 만들어진다.
- 여기서 $\alpha_t$ 가 크면 $e_t$가 작다는 것으로 분류기 $h_t$ 성능이 좋다는 것
- 여기서 $\alpha_t$ 가 작으면 $e_t$가 크다는 것으로 분류기 $h_t$ 성능이 안좋다는 뜻
Gradiant Boosting
- Regressor, Classifier 모두 사용할 수 있다.
- Gradiant는 Ada와 유사하지만 Loss function을 최소화 하는 방법에서 차이가 난다.
- Gradiant에서는 Sample의 Weight을 조정하는 대신 Residual(잔차)을 학습한다.
- 잔차가 더 큰 데이터를 학습하는 효과가 있다.
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
- Anaconda, Mac/Linux:
- LightGBM — 결측값을 수용하며, monotonic constraints를 강제한다.
- Anaconda:
conda install -c conda-forge lightgbm
- Google Colab: already installed
- Anaconda:
- CatBoost — 결측값을 수용하며, categorical features를 전처리 없이 사용한다.
- Anaconda:
conda install -c conda-forge catboost
- Google Colab:
pip install catboost
- Anaconda:
XGBoost
1 |
|
- XGBoost는 RandomForest보다 Hyperparameter setting에 민감하다.
Early Stopping
n_estimators
를 최적화 하기 위해 GridSeachCV나 for문 대신 Early stopping을 사용한다.n_iterations
가 반복수라 할때 Early stopping을 사용하면n_interation
만큼의 Tree를 학습하면 된다.- GridSearchCV나 for문을 사용하면
sum(range(1,n_rounds+1))
만큼의 Tree를 학습해야 하기 때문에(max_depth
나learning_rate
가 있으면 더하다.) Early stopping을 활용하는 게 효과적이다. - Target imbalance 시 Class에 Weigt을 주기 위해 Ratio를 계산한다.
1 |
|
1 |
|
Hyperparameter Tuning
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 문제인 경우 적용시도)
참고자료
- Olson 2017
- Feature Importance in Decision Trees
- Permutation Importance
- Kaggle: Machine Learning Explainability
- Christoph Molnar: Interpretable Machine Learning
- Selecting good features, Part 3, Random Forests
- Permutation Importance vs Random Forest Feature Importance (MDI)
- Beware Default Random Forest Importances
- eli5.sklearn.PermutationImportance
- eli5.show_weights
- scikit-learn user guide,
scoring
parameter
- Boosting
- Understanding AdaBoost
- Study of AdaBoost and Gradient Boosting Algorithms for Predictive Analytics
- Gradient Boosting, DataCamp
- Gradient Boost Part 2: Regression Details
- Gradient Boost Part 3: Classification
- Avoid Overfitting By Early Stopping With XGBoost In Python
- Notes on parameter tuning
- Parameters documentation