梯度提升机

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() 模型做预测

准备二月数据并预测

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

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

模型在二月数据上的表现

模型 RMSE
准泊松 69.3
随机森林 67.15
梯度提升 54.0
R 中的监督学习:回归

结果可视化

预测 vs 实际租赁量(2 月)

预测与每小时租赁量(2 月)

R 中的监督学习:回归

开始练习吧!

R 中的监督学习:回归

Preparing Video For Download...