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