Python

[Python] 트리 앙상블

orin602 2025. 3. 11. 14:53

1. 랜덤 포레스트

 

데이터 준비

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
wine = pd.read_csv('https://bit.ly/wine_csv_data')
data = wine[['alcohol', 'sugar', 'pH']].to_vumpy()
target = wine['class'].to_numpy()
train_input, test_input, train_target, test_target = train_test_split(
    data, target, test_size = 0.2, random_state = 42)

 

랜덤 포레스트를 사용해서 훈련하기

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']))
print('테스트 세트 평균 정확도 :', np.mean(scores['test_score']))
  • RandomForestClassifier(n_jobs = -1, random_state = 42)
    • RandomForestClassifier : 랜덤 포레스트 모델을 사용해서 분류 작업 수행
    • n_jobs = -1 : 모든 CPU 코어를 사용해서 모델을 학습하고 예측
    • random_state = 42 : 무작위성을 고정해서 결과를 재현 가능하게 만듬
  • cross_validate() : 주어진 데이터를 여러 부분으로 나눠서 교차 검증 수행
    • rf : 사용 모델(랜덤 포레스트 분류기)
    • trian_input, train_target : 훈련 데이터와 훈련 목표 값
    • return_train_score = True : 훈련 세트에 대한 정확도 반환

훈련 세트에 과대적합

 

# 특성 중요도 출력하기
rf.fit(train_input, train_target)
print('특성 중요도 :', rf.feature_importances_)

특성 중요도 : 알콜도수(alcohol), 당도(sugar), pH 순

(머신러닝(3)에서 결정 트리의 중요도와 비교하면 당도 중요도가 감소, 알콜도수, ph의 중요도가 조금씩 상승)

>> 랜덤 포레스트는 하나의 특성에 집중하지 않고 다른 특성이 많이 참여할 기회를 갖도록 해줌.

 

# 부트스트랩 샘플에 포함되지 않고 남은 샘플 : oob(out of bag)샘플
# oob_score를 True로 설정하고 훈련한 결정트리 평가하기
rf = RandomForestClassifier(oob_score = True, n_jobs = -1, random_state = 42)
rf.fit(train_input, train_target)
print(rf.oob_score_)

oob 점수를 사용하면 교차 검증을 대신할 수 있어서 훈련 세트에 더 많은 샘플을 사용할 수 있음.


2. 엑스트라 트리

- 랜덤 포레스트와 유사한 앙상블 학습 방법 중 하나로 여러 개의 결정 트리를 결합하여 예측 성능을 향상시키는 모델

  • 랜덤 포레스트와의 차이점
    • 램덤 포레스트는 데이터 샘플(부트스트래핑) 후 무작위로 일부 특성을 선택해서 최적의 분할을 찾음.
    • 엑스트라 트리는 부트스트래핑을 사용하지 않고 전체 데이터를 활용하고, 특성의 분할 지점을 무작위로 선택.
  • 엑스트라 트리 특징
    • 부트스트래핑 미사용 : 훈련 데이터를 부트스트래핑(샘플 재추출)하지 않고 전체 데이터를 사용
    • 무작위 분할 : 랜덤 포레스트는 최적의 분할을 찾지만, 엑스트라 트리는 후보 특성에서 무작위로 분할 지점을 선택
    • 고속 학습 : 분할 기준을 랜덤하게 선택하기 때문에 연산량이 줄어 학습 속도가 빠름
    • 과적합 방지 : 랜덤성이 높아 과적합을 방지할 가능성이 있음
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']))
print('테스트 세트 평균 정확도 :', np.mean(scores['test_score']))

랜덤 포레스트와 비슷한 결과지만 랜덤하게 노드를 분할하여 계산 속도가 조금 빠름 == 장점

 

# 중요도 출력
et.fit(train_input, train_target)
print('특성 중요도 :', et.feature_importances_)


3. 그레디언트 부스팅

- 여러 개의 약한 학습기를 순차적으로 학습하여 점진적으로 성능을 개성하는 앙상블 학습 기법

  • 약한 학습기 : 일반적으로 결정 트리(Decision Tree)를 사용하지만, 다른 모델도 사용 가능
  • 순차적 학습(Boosting 방식)
    • 기존 모델의 오차를 보완하는 방식으로 새로운 모델을 추가하여 학습 진행
    • 기존 모델이 예측을 잘못한 샘플에 가중치를 더 줘서 학습하는 방식과는 다름
  • 손실 함수 최적화
    • 모델이 오차를 줄이는 방향으로 학습할 수 있도록 손실 함수를 기반으로 업데이트
    • 회귀 문제에서 일반적으로 평균제곱오차(MSE)를 사용, 분류 문제에서 로그손실(Log Loss,Cross-Entropy)을 사용
  • 그레디언트 기반 업데이트 : 손실 함수의 그레디언트(기울기)를 이용하여 잔차를 최소화하는 방향으로 새로운 트리를 추가
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']))
print('테스트 세트 평균 정확도 :', 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']))
print('테스트 세트 평균 정확도 :', np.mean(scores['test_score']))
  • n_estimators = 500 : 트리의 개수를 500개로 설정
    • 트리 개수가 많아지면 모델이 더 복잡해져서 성능이 향상
  • learning_rate = 0.2 : 학습률을 0.2로 설정해서 각 트리의 기여도 조절

>>> 엑스트라 트리보다 당도에 더 집중.


4. XGBoost(Extreme Gradient Boost)

  • 성능이 뛰어남
    • 정확도가 높음
    • 규제 기능 포함(L1, L2 정규화가 적용되어 과적합 방지 가능)
  • 빠른 학습 속도
    • CPU, GPU 병렬 연산 지원
    • 초기 분할(Pre-Sorting) 및 블록 구조 최적화 : 트리 생성 속도 향상
  • 다양한 기능 지원
    • 조기 종료(Early Stopping) : 일정 반복(epoch) 동안 성능 향상이 없으면 학습을 중지하여 불필요한 연산을 방지
    • 결측값 자동 처리 : 누락된 값을 자동으로 예측하여 처리
# XGBoost를 사용해서 와인 데이터 교차 검증 확인하기
# XGBoost 설치 필요 : pip install xgboost
from xgboost import XGBClassifier
xgb = XGBClassifier(tree_method = 'hist', random_state = 42)
scores = cross_validate(xgb, train_input, train_target, return_train_score = True, n_jobs = -1)
print('훈련 세트 평균 정확도 :', np.mean(scores['train_score']))
print('테스트 세트 평균 정확도 :', np.mean(scores['test_score']))


5. LightGBM(Light Gradient Boosting)

  • 속도가 매우 빠름
    • 히스토그램 기반 학습 : 기존 XGBoost보다 트리를 빠르게 생성함
    • 리프 단위(Tree Leaf-wise) 성장 방식 : 트리 깊이를 최적화해서 계산 속도를 높임
  • 높음 정확도
    • Gradient Boosting 계열 중에서 높은 성능을 보임
    • 조기 종료, L1/L2 정규화 등의 기능을 포함하여 과적합 방지
  • 대규모 데이터에 적합
    • GPU 지원 및 병렬 처리로 대량의 데이터셋을 빠르게 학습이 가능
    • 카테고리형 데이터도 직접 처리할 수 있음
#LightGBM 설치 필요 : pip install lightgbm
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']))
print('테스트 세트 평균 정확도 :', np.mean(scores['test_score']))


  • 랜덤 포레스트(Random Forest) : 다수의 결정 트리를 앙상블해서 예측하는 방법.
    • 훈련 세트 평균 정확도 : 0.997 / 테스트 세트 평균 정확도 : 0.890
    • 각 트리는 무작위 샘플링된 데이터로 훈련되고, 예측 시 각 트리의 예측을 평균하거나 다수결로 결합한다.
    • 장점
      • 과적합에 강하고, 일반화 성능이 좋음
      • 변수 중요도를 제공하여 모델 해석 가능
      • 병렬 처리가 가능하여 훈련 속도가 빠름
    • 단점
      • 예측 속도가 다소 느릴 수 있음
      • 메모리 사용량이 많아 대규모 데이터에서 비효율적
  • 엑스트라 트리(Extra Trees)
    • 결정 트리의 분할을 더 무작위화 해서 트리 훈련의 다양성을 높임 >> 예측 성능을 높이는 효과
    • 훈련 세트 평균 정확도 : 0.997 / 테스트 세트 평균 정확도 : 0.889
    • 장점
      • 훈련 속도가 빠름
      • 과적합을 줄이기 위해 무작위성을 도입
      • 상대적으로 적은 파라미터로 모델의 성능을 잘 끌어냄
    • 단점
      • 결정 트리의 무작위성이 과도하면 성능 저하가 발생
      • 모델 해석이 어려움
  • 그레디언트 부스팅(Gradient Boosting) : 단계적으로 트리를 추가하여 이전 트리의 오차를 보정하는 방식
    • 훈련 세트 평균 정확도 : 0.888 / 테스트 세트 평균 정확도 : 0.872
    • 장점
      • 강력한 예측 성능을 발휘하며 다양한 유형의 데이터에 잘 적응함
      • 과적합을 방지하는 튜닝 파라미터가 많음
    • 단점
      • 훈련 속도가 느림(많은 트리를 생성해서)
      • 하이퍼파라미터 튜닝이 상당히 까다롭고 시간이 많이 걸림
  • XGBoost : 그레디언트 부스팅을 확장한 라이브러리
    • 훈련 세트 평균 정확도 : 0.956 / 테스트 새트 평균 정확도 : 0.878
    • 효율적이고 빠른 학습이 가능하며, 정규화와 과적합 방지에 특화
    • 장점
      • 훈련 속도가 빠르고 성능이 뛰어남
      • 병렬 학습, GPU 가속 지원으로 속도가 매우 빠름
      • 하이퍼파라미터 튜닝을 통해 성능 최적화 가능
    • 단점
      • 모델 해석이 어려움
      • 튜닝이 잘못되면 과적합 발생
  • LightGBM : 히스토그램 기반의 그레디언트 부스팅 알고리즘
    • 훈련 세트 평균 정확도 : 0.936 / 테스트 세트 평균 정확도 : 0.880
    • 데이터의 크기가 매우 커도 빠르게 훈련할 수 있음
    • 리프 단위로 트리를 성장시켜서 더 적은 수의 트리로 높은 정확도를 달성할 수 있음
    • 장점
      • 빠른 학습 속도와 메모리 효율성
      • 대규모 데이터셋에 최적화
      • GPU 학습을 지원해 더 빠름
      • 카테고리형 변수에 대한 자동 처리 가능
    • 단점
      • 과적합 위헝미 있음
      • 리프 단위 성장 방식으로 트리 깊이가 길어질 수 있음 >> 적절한 튜닝이 필요

  • 랜덤 포레스트와 엑스트라 트리는 과적합을 방지하고 안정적인 성능을 발휘하는 앙상블 모델이지만, 훈련 속도가 느리고, 메모리 사용량이 많은 경우가 있다.
  • 그레디언트 부스팅, XGBoost, LightGBM은 높은 성능을 보이지만, 훈련 속도가 느리고 하이퍼파라미터 튜닝이 필요하다.
  • XGBoost와 LightGBM은 대규모 데이터셋에서 뛰어난 성능을 보여주고 훈련 속도와 효율성에서 장점이 있다.
    LightGBM은 대용량 데이터에 적합하고, XGBoost는 성능 최적화와 튜닝에 강점이 있다.
  • 모델 선택
    • 데이터 크기와 속도 고려 == LightGBM이 빠르고 효율적임
    • 해석 가능성 고려 == 랜덤 포레스트 or 엑스트라 트리가 유리함
    • 높은 예측 성능 == XGBoost or 그레디언트 부스팅

 

'Python' 카테고리의 다른 글

[Python] 신경망 모델 훈련  (0) 2025.03.14
[Python] 비지도 학습  (0) 2025.03.13
[Python] 머신러닝 (3)  (0) 2025.03.10
[Python] 머신러닝 (2)  (0) 2025.03.08
[Python] 머신러닝 (1)  (0) 2025.03.05