logo

앙상블

앙상블 학습

  • 앙상블: 여러 모델의 예측을 결합하는 방법
  • 한 모델의 판단보다 여러 모델의 판단을 모아 안정성 향상
  • 분류에서는 다수결이나 확률 평균 사용
  • 회귀에서는 여러 예측값의 평균 사용
  • 종류
    • 배깅: 복원추출한 데이터로 모델들을 독립적으로 학습하고 예측 결합
    • 부스팅: 앞 모델의 오류를 보완하도록 모델들을 순서대로 학습
    • 스태킹: 여러 모델의 예측을 입력으로 받아 최종 모델이 결합 방법 학습

여러 모델의 결정 경계를 결합하는 앙상블 예시

왜 단일 모델보다 안정적인가

  • 단일 모델은 학습 데이터의 구성이나 잡음에 따라 예측 결과가 크게 달라질 수 있음
  • 서로 다른 모델의 오류가 완전히 같지는 않음
  • 여러 예측을 결합하면 우연한 오류를 줄일 수 있음
  • 여러 모델을 결합하면 학습 데이터가 달라졌을 때 예측 결과의 차이가 줄어들 수 있음

앙상블의 단점

  • 학습 시간과 자원 사용 증가: 여러 모델을 학습하므로 더 많은 시간과 메모리 필요
  • 예측 속도 저하: 여러 모델의 예측을 구하고 결합하는 과정에서 응답 시간 증가 가능
  • 해석의 어려움: 여러 모델의 판단이 결합되므로 최종 예측의 근거를 설명하기 어려워질 수 있음

실습 데이터: 데이터센터 장애 위험 예측

  • 현재 서버 상태로 1시간 이내 장애 발생 여부 예측
  • 9개 숫자형 입력 변수로 장애 발생 여부 분류
  • incident_next_hour는 0=정상, 1=장애 발생
컬럼 설명
cpu_util_pct CPU 사용률(%)
memory_util_pct 메모리 사용률(%)
disk_io_mb_s 초당 디스크 입출력량(MB/s)
request_rate_per_sec 초당 요청 수
p95_latency_ms 95번째 백분위 응답시간(ms)
packet_loss_pct 패킷 손실률(%)
recent_deployments_7d 최근 7일 배포 횟수
uptime_days 재시작 후 가동 일수
room_temp_c 서버실 온도(°C)
incident_next_hour 1시간 이내 장애 여부(0=정상, 1=장애 발생)

실습 준비

import pandas as pd
from sklearn.model_selection import train_test_split

df_server = pd.read_excel("datacenter_incident.xlsx")

df_server.head()
실행 결과
   cpu_util_pct  memory_util_pct  disk_io_mb_s  request_rate_per_sec  \
0          59.0             92.8         342.3                  1076   
1          43.5             42.7         289.4                   780   
2          29.3             51.4         234.1                   667   
3          12.9             48.7         166.9                   420   
4          66.6             53.8         281.4                   723   

   p95_latency_ms  packet_loss_pct  recent_deployments_7d  uptime_days  \
0           160.1             0.17                      3           83   
1           135.8             0.56                      1          167   
2           156.4             0.53                      3          365   
3           134.0             0.62                      2          160   
4           107.6             0.29                      1           61   

   room_temp_c  incident_next_hour  
0         26.5                   1  
1         18.0                   0  
2         22.1                   1  
3         22.5                   0  
4         26.8                   0  
df_server["incident_next_hour"].value_counts().sort_index()
실행 결과
incident_next_hour
0    671
1    329
Name: count, dtype: int64
  • 정상 671건, 장애 발생 329건

학습·테스트 데이터 분할

  • 학습 800건: 모델 학습
  • 테스트 200건: 학습에 쓰지 않은 데이터에서 정확도 평가
  • 배깅·부스팅·스태킹 실습에서 같은 분할 사용
X = df_server.drop(columns="incident_next_hour")
y = df_server["incident_next_hour"]

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,     # 전체의 20%를 테스트 데이터로 보관
    random_state=42,   # 세 앙상블 실습에서 같은 사례로 분할
    stratify=y,        # 정상과 장애의 비율 유지
)
X_train.shape  # 학습 데이터의 사례 수와 입력 변수 수
실행 결과
(800, 9)
X_test.shape  # 테스트 데이터의 사례 수와 입력 변수 수
실행 결과
(200, 9)

퀴즈

문제 1 / 3맞음: 0힌트: 0틀림: 0채점중: 0남음: 3

1시간 이내 장애 발생 여부를 예측하는 문제가 분류에 해당하는 이유는?

  • ○정답이 0=정상, 1=장애 발생이라는 두 범주이기 때문에
  • ○CPU 사용률과 응답시간이 연속적인 숫자이기 때문에
  • ○전체 데이터가 1,000건으로 고정되어 있기 때문에
  • ○모든 입력 변수의 평균을 계산할 수 있기 때문에

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.

Previous
ROC 곡선과 PR 곡선
Next
배깅