Search

앙상블

대분류
인공지능/데이터
소분류
ML/DL 정리 노트
유형
머신 러닝
부유형
지도학습
최종 편집 일시
2024/10/27 15:27
생성 일시
2024/08/20 01:00
14 more properties

앙상블(Ensemble)

여러 머신러닝 모델을 연결하여 더 강력한 모델을 만드는 기법

Bagging

1.
데이터로부터 복원추출을 통해 n개의 bootstrap sample 생성
2.
해당 sample에 대해서 모델 학습
3.
1,2 과정을 M번 반복한 후 최종 Bagging 모델을 정의

Random Forest

Decision Tree의 주요 단점 : 훈련 데이터에 과대적합되는 경향이 있다는 것이다.
랜덤 포레스트는 해당 문제를 회피할 수 있는 방법이다.
랜덤하게 일부 샘플들과 일부 피쳐들을 뽑아서 여러개의 트리를 만들어서 앙상블하는 모델
주요 파라미터
n_estimators: 생성할 트리의 개수
max_features: 각 트리가 얼마나 무작위가 될지를 결정하며 작을 수록 과대적합을 줄여준다.
(일반적으로 기본값을 추천)

Boosting

1.
weak learner를 생성한 후 Error를 계산
2.
Error에 기여한 Sample마다 다른 가중치를 주고 해당 Error를 감소시키는 새로운 모델 학습
3.
1,2 과정을 M번 반복한 후 최종 Boosting 모델을 정의

Gradient Boost

보통 max_depth를 1 ~ 5 이하로 설정하여 약한 트리들을 만들어 학습하는 알고리즘
트리 기반 부스팅 앙상블 모델
머신러닝 알고리즘 중에서 가장 예측 성능이 높다고 알려졌고 인기있는 알고리즘
주요 파라미터
max_depth: 1 ~ 5 이하로 설정
n_estimators: 생성할 트리의 개수
learning_rate: 얼마나 강하게 보정할지를 정하는 수치
GBM(Gradient Boost)를 병렬 학습이 지원되도록 구현한 라이브러리.
따라서 GBM보다 학습이 빠르다.
일반 파라미터
부스팅을 수행할 때 트리를 사용할지, 선형 모델을 사용할지 등을 고른다.
부스터 파라미터
선택한 부스터에 따라서 적용할 수 있는 파라미터 종류가 다르다.
학습 과정 파라미터
학습 시나리오를 결정한다.
과적합 방지를 위해 조정해야 하는 것
learning_rate 낮추기 & n_estimators 높이기
max_depth 낮추기
min_child_weight 높이기
gamma 높이기
from xgboost import to_graphviz to_graphviz(xgb)
Python
복사
LightGBM은 트리 기준 분할이 아닌 리프 기준 분할 방식을 사용한다.
트리의 군형을 맞추지 않고 최대 손실 값을 갖는 리프 노드를 지속적으로 분할하면서 깊고 비대칭적인 트리를 생성한다.
이렇게 하면 트리 기준 분할 방식에 비해 예측 오류 손실을 최소화할 수 있다.
장점
XGBoost보다 빠르다.
대용량 데이터 처리 가능(메로리 사용량이 상대적으로 적다)
num_leaves: 클수록 정확도는 높아지지만 오버피팅 발생 가능
min_data_in_leaf: 클수록 오버피팅 방지
max_depth: 낮추기
learning_rate 낮추기 & n_estimators 높이기
from lightgbm import LGBMClassifier, plot_importance hp = { "random_state" : 42, "max_depth" : 2, "n_estimators" : 100, "learning_rate": 0.01, } lgb = LGBMClassifier(**hp).fit(X_tr, y_tr) print(f'훈련용 평가지표: {lgb.score(X_tr, y_tr)} / 테스트용 평가지표: {lgb.score(X_te, y_te)}') plot_importance(lgb) plt.show()
Python
복사
from lightgbm import create_tree_digraph create_tree_digraph(lgb)
Python
복사
범주형 변수가 많을 경우 높은 성능과 함께 빠른 학습 속도를 제공한다.
범주형 변수를 인코딩 하지 않고 넣어도 된다.
수치형 변수가 많을 경우 매우 느리다.
LightGBM은 알고리즘 종류 중 DFS(깊이 우선 탐색)처럼 트리를 우선적으로 깊게 형성하는 방식이다.
반면에 XGBmmost와 Catboost는 BFS(너비 우선 탐색)처럼 우선적으로 넓게 트리를 형성한다.
이때 XGBoost와 Catboost의 차이점은 트리가 나누어지는 Feature들이 대칭인지 여부에 따라 차이가 난다.
feature_importance = cat.feature_importances_ sorted_idx = np.argsort(feature_importance) fig = plt.figure(figsize=(12, 6)) plt.barh(range(len(sorted_idx)), feature_importance[sorted_idx], align='center') plt.yticks(range(len(sorted_idx)), np.array(range(len(X_tr)))[sorted_idx]) # 변수명이 있다면, 아래와 같이... # plt.yticks(range(len(sorted_idx)), np.array(X_test.columns)[sorted_idx]) plt.title('Feature Importance')
Python
복사

Voting

다른 종류의 모델들의 예측값을 합쳐 최종 결과를 도출해내는 과정
Hard voting
모델들의 예측 결과값을 다수결로 최종 class 결정
Soft voting
모델들의 예측 결과값간 확률을 평균하여 최종 class 결정

Stacking

개별적인 모델들이 학습하고 예측한 데이터를 쌓아서 또 다른 학습데이터를 만들고 이 데이터를 기반으로 메타 모델을 하나 더 만들어 예측하는 모델이다.
1.
1. training dataset을 이용하여 sub model 예측 결과를 생성한다.
2.
2. 1번의 output 결과를 이용하여 training data로 사용하여 meta learner 모델을 생성한다.