Notice
Recent Posts
Recent Comments
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

SYDev

Chapter 05-3: 트리의 앙상블 본문

KHUDA 4th/머신러닝 기초 세션

Chapter 05-3: 트리의 앙상블

시데브 2023. 8. 22. 03:32
앙상블 학습이 무엇인지 이해하고,
다양한 앙상블 학습 알고리즘을 실습을 통해 알아보자.

 

 

정형 데이터와 비정형 데이터

  • 정형 데이터(structured data): 구조화된 데이터로, 미리 정해진 구조에 따라 저장된 데이터이다. 엑셀의 스프레드 시트, csv나 데이터베이스의 테이블이 이에 속한다.
  • 반정형 데이터(semi-structured data): 구조에 따라 저장된 데이터지만, 정형 데이터와 달리 구조에 대한 설명이 내부에 존재한다. 보통 파일 형태로 저장되고, HTML, XML, JSON 문서나 웹 로그, 센서 데이터 등이 이에 속한다.
  • 비정형 데이터(unstructured data): 정해진 구조가 없이 저장된 데이터이다. 책의 글과 같은 텍스트 데이터, 디지털 카메라로 찍은 사진, 디지털 음악 등이 이에 속한다.

 

 

앙상블 학습

  • 앙상블 학습(ensemble learning): 여러 개의 분류기를 생성하고, 그 예측을 결합하여 보다 정확한 예측을 도출하는 기법으로, 강력한 하나의 모델을 사용하는 대신 약한 모델 여러 개를 조합하는 방식이다.
  • 정형 데이터를 다룰 때, 가장 뛰어난 성능을 보이는 알고리즘이다. 
  • 앙상블 학습은 보팅, 배깅, 부스팅의 세 가지 유형으로 나눌 수 있다.

 

보팅

  • 보팅(Voting): 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식
  • 서로 다른 알고리즘 여러 개를 결합하여 사용
  • 하드 보팅(Hard Voting): 다수의 분류기가 예측한 결과값이 최종 결과
  • 소프트 보팅(Soft Voting): 모든 분류기가 예측한 값의 결정 확률 평균을 구한 뒤 가장 확률 높은 레이블 값이 최종 결과

출처: http://www.dinnopartners.com/__trashed-4/

 

배깅

  • 배깅(Bootstrap AGGregatING; Bagging): 데이터 샘플링(Bootstrap)을 통해 모델을 학습시키고 결과를 집계(Aggregating)하는 방식
  • 부트스트랩(Bootstrap): 데이터셋의 샘플링 방식으로, 복원 추출을 허용하여(중복을 허용) 원 데이터 수만큼 뽑아낸 데이터셋 샘플링 방식
  • 모두 같은 유형의 알고리즘 기반의 분류기를 사용

출처: http://www.dinnopartners.com/__trashed-4/

 

부스팅

  • 부스팅(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
wine = pd.read_csv('https://bit.ly/wine_csv_data')
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): 표로 되어있는 도수 분포를 그림으로 나타낸 것이다.

출처: https://ko.wikipedia.org/wiki/%ED%9E%88%EC%8A%A4%ED%86%A0%EA%B7%B8%EB%9E%A8

 

  •  히스토그램 기반 그레이디언트 부스팅(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

참고자료

 

데이터 종류 - 정형 데이터, 반정형 데이터, 비정형 데이터

데이터 종류 일반적으로 데이터는 형태에 따라 정형 데이터, 반정형 데이터, 비정형 데이터로 분류할 수 있다. 정형 데이터(Structured Data) 정형 데이터는 구조화된 데이터, 즉 미리 정해진 구조에

computer-science-student.tistory.com

 

머신러닝 앙상블(Ensemble) 학습 – DINNO PARTNERS

1. 앙상블 학습이란? 앙상블 학습(Ensemble Learning)은 여러 개의 분류기를 생성하고, 그 예측을 결합함으로써 보다 정확한 예측을 도출하는 기법을 말합니다. 강력한 하나의 모델을 사용하는대신 보

www.dinnopartners.com

 

[ML] 랜덤 포레스트(Random Forest) 모델 - ( 배깅 , 부트스트랩 , random subspace)

랜덤포레스트(Random Forest)는 앙상블 중 배깅의 대표적인 방법으로, Decision Tree에서의 overfitting의 위험을 줄일 수 있는 해결 방안으로 알려졌다. 그렇다면 먼저 앙상블은 무엇이고, 배깅은 무엇인

fish-tank.tistory.com

 

[인공지능][개념&실습] 트리의 앙상블(Ensemble)[2] - 엑스트라 트리(Random Forest)와 (+ 히스토그램 기반

결정 트리(Decision Tree)와 앙상블(Ensemble)에 대한 이론이 필요하신 분들은 아래 링크를 참조해주시기 바랍니다. [인공지능][개념] 분류(Classification) - 결정 트리(Decisioin Tree)와 가지치기(Pruning) : https:

itstory1592.tistory.com

 

7-5. 부스팅(Boosting) - 그레이디언트 부스팅(Gradient Boosting)

출처 : docs.paperspace.com/machine-learning/wiki/gradient-boosting 그레이디언트 부스팅(Gradient Boosting)이란 이전 예측기가 만든 잔여 오차(Residual Error)에 새로운 예측기를 학습시키는 기법이다. X = 2*np.random.rand

humankind.tistory.com

 

히스토그램 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 디지털 이미지 프로세싱에서 사용하는 히스토그램에 대해서는 컬러 히스토그램 문서를 참고하십시오. 히스토그램(histogram)은 표로 되어 있는 도수 분포를 정보

ko.wikipedia.org