RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (72) N
    • Study Note (37) N
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (22) N
      • 머신러닝 (4) N
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/머신러닝

머신러닝의 꽃, 앙상블과 부스팅 (XGBoost, LightGBM) 완전 정복

2025. 12. 19. 17:34

오늘 정리할 내용은 "실전에서 성능을 극한으로 끌어올리는 기술"입니다. 단일 모델 하나만 쓰는 것이 아니라, 여러 모델을 합쳐서(Ensemble) 더 똑똑한 AI를 만드는 과정을 배워봅니다.

 

1. 기본기를 다지는 단일 모델 4대장

앙상블로 넘어가기 전, 가장 기본이 되는 단일 모델들을 먼저 이해해야 합니다.

① KNN (K-Nearest Neighbor)

  • 컨셉: "유유상종". 새로운 데이터가 들어오면 가장 가까운 이웃 $k$개를 봅니다.
  • 특징: 학습이 따로 필요 없고 단순하지만, 데이터가 많아지면 계산 속도가 느려집니다. (게으른 학습)

② 로지스틱 회귀 (Logistic Regression)

  • 컨셉: 이름은 회귀지만 사실은 '분류' 모델입니다. 선형 회귀 결과에 시그모이드(Sigmoid) 함수를 씌워 0~1 사이의 확률을 뱉어냅니다.
  • 의료 활용: "이 환자가 암일 확률은 0.8입니다." (해석이 매우 명확함)

③ SVM (Support Vector Machine)

  • 컨셉: 두 클래스(환자군 vs 대조군)를 나누는 가장 넓은 도로(Margin이 최대가 되는 결정 경계)를 찾습니다.
  • 특징: 데이터가 적을 때도 성능이 좋지만, 대용량 데이터에는 적합하지 않습니다.

④ 의사결정나무 (Decision Tree)

  • 컨셉: 스무고개 놀이와 같습니다. "열이 38도 이상인가? (Yes/No)" 질문을 반복하며 가지치기를 합니다.
  • 장점: 화이트박스 모델이라 과정을 눈으로 볼 수 있어 의사 선생님들께 설명하기 가장 좋습니다.

 

2. 집단지성의 힘: 앙상블(Ensemble)

"한 명의 천재보다 열 명의 범재가 낫다." 앙상블은 여러 개의 모델(Weak Learner)을 결합하여 하나의 강력한 모델(Strong Learner)을 만드는 기법입니다. 크게 배깅(Bagging)과 부스팅(Boosting)으로 나뉩니다.

① 배깅 (Bagging) & 랜덤 포레스트 (Random Forest)

  • 원리: 데이터를 여러 번 복원 추출(Bootstrap)해서 여러 개의 나무를 심고, 다수결(Voting)로 결과를 정합니다.
  • 특징: 각 나무들이 독립적으로 학습하므로 병렬 처리가 가능하고, 과적합(Overfitting)을 잘 막아줍니다. (분산 감소)
  • 비유: 여러 명의 의사가 각자 진료하고 투표해서 병명을 결정하는 것과 같습니다.

② 부스팅 (Boosting)

  • 원리: "오답 노트"를 만드는 과정입니다. 이전 모델이 틀린 문제(데이터)에 가중치(Weight)를 주어 다음 모델이 집중적으로 학습하게 합니다.
  • 특징: 순차적으로 학습하므로 속도는 느리지만, 예측 성능은 배깅보다 뛰어납니다. (편향 감소)
  • 비유: 1차 진료 의사가 못 찾은 병을 2차 전문의가 보고, 그래도 못 찾으면 3차 명의가 보는 식입니다.

 

3. 부스팅의 진화: GBM, XGBoost, LightGBM

캐글(Kaggle)이나 데이콘 같은 경진대회 우승자들은 대부분 이 모델들을 씁니다.

① GBM (Gradient Boosting Machine)

  • 경사하강법(Gradient Descent)을 이용해 잔차(Residual, 오차)를 줄여나가는 방식입니다. 성능은 좋지만 시간이 오래 걸리고 과적합 위험이 있습니다.

② XGBoost (eXtreme Gradient Boosting)

  • 혁신: GBM의 단점을 보완하기 위해 규제(Regularization) 기능을 넣어 과적합을 막고, 병렬 처리를 지원해 속도를 획기적으로 높였습니다.
  • 성장 방식: Level-wise (트리의 균형을 맞추며 층별로 성장). 안정적이지만 깊어지면 느려질 수 있습니다.

③ LightGBM

  • 혁신: XGBoost보다 더 가볍고 빠릅니다. 대용량 데이터를 처리할 때 유리하며 메모리를 적게 씁니다.
  • 성장 방식: Leaf-wise (균형을 무시하고 오차가 큰 쪽지(Leaf)만 깊게 팜). 속도가 빠르지만 데이터가 적으면 과적합될 수 있습니다.

4. [이론 심화] 편향(Bias)과 분산(Variance)

좋은 모델이란 무엇일까요? 과녁 그림을 기억하세요.

  • 편향(Bias)이 높다: 영점이 안 맞음 (Underfitting). 너무 단순한 모델.
  • 분산(Variance)이 높다: 탄착군이 퍼짐 (Overfitting). 데이터에 너무 민감한 복잡한 모델.
  • 목표: Low Bias, Low Variance를 지향해야 합니다.
    • 배깅(Random Forest)은 분산을 줄여주고, 부스팅(XGBoost)은 편향을 줄여줍니다.

5. [실습] Python으로 XGBoost 구현하기

의료 데이터(유방암 진단)를 사용하여 가장 강력한 모델인 XGBoost를 돌려보겠습니다. (참고: xgboost 라이브러리 설치가 필요할 수 있습니다: pip install xgboost)

import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score, roc_auc_score

# 1. 데이터 로드
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target # 0: 악성, 1: 양성

# 2. 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. XGBoost 모델 생성 및 학습
# n_estimators: 부스팅 반복 횟수 (나무 개수)
# learning_rate: 학습률 (오차를 얼마나 반영할지)
# max_depth: 나무의 깊이 (과적합 방지용)
model = XGBClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
model.fit(X_train, y_train)

# 4. 예측 및 평가
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1] # ROC-AUC용 확률값

print(f"정확도(Accuracy): {accuracy_score(y_test, y_pred):.4f}")
print(f"ROC-AUC 점수: {roc_auc_score(y_test, y_prob):.4f}")

# 5. 변수 중요도 (Feature Importance) 확인
# 의료진에게 "왜 암이라고 예측했나요?"를 설명할 때 필수!
import matplotlib.pyplot as plt
from xgboost import plot_importance

plt.figure(figsize=(10, 8))
plot_importance(model, max_num_features=10) # 상위 10개 중요 변수 시각화
plt.show()

 

[결과 해석] XGBoost가 알려주는 유방암 진단의 핵심 단서

코드를 실행하면 위와 같은 텍스트 결과와 그래프를 얻을 수 있습니다. 의료 데이터 분석가로서 이 숫자와 그림이 의미하는 바를 해석해 보겠습니다.

 

1. 모델 성능 평가 (Performance Evaluation)

  • 정확도 (Accuracy): 0.9561 (약 95.6%)
    • 전체 환자 중 약 95.6%의 케이스를 정확하게 진단했습니다. 꽤 높은 수치이지만, 의료 데이터에서는 이것만으로 안심할 수 없습니다.
  • ROC-AUC 점수: 0.9931
    • 이 점수가 핵심입니다. 1.0에 가까울수록 완벽한 모델인데, 0.9931이라는 것은 이 모델이 악성(암)과 양성(정상)을 구분하는 능력이 거의 탁월하다(Excellent)는 뜻입니다.
    • 임상적으로 매우 신뢰할 수 있는 수준의 분류 성능을 보여줍니다.

2. 변수 중요도 분석 (Feature Importance)

그래프는 XGBoost 모델이 "암을 진단할 때 어떤 특징을 가장 중요하게 봤는지"를 보여줍니다. (F-score: 해당 변수가 의사결정 트리를 나눌 때 사용된 횟수)

  • 1위: worst texture (점수: 54.0)
    • 가장 압도적인 중요도를 가진 변수입니다.
    • 해석: 세포 핵의 질감(Texture)이 가장 거칠고 불규칙한 부분(worst)의 수치가 암을 판별하는 데 결정적인 역할을 했습니다.
  • 2위: area error (점수: 43.0)
    • 세포 면적(area)의 오차 범위가 클수록, 즉 세포 크기가 들쭉날쭉할수록 위험도가 높다고 판단했습니다.
  • 3위: mean texture (점수: 42.0)
    • 평균적인 질감 수치 또한 중요한 진단 기준이 되었습니다.

이것이 바로 XGBoost가 사랑받는 이유, '설명 가능한 AI(XAI)'의 시작입니다.

 

Analyst's Note

의료 현장에서는 모델의 설명력(Interpretability)이 중요해서 의사결정나무나 로지스틱 회귀를 선호하기도 합니다. 하지만 예측의 정확도가 생명인 경우에는 XGBoost나 LightGBM이 압도적입니다.

이때는 위 코드의 마지막 부분처럼 변수 중요도(Feature Importance)를 뽑아서, "이 모델은 환자의 백혈구 수치와 혈압을 가장 중요하게 보고 위험하다고 판단했습니다"라고 설명하면 의료진을 설득하기 훨씬 수월해집니다.

 

 

'Study Note > 머신러닝' 카테고리의 다른 글

"모든 변수가 다 중요할까?" 피처 중요도(Feature Importance)로 모델 다이어트하기  (0) 2025.12.20
내 모델 믿어도 될까? 교차 검증(Cross Validation) 완벽 가이드  (0) 2025.12.20
[ML 기초] 통계가 머신러닝이 되는 순간: 나이브 베이즈와 ML 프로세스  (0) 2025.12.19
    'Study Note/머신러닝' 카테고리의 다른 글
    • "모든 변수가 다 중요할까?" 피처 중요도(Feature Importance)로 모델 다이어트하기
    • 내 모델 믿어도 될까? 교차 검증(Cross Validation) 완벽 가이드
    • [ML 기초] 통계가 머신러닝이 되는 순간: 나이브 베이즈와 ML 프로세스
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바