앙상블 부스팅(Boosting)
from sklearn.ensemble import GradientBoostingClassifier
평균으로 추정 → 오차(잔차) 학습
앞모델까지 예측한 값 + 학습율(lr) * 잔차 학습값
→ 잔차를 그대로 더하면 overfitting 발생 가능
→ lr 쓰는 이유 = 약한 학습기 쓰는 이유
learning rate
: 기본값 0.1, 값이 크면 복잡한 모델 → overfitting 가능n_estimators
: decision tree의 개수, 많을 수록 복잡한 모델, 최대한 크게n_iter_no_change
, validation_fraction
: 훈련 조기종료learning rate 변화에 따른 성능변화
lr = 0.0001 → 과소적합 발생
⇒ 과소적합 해결 방법 : n_estimators를 증가시키기
lr = 0.01
lr = 0.1
💡 lr를 먼저 조정하는 것 보다, 모델을 미리 많이 만들어 놓고(n_estimators 최대한 크게) lr 조절하는 것이 좋음
Gradient Boost 업그레이드 버전
Gradient Boost 알고리즘을 기반으로 개선해서 분산환경에서도 실행할 수 있도록 구현 나온 모델
설치
conda install -y -c anaconda py-xgboost
pip install xgboost
개발 방법
Scikit-learn 래퍼 XGBoost
from xgboost import XGBClassifier, XGBRegressor
learning_rate
: 학습률, 보통 0.01 ~ 0.2 사이의 값 사용n_estimators
: week tree 개수앙상블 보팅(Voting)
estimators
voting
: 기본값 - “hard”#각 모델의 Hyper parameter는 최적의 성능을 내도록 튜닝한 값들 이라는 가정
#Voting 앙상블 모델에 추가하는 모델들은 가장 좋은 성능을 내는 hyper parameter를 가진(튜닝이 끝난) 모델을 사용
knn = Pipeline(steps=[('scaler', StandardScaler()),
('knn', KNeighborsClassifier(n_neighbors=5))])
svm = Pipeline(steps=[("scaler", StandardScaler()),
("svm", SVC(random_state=0, probability=True))])
rfc = RandomForestClassifier(n_estimators=200, max_depth=3, random_state=0)
xgb = XGBClassifier(n_estimators=500, learning_rate=0.01, max_depth=1, random_state=0)
상관관계가 높은 모델을 앙상블 보팅에 포함시키는 것은 좋지 않음
→ 상관관계가 높음 = 두 모델이 비슷한 예측을 하는 것 → 의미 없음
⇒ 각각 좋은 성능을 내지만 다른 예측을 하는 다양한 모델을 모아서 하는 것이 좋음
# 상관계수
df.corr()
💡 상관계수가 낮은 것 끼리 묶어준다
개별 모델의 성능이 가장 좋은 모델을 기준으로 상관관계(corr)값이 가장 낮은 것을 묶어준다.
# Ordered Dictionary 형태로 묶어준다.
estimators = [
("svm", svm),
("knn", knn),
("random forest", rfc)
]
estimators
: 앙상블할 모델들 설정. ("추정기이름", 추정기) 의 튜플을 리스트로 묶어서 전달