본문 바로가기
공부/Deep Learning

혼자공부하는 머신러닝 + 딥러닝 5장

by 유스베리이 2023. 10. 28.

5-3 트리의 앙상블

 

정형 데이터 - 데이터 베이스, 엑셀, CSV 로 저장하기 쉬운 데이터

비정형 데이터 - 데이터 베이스, 엑셀로 표현하기 어려운 데이터 (ex. 텍스트 데이터, 사진, 디지털 음악)

 

앙상블 학습 ensemble learning : 정형데이터를 다루는 데 가장 좋은 알고리즘

랜덤 포레스트 Random forest

여러 개의 결정 트리(Decision Tree)를 사용하여 데이터를 학습하고 예측하는 모델

여러 개의 결정 트리를 만들고, 각 트리의 예측을 종합하여 높은 정확도의 예측을 수행

 

 부트스트랩 샘플링 (Bootstrap sampling)

랜덤 포레스트는 원본 데이터에서 랜덤하게 중복을 허용(뽑은 데이터를 다시 넣어서 랜덤하게 뽑음)하여 샘플을 선택하고

이렇게 만들어진 부트스트랩 샘플을 사용하여 각 결정 트리를 학습한다

이로써 각 트리는 서로 다른 데이터 부분 집합에 대해 학습

 

분류모델(샘플을 몇개의 클래스 중 하나로 분류하는 문제): RandomForestClassifier 

전체 특성 개수의 제곱근만큼의 특성 선택

- 특성의 일부를 랜덤하게 선택하여 결정트리를 훈련하기 때문에 하나의 특성에 과도하게 집중하지 않고

좀 더 많은 특성이 훈련에 기여할 기회를 얻어 과대적합을 줄임

-  OOB (out of bag 부스트트랩 샘플에 포함되지 않고 남는 샘플)을 이용해 부스트트랩 샘플로 훈련한 결정 트리를 평가로

교차검증을 대신하여 훈련세트에 더 많은 샘플 사용 가능

 

회귀모델(임이의 어떤 숫자를 예측하는 문제): RandomForestRegressor

각 트리의 예측값의 평균을 최종 예측값으로 사용

 

주요 매개변수:

  • n_estimators: 랜덤 포레스트 안에 포함될 결정 트리의 개수를 지정
  • criterion: 노드 분할 기준을 지정
  • max_depth: 각 결정 트리의 최대 깊이를 제한. 트리의 깊이를 제한하여 과적합을 방지 가능
  • min_samples_split: 노드를 분할하기 위한 최소 샘플 수를 지정. 작은 값은 노드가 더 분할되어 더 복잡한 모델을 생성
  • min_samples_leaf: 리프 노드가 가져야 할 최소 샘플 수를 지정
  • max_features: 각 노드에서 사용할 특성의 최대 개수 또는 비율을 지정
  • random_state: 랜덤 시드를 고정하여 결과를 재현
from sklearn.model_selection import cross_validate #교차 검증
from sklearn.ensemble import RandomForestClassifier #랜덤포레스트 분류모델

rf = RandomForestClassifier(n_jobs=-1, random_state=42)# 랜덤포레스트 객체 생성
scores = cross_validate(rf, train_input, train_target, return_train_score=True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))

엑스트라 트리 Extra tree

랜덤 포레스트(Random Forest)와 유사한 방식으로 동작하는 모델

여러 개의 결정 트리(Decision Tree)를 학습하고 그들의 예측을 결합하여 높은 성능의 모델을 만들어냄

 

- 부스트트랩 샘플을 사용하지 않고 결정트리를 만들 때 전체 훈련 세트를 사용 (노드는 무작위로 분할)

- 더 많은 다양성을 가진 모델을 생성하게 되어, 특히 데이터가 작거나 과적합을 방지하고자 할 때 유용

 

분류모델 : ExtraTreesClassifier

 회귀모델 : ExtraTreesRegressor

from sklearn.ensemble import ExtraTreesClassifier

et = ExtraTreesClassifier(n_jobs=-1, random_state=42)
scores = cross_validate(et, train_input, train_target, return_train_score=True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))

 

그레이디언트 부스팅 Gradiednt boosting

깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙살블 하는 방법

 

분류모델 : GradientBoostingClassifier 

- 깊이가 3인 결정트리를 100개 사용 

- 깊이가 얕은 결정 트리를 사용해 과대적합에 강하고 높은 일반화 성능

-  로지스틱 손실 함수의 그레이디언트(기울기)를 활용하여 가장 낮은 곳을 찾아내려오면서(경사 하강법) 모델 성능 향상시킴

- n_jobs가 없음.랜덤포레스트 보다 성능은 높지만 훈련속도가 느림

 

회귀모델 : GradientBoostingRegressor

from sklearn.ensemble import GradientBoostingClassifier
gb = GradientBoostingClassifier(random_state=42)
scores = cross_validate(gb, train_input, train_target, return_train_score=True, n_jobs=-1) # 훈련세트, 교차검증
print(np.mean(scores['train_score']), np.mean(scores['test_score']))

히스토그램 기반 그레이디언트 부스팅 Histogram-based gradient boosting

입력 특성을 256개의 구간으로 나눔 ( 최적의 분할을 빠르게 찾을 수 있음)

256개의 구간 중에서 하나를 떼어 놓고 누락된 값을 위해 사용하기 때문에 누락된 특성으로 전처리 필요가 없음

 

분류모델: HistGradientBoostingClassifier

- 트리의 개수를 지정하는데 n_estimators 대신 반복 횟수를 지정하는 max_iter 사용

 

회귀모델: HistGradientBoostingRegressor

from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGradientBoostingClassifier

# 성능을 높이려면 max_iter 매개변수 이용
hgb = HistGradientBoostingClassifier(random_state=42)
scores = cross_validate(hgb, train_input, train_target, return_train_score=True)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))

XGBoost

- 히스토그램 기반 그레이디언트 부스팅을 구현한 라이브러리

- tree_method = 'hist' 로 지정하면 히스토그램 기반 그레이티언트 알고리즘 지원

 

LightGBM

- 마이크로소프에서 만든 라이브러리

- 빠르고 최신 기술을 많이 적용하고 있어 인기가 높음