일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- LG Aimers
- LG Aimers 4th
- supervised learning
- 딥러닝
- 회귀
- GPT-4
- AI
- 티스토리챌린지
- 분류
- OpenAI
- regression
- 지도학습
- 머신러닝
- gpt
- LG
- Machine Learning
- Classification
- 해커톤
- ChatGPT
- deep learning
- 오블완
- PCA
- LLM
Archives
- Today
- Total
SYDev
Chapter 05-3: 트리의 앙상블 본문
앙상블 학습이 무엇인지 이해하고,
다양한 앙상블 학습 알고리즘을 실습을 통해 알아보자.
정형 데이터와 비정형 데이터
- 정형 데이터(structured data): 구조화된 데이터로, 미리 정해진 구조에 따라 저장된 데이터이다. 엑셀의 스프레드 시트, csv나 데이터베이스의 테이블이 이에 속한다.
- 반정형 데이터(semi-structured data): 구조에 따라 저장된 데이터지만, 정형 데이터와 달리 구조에 대한 설명이 내부에 존재한다. 보통 파일 형태로 저장되고, HTML, XML, JSON 문서나 웹 로그, 센서 데이터 등이 이에 속한다.
- 비정형 데이터(unstructured data): 정해진 구조가 없이 저장된 데이터이다. 책의 글과 같은 텍스트 데이터, 디지털 카메라로 찍은 사진, 디지털 음악 등이 이에 속한다.
앙상블 학습
- 앙상블 학습(ensemble learning): 여러 개의 분류기를 생성하고, 그 예측을 결합하여 보다 정확한 예측을 도출하는 기법으로, 강력한 하나의 모델을 사용하는 대신 약한 모델 여러 개를 조합하는 방식이다.
- 정형 데이터를 다룰 때, 가장 뛰어난 성능을 보이는 알고리즘이다.
- 앙상블 학습은 보팅, 배깅, 부스팅의 세 가지 유형으로 나눌 수 있다.
보팅
- 보팅(Voting): 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식
- 서로 다른 알고리즘 여러 개를 결합하여 사용
- 하드 보팅(Hard Voting): 다수의 분류기가 예측한 결과값이 최종 결과
- 소프트 보팅(Soft Voting): 모든 분류기가 예측한 값의 결정 확률 평균을 구한 뒤 가장 확률 높은 레이블 값이 최종 결과
배깅
- 배깅(Bootstrap AGGregatING; Bagging): 데이터 샘플링(Bootstrap)을 통해 모델을 학습시키고 결과를 집계(Aggregating)하는 방식
- 부트스트랩(Bootstrap): 데이터셋의 샘플링 방식으로, 복원 추출을 허용하여(중복을 허용) 원 데이터 수만큼 뽑아낸 데이터셋 샘플링 방식
- 모두 같은 유형의 알고리즘 기반의 분류기를 사용
부스팅
- 부스팅(Boosting): 여러 개의 분류기가 순차적으로 학습을 수행
- 이전 분류기의 예측이 틀린 데이터를 다음 분류기가 학습함으로써, 순차적으로 예측 정확도를 높여나가는 방식이다.
랜덤 포레스트
- 랜덤 포레스트(Random Forest): 배깅의 일종으로, 여러 개의 결정 트리 모델을 활용해 최종 예측을 만드는 방식이다.
- 배깅의 일종이기 때문에, 부트스트랩 샘플을 활용한다.
- Random Subspace: 결정 트리에서 원래는 모든 경우의 수를 고려하여 node의 분기를 나누는데, 랜덤 포레스트에서는 random하게 일부 특성을 선택하여 분기하는 결정 트리를 활용하며 이를 random subspace 방식이라 한다.
- random subspace 방식으로 개별 base 모델이 서로 독립적인 관계에 놓이고, 이로 인해서 랜덤 포레스트 모델의 성능이 향상된다.
- OOB(ouf of bag) 샘플: 부트스트랩 샘플을 만들 때, 이에 포함되지 않고 남는 샘플이며, 부트스트랩 샘플로 훈련한 결정 트리를 평가할 때 사용한다.
#학습할 데이터셋 준비
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
data=wine[['alcohol', 'sugar', 'pH']].to_numpy()
target=wine['class'].to_numpy()
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target=train_test_split(data, target, test_size=0.2, random_state=42)
#RandomForest 모델 학습
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']))
rf.fit(train_input, train_target)
print(rf.feature_importances_)
0.9973541965122431 0.8905151032797809
[0.23167441 0.50039841 0.26792718]
- cross_validate()의 매개변수 return_train_score를 True로 설정하면, 검증 점수뿐만 아니라 훈련 세트에 대한 점수도 같이 반환한다.
- RandomForest가 특성의 일부를 랜덤하게 선택하여 결정 트리를 훈련하기 때문에, 하나의 특성에 과도하게 집중하지 않고 더 많은 특성이 훈련에 기여할 기회를 얻는다. -> 과대적합의 해소
rf=RandomForestClassifier(oob_score=True, n_jobs=-1, random_state=42)
rf.fit(train_input, train_target)
print(rf.oob_score_)
0.8934000384837406
- OOB 점수를 사용하면, 교차 검증을 대신할 수 있어서 결과적으로 훈련 세트에 더 많은 샘플을 사용할 수 있다.
엑스트라 트리
- 엑스트라 트리(Extra Tree): 랜덤 포레스트와 매우 비슷하게 동작하나, 랜덤 포레스트와 달리 결정 트리를 학습할 때 부트스트랩 샘플이 아닌 전체 훈련 세트를 사용한다는 차이점이 있다.
- 랜덤 포레스트와 마찬가지로, 무작위로 일부 특성을 결정해서 분기를 한다. 하지만 엑스트라 트리는 랜덤 포레스트와 달리 최적의 분할 기준을 찾는 것이 아닌 임계값(분할 기준)을 정하는 데에도 무작위성을 주입한다.
- 랜덤하게 노드를 분할하기 때문에 계산 속도가 빠르다는 장점이 있다.
#ExtraTree 모델 학습
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']))
#특성 중요
et.fit(train_input, train_target)
print(et.feature_importances_)
0.9974503966084433 0.8887848893166506
[0.20183568 0.52242907 0.27573525]
그레이디언트 부스팅
- 그레이디언트 부스팅(Gradient Boosting): 앙상블 학습 부스팅의 일종으로서, gradient discent와 유사하게 결정 트리를 점진적으로 적용하여 최적의 모델을 찾아가는 방식이다.
- 이전 예측기가 만든 잔여 오차(Residual Error)에 새로운 예측기를 학습시킨다.
#GradientBoosting 모델 학습 (결정트리 개수 100개, 학습률 0.1이 디폴트)
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']))
#결정 트리 개수를 늘리고, 학습률도 증가
gb = GradientBoostingClassifier(n_estimators=500, learning_rate=0.2, 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']))
#특성 중요도
gb.fit(train_input, train_target)
print(gb.feature_importances_)
0.8881086892152563 0.8720430147331015
0.9464595437171814 0.8780082549788999
[0.15872278 0.68010884 0.16116839]
- 학습률이 클수록 과대적합을 억제한다.
- 매개변수 subsample이 1보다 작으면 훈련 세트 전체가 아닌 일부를 사용한다. -> 일부 샘플을 랜덤하게 선택하는 확률적 , 미니배치 경사 하강법과 유사
- gradient boosting이 random forest보다 일반적으로 성능이 좋지만, 순서대로 트리를 추가하기 때문에 훈련 속도가 느리다
히스토그램 기반 그레이디언트 부스팅
- 히스토그램(histogram): 표로 되어있는 도수 분포를 그림으로 나타낸 것이다.
- 히스토그램 기반 그레이디언트 부스팅(Histogram-based Gradient Boosting): 입력 특성을 256개로 나누어 노드를 분할할 때 최적의 분할을 빠르게 찾을 수 있는 gradient boostin
#Histogram-based GradientBoosting 모델 학습
from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGradientBoostingClassifier
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']))
0.9321723946453317 0.8801241948619236
#특성 중요도 확인
from sklearn.inspection import permutation_importance
hgb.fit(train_input, train_target)
result = permutation_importance(hgb, train_input, train_target, n_repeats=10, random_state=42, n_jobs=-1)
print(result.importances_mean)
result = permutation_importance(hgb, train_input, train_target, n_repeats=10, random_state=42, n_jobs=-1)
print(result.importances_mean)
hgb.score(test_input, test_target)
[0.08876275 0.23438522 0.08027708]
[0.05969231 0.20238462 0.049 ]
0.8723076923076923
- n_repeats: 특성을 랜덤하게 섞을 횟수
- 사이킷런 이외에도 histogram-based gradient boosting을 구현하는 라이브러리가 더 있다.
XGBoost, LightGBM
#라이브러리 XGBoost에서 histogram-based gradient boosting 구현
from xgboost import XGBClassifier
xgb = XGBClassifier(tree_method='hist', random_state=42)
scores = cross_validate(xgb, train_input, train_target, return_train_score=True)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))
#라이브러리 LightGMB에서 histogram-based gradient boosting 구현
from lightgbm import LGBMClassifier
lgb = LGBMClassifier(random_state=42)
scores = cross_validate(lgb, train_input, train_target, return_train_score=True, n_jobs=-1)
print(np.mean(scores['train_score']), np.mean(scores['test_score']))
0.9555033709953124 0.8799326275264677
0.935828414851749 0.8801251203079884
참고자료
- 박해선, <혼자 공부하는 머신러닝+딥러닝>, 한빛미디어(주), 2022.2.4
- https://computer-science-student.tistory.com/471
'KHUDA 4th > 머신러닝 기초 세션' 카테고리의 다른 글
Chapter 06-1,2: 군집 알고리즘 (0) | 2023.08.28 |
---|---|
[KHUDA 4th] 머신러닝 4주차 기초 세션 (08.16) (0) | 2023.08.25 |
Chapter 05-2: 교차 검증과 그리드 서치 (1) | 2023.08.22 |
Chapter 05-1: 결정 트리 (0) | 2023.08.22 |
[KHUDA 4th] 머신러닝 3주차 기초 세션 (08.16) (1) | 2023.08.19 |