梯度提升機器

R 中的監督式學習:回歸

Nina Zumel and John Mount

Win-Vector, LLC

梯度提升的運作方式

  1. 對資料擬合一棵淺層樹 $T_1$:$M_1 = T_1$
R 中的監督式學習:回歸

梯度提升的運作方式

  1. 對資料擬合一棵淺層樹 $T_1$:$M_1 = T_1$
  2. 對殘差擬合一棵樹 T_2。找到 $\gamma$,使得 $M_2 = M_1 + \gamma T_2$ 最能擬合資料
R 中的監督式學習:回歸

梯度提升的運作方式

正規化:學習率 $\eta \in(0,1)$

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

  • $\eta$ 較大:學習較快
  • $\eta$ 較小:過度擬合風險較低
R 中的監督式學習:回歸

梯度提升的運作方式

  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 中的監督式學習:回歸

用交叉驗證防止過度擬合

訓練誤差持續下降,但測試誤差沒有

R 中的監督式學習:回歸

最佳做法(搭配 xgboost())

  1. 以大量回合(樹數)執行 xgb.cv()
R 中的監督式學習:回歸

最佳做法(搭配 xgboost())

  1. 以大量回合(樹數)執行 xgb.cv()
  2. xgb.cv()$evaluation_log:記錄每回合的估計 RMSE。
    • 找出讓估計 RMSE 最小的樹數:$n_{best}$
R 中的監督式學習:回歸

最佳做法(搭配 xgboost())

  1. 以大量回合(樹數)執行 xgb.cv()
  2. xgb.cv()$evaluation_log:記錄每回合的估計 RMSE。
    • 找出讓估計 RMSE 最小的樹數:$n_{best}$
  3. 執行 xgboost(),設定 nrounds = $n_{best}$
R 中的監督式學習:回歸

範例:腳踏車租借模型

先準備資料

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 中的監督式學習:回歸

用 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 中的監督式學習:回歸

找出合適的樹數

elog <- as.data.frame(cv$evaluation_log)
(nrounds <- which.min(elog$test_rmse_mean))
78
R 中的監督式學習:回歸

執行 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 中的監督式學習:回歸

用 xgboost() 模型做預測

準備 2 月資料並進行預測

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

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

模型在 2 月資料的表現

模型 RMSE
Quasipoisson 69.3
隨機森林 67.15
Gradient Boosting 54.0
R 中的監督式學習:回歸

視覺化結果

2 月份預測值 vs. 實際腳踏車租借量

2 月份預測值與逐時腳踏車租借量

R 中的監督式學習:回歸

一起來練習吧!

R 中的監督式學習:回歸

Preparing Video For Download...