그래디언트 부스팅 머신

R로 하는 Supervised Learning: 회귀

Nina Zumel and John Mount

Win-Vector, LLC

그래디언트 부스팅의 원리

  1. 데이터에 얕은 트리 $T_1$ 적합: $M_1 = T_1$
R로 하는 Supervised Learning: 회귀

그래디언트 부스팅의 원리

  1. 데이터에 얕은 트리 $T_1$ 적합: $M_1 = T_1$
  2. 잔차에 트리 T_2 적합. 다음을 만족하는 $\gamma$ 탐색 $M_2 = M_1 + \gamma T_2$ 이 데이터에 최적 적합
R로 하는 Supervised Learning: 회귀

그래디언트 부스팅의 원리

정규화: 학습률 $\eta \in(0,1)$

$$ M_2 = M_1 + \eta \gamma T_2 $$

  • $\eta$가 클수록: 학습 속도 빠름
  • $\eta$가 작을수록: 과적합 위험 감소
R로 하는 Supervised Learning: 회귀

그래디언트 부스팅의 원리

  1. 데이터에 얕은 트리 $T_1$ 적합
    • $M_1 = T_1$
  2. 잔차에 트리 T_2 적합
    • $M_2 = M_1 + \eta \gamma_2 T_2$
  3. 종료 조건 충족까지 (2) 반복

최종 모델:

$$ M = M_1 + \eta \sum \gamma_i T_i $$

R로 하는 Supervised Learning: 회귀

과적합 방지를 위한 교차 검증

훈련 오차는 계속 감소하지만 테스트 오차는 그렇지 않음

R로 하는 Supervised Learning: 회귀

모범 사례 (xgboost() 사용 시)

  1. 많은 수의 라운드(트리)로 xgb.cv()를 실행합니다.
R로 하는 Supervised Learning: 회귀

모범 사례 (xgboost() 사용 시)

  1. 많은 수의 라운드(트리)로 xgb.cv()를 실행합니다.
  2. xgb.cv()$evaluation_log: 라운드별 추정 RMSE 기록
    • 추정 RMSE를 최소화하는 트리 수 탐색: $n_{best}$
R로 하는 Supervised Learning: 회귀

모범 사례 (xgboost() 사용 시)

  1. 많은 수의 라운드(트리)로 xgb.cv()를 실행합니다.
  2. xgb.cv()$evaluation_log: 라운드별 추정 RMSE 기록
    • 추정 RMSE를 최소화하는 트리 수 탐색: $n_{best}$
  3. xgboost() 실행 시 nrounds = $n_{best}$ 설정
R로 하는 Supervised Learning: 회귀

예제: 자전거 대여 모델

데이터 전처리

treatplan <- designTreatmentsZ(bikesJan, vars)
newvars <- treatplan$scoreFrame %>%
     filter(code %in% c("clean", "lev")) %>%
     use_series(varName)

bikesJan.treat <- prepare(treatplan, bikesJan, varRestriction = newvars)

xgboost() 입력:

  • 입력 데이터: as.matrix(bikesJan.treat)
  • 결과 변수: bikesJan$cnt
R로 하는 Supervised Learning: 회귀

xgboost() / xgb.cv()로 모델 훈련

cv <- xgb.cv(data = as.matrix(bikesJan.treat), label = bikesJan$cnt,
              objective = "reg:squarederror",
              nrounds = 100, nfold = 5, eta = 0.3, max_depth = 6)

xgb.cv()xgboost()의 주요 입력값

  • data: 행렬 형태의 입력 데이터 ; label: 결과 변수
  • objective: 회귀 시 - "reg:squarederror"
  • nrounds: 최대 트리 수
  • eta: 학습률
  • max_depth: 개별 트리의 최대 깊이
  • nfold (xgb.cv() 전용): 교차 검증 폴드 수
R로 하는 Supervised Learning: 회귀

최적 트리 수 찾기

elog <- as.data.frame(cv$evaluation_log)
(nrounds <- which.min(elog$test_rmse_mean))
78
R로 하는 Supervised Learning: 회귀

최종 모델용 xgboost() 실행

nrounds <- 78

model <- xgboost(data = as.matrix(bikesJan.treat), 
                 label = bikesJan$cnt,
                 nrounds = nrounds,
                 objective = "reg:squarederror",
                 eta = 0.3,
                 max_depth = 6)
R로 하는 Supervised Learning: 회귀

xgboost() 모델로 예측

2월 데이터 전처리 및 예측

bikesFeb.treat <- prepare(treatplan, bikesFeb, varRestriction = newvars)

bikesFeb$pred <- predict(model, as.matrix(bikesFeb.treat))

2월 데이터 모델 성능

모델 RMSE
준포아송 69.3
랜덤 포레스트 67.15
그래디언트 부스팅 54.0
R로 하는 Supervised Learning: 회귀

결과 시각화

예측값 vs. 실제 자전거 대여량, 2월

예측값 및 시간별 자전거 대여량, 2월

R로 하는 Supervised Learning: 회귀

연습해 봅시다!

R로 하는 Supervised Learning: 회귀

Preparing Video For Download...