[250401화245H] 결정 트리, 앙상블, 부스팅, 테일러 급수

윤승호·2025년 4월 1일

돌아온 지옥의 이론 시간. 그래도 모델을 구현해 본 후에 새로운 모델을 배우니 전반적인 흐름은 눈에 보인다. 문제는 수학 공식에 나오는 기호들인데,,, 이건 날 잡고 한번 파긴 해야겠다.

학습시간 09:00~01:00(당일16H/누적245H)

◆ 오늘의 깨달음

  • 트리 모델은 스케일링을 하지 않는다.

  • 트리 계열 알아두기!

항목결정트리랜덤포레스트그래디언트 부스팅
구조단일 트리여러 트리 병렬여러 트리 순차
과적합발생 쉬움줄어듦조절 가능
하파 예시max_depth, criterionn_estimators, max_featureslearning_rate, n_estimators
손실 함수Gini, Entropy동일log loss, MSE 등
최적화X (그리디)X (병렬 분산)O (경사하강법)

◆ 학습내용

1. 결정트리(Decision Tree)

(1) 개념 요약

  • 데이터를 분할하는 "스무고개" 같은 구조
  • 트리 형태로 질문을 이어가며 분류/예측

(2) 트리의 구성 요소

  • 루트 노드(Root): 트리의 시작
  • 내부 노드(Internal Node): 조건에 따라 데이터를 분기
  • 리프 노드(Leaf): 예측값이 나오는 끝 노드
  • 에지(Edge): 노드 간 연결선

(3) 트리 관련 용어

  • 레벨(Level): 트리에서의 깊이
  • 차수(Degree): 자식 노드 수
  • 높이(Height): 루트에서 리프까지의 최대 거리

(4) 좋은 분기 조건 찾기

  • Information Gain: 분기 전후의 불순도 차이
  • Gini Impurity: 지니 불순도 (0 = 순수, 1 = 혼합)
  • Entropy: 정보의 불확실성

(5) Information Gain 계산 예시

  1. 부모 노드의 불순도 계산 (Gini or Entropy)
  2. 자식 노드 각각의 불순도 계산
  3. 자식 노드들의 가중 평균 계산
  4. 정보 이득 = 부모 - 자식 가중 평균

(6) 과적합 문제와 해결

  • 문제: 깊은 트리는 훈련 데이터를 과도하게 학습함
  • 해결: 가지치기(Pruning)
    • max_depth: 최대 깊이 제한
    • min_samples_split: 분할 최소 샘플 수
    • min_impurity_decrease: 최소 불순도 감소량

(7) 예측 방식

  • 분류: 리프 노드 내 최빈값 사용
  • 회귀: 리프 노드 내 평균값 사용

(8) Feature Importance

  • 정의: 각 특성이 불확실성을 얼마나 줄였는지
  • 측정 방식: 평균 Gini 감소량, 정보 이득 누적

(9) 코드 예시 (분류)

from sklearn.tree import DecisionTreeClassifier

m = DecisionTreeClassifier(
    criterion='gini',    # 불순도 기준: gini, entropy
    min_samples_split=2, # 노드 분할 최소 샘플 수
    min_samples_leaf=2,  # 리프 노드 최소 샘플 수
    max_features=None,   # 사용할 특성 수(None은 전체)
    max_depth=3,         # 트리의 최대 깊이
    max_leaf_nodes=None, # 리프 노드의 최대 개수
    random_state=42      # 랜덤 시드 고정
)
m.fit(X_train, y_train)

분류는 불순도 기준으로 criterion을 나눈다.

  • "gini" → 지니 불순도
  • "entropy" → 엔트로피

회귀는 오차(손실) 기준으로 criterion을 나눈다.

  • "squared_error" → 평균 제곱 오차 (MSE)
  • "absolute_error" → 평균 절대 오차 (MAE)

2. 앙상블(Ensemble)

(1) 개념 요약

  • 여러 개의 모델을 결합해서 예측 성능을 높이는 방법
  • 단일 결정트리보다 더 강력하고 안정적

(2) 주요 방식

A. 보팅 (Voting)

  • 여러 분류기의 결과를 조합
  • Hard Voting: 다수결
  • Soft Voting: 확률 평균

B. 배깅 (Bagging)

  • 데이터 샘플을 중복 추출 → 여러 모델 학습 → 평균/투표
  • 병렬 처리 가능
  • 대표: Random Forest

(랜덤 포레스트 코드 예시)

from sklearn.ensemble import RandomForestClassifier

m = RandomForestClassifier(
    n_estimators=100,       # 트리 개수
    max_depth=5,            # 최대 깊이
    max_features='sqrt',    # 사용할 특성 수
    bootstrap=True,         # 부트스트랩 샘플링 여부
    random_state=42         # 랜덤 시드 고정
)
m.fit(X_train, y_train)

# 분류&회귀 하파차이 없음

C. 부스팅 (Boosting)

  • 모델을 순차적으로 학습, 이전 모델의 오차 보완
  • 약한 학습기를 반복적으로 결합 → 강한 모델
  • 대표: Gradient Boosting, XGBoost, LightGBM

(Gradient Boosting 코드 예시)

from sklearn.ensemble import GradientBoostingClassifier

m = GradientBoostingClassifier(
    n_estimators=100,       # 트리 개수
    learning_rate=0.1,      # 학습률
    max_depth=3,            # 각 트리의 최대 깊이
    subsample=0.8,          # 데이터 샘플 비율
    random_state=42         # 랜덤 시드 고정
)
m.fit(X_train, y_train)

D. 스태킹 (Stacking)

  • 서로 다른 모델들을 조합하여 최종 예측 성능을 높이는 앙상블 기법
  • 보팅과 달리, 모델들의 예측값을 다시 학습 데이터로 사용하여 최종 예측을 수행
  • 1층(Base Learners): 다양한 알고리즘으로 각각 학습 (예: 로지스틱 회귀, SVM, 결정트리 등)
  • 2층(Meta Learner): 1층 모델들의 예측 결과를 입력으로 받아 학습 (보통 로지스틱 회귀, 랜덤포레스트 등 사용)
  • 모델 다양성이 클수록 효과가 좋음 (서로 다른 성격의 모델 조합 권장)
  • 예측력 높음, 특히 다양한 모델의 장점을 결합할 때 유리
  • 과적합 위험이 있음 → 반드시 교차 검증 기반으로 예측값 생성 필요
  • 구현이 상대적으로 복잡하지만, 잘 쓰면 대회급 성능을 낼 수 있음
from sklearn.ensemble import StackingClassifier, StackingRegressor
from sklearn.linear_model import LogisticRegression, LinearRegression
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.svm import SVR, SVC
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor

# 분류용 스태킹
clf_base = [
    ('dt', DecisionTreeClassifier()),
    ('svc', SVC(probability=True)),
    ('rf', RandomForestClassifier())
]
clf_meta = LogisticRegression()
clf_model = StackingClassifier(estimators=clf_base, final_estimator=clf_meta, cv=5)

# 회귀용 스태킹
reg_base = [
    ('dt', DecisionTreeRegressor()),
    ('svr', SVR()),
    ('rf', RandomForestRegressor())
]
reg_meta = LinearRegression()
reg_model = StackingRegressor(estimators=reg_base, final_estimator=reg_meta, cv=5)

(3) 요약

A. 결정트리

  • 구성 요소 (루트, 리프, 노드)
  • 불순도 지표 (Gini, Entropy)
  • 분기 기준 (Information Gain)
  • 과적합 문제와 가지치기
  • 귀 & 분류 예측 방식

B. 앙상블

  • 보팅 (Hard, Soft)
  • 배깅 → 랜덤 포레스트
  • 부스팅 → GBM, XGBoost, LightGBM
  • 스태킹 (메타모델??)
  • 특징 비교표 (구조, 하파, 최적화 등)

3. 부스팅 계열 정리

(1) 공통점

  • 모두 경사하강법(Gradient Descent) 기반이다
  • 오차(잔차)를 줄이기 위해 반복적으로 모델을 개선함
  • 현재 모델이 잘못 예측한 방향(= 경사)을 계산해서 그걸 보완하는 방향으로 다음 모델을 만듦
  • 모두 가중치 또는 오차 기반 학습을 한다
  • 대부분 앙상블을 통해 편향(bias)은 줄이되, 분산(variance)은 조절해야 하는 문제를 안고 있고, 이를 해결하기 위해 subsampling, learning rate, early stopping 같은 과적합 방지 기법을 공통적으로 채택하고 있다.

(2) 알고리즘별 특징

A. AdaBoost

  • Adaptive Boosting의 줄임말
  • 약한 모델(주로 Decision Tree stump)을 순차적으로 학습
  • 오답에 가중치 부여해서 다음 모델이 더 집중
  • sklearn에서 AdaBoostClassifier로 사용 가능

B. Gradient Boosting

  • 에이다부스트랑 비슷하지만,
  • 가중치 방식 대신, 오차를 잔차(residual)로 보고 Gradient Descent 방식으로 보정
  • 느리지만 성능 좋음
  • 문제점: Overfitting 위험
  • 해결책:
    • Subsampling: 전체 데이터 중 일부만 사용
    • Shrinkage (Learning rate): 후속 모델의 영향력 줄이기
    • Early Stopping: 검증 오차가 증가하면 학습 중단

C. XGBoost

  • Gradient Boosting의 진화형! (eXtreme Gradient Boosting)
  • 핵심 장점:
    • 빠름 (병렬 처리)
    • 정규화 포함 → 과적합 방지
    • 결측치 자동 처리
  • 실전 대회에서 자주 사용되는 최강 모델 중 하나

D. LightGBM

  • 마이크로소프트가 만든 XGBoost보다 더 빠른 버전
  • 큰 데이터에 강함
  • Leaf-wise 트리 성장 → 더 깊게 파지만 위험할 땐 과적합
  • 빠르고 정확하지만 조심해서 튜닝 필요

E. CatBoost

  • Yandex(러시아 구글)이 만든 부스팅
  • 범주형 변수 자동 처리 가능! (One-Hot 안 해도 됨)
  • 튜닝 덜 해도 좋은 성능
  • 문자 데이터 많은 실무에서 인기 많음

4. 테일러 급수(Taylor Series)

(1) 정의

  • 복잡한 함수를 간단한 다항식으로 근사하는 방법
  • 특정 점 주변에서 함수의 값을 근사하기 위해 사용됨
  • 함수의 값, 기울기(1차 미분), 곡률(2차 미분) 등을 이용해 점점 정밀한 근사를 수행

(2) 핵심 아이디어

  • 전체 함수를 보지 않고, 특정 지점의 정보를 바탕으로 함수의 형태를 흉내냄
  • 처음에는 직선(1차), 이후 곡선(2차, 3차, ...)으로 점점 정확하게 근사

(3) 필요한 조건

  • 함수가 연속적이어야 함
  • 최소한 두 번 이상 미분 가능해야 함 (XGBoost에서는 2차까지 사용)

(4) 머신러닝에서의 활용 (특히 XGBoost)

  • 손실 함수가 복잡할 경우, 계산 효율을 높이기 위해 테일러 급수로 근사
  • XGBoost는 손실 함수를 2차까지 근사하여, 최적 분할 조건 및 모델 업데이트 수행
    • 1차 미분: 기울기 (Gradient)
    • 2차 미분: 곡률 (Hessian)

(5) 사용 가능한 손실 함수 예

  • MSE, Log Loss, Cross Entropy 등
  • MAE는 미분 불연속 지점이 있어 사용 어려움

(6) 핵심 정리

  • 복잡한 함수를 계산 가능한 형태로 단순화
  • 지역 정보만으로도 전체 함수의 일부를 흉내낼 수 있음
  • 머신러닝 모델의 최적화 계산을 빠르고 안정적으로 만드는 데 기여
  • ✅ 2차 근사 가능한 손실 함수: MSE, Log Loss, Cross Entropy
  • ❌ 불가능하거나 복잡한 함수: MAE, Piecewise 함수들
profile
나는 AI 엔지니어가 된다.

0개의 댓글