5.2 Bagging【stanford-cs329p】


Bagging - Booststrap AGGrgratING

  • bagging时训练n个并行独立的模型
  • 做决策时如果是回归就把输出平均,分类就投票
  • 每个学习器通过bootstrap采样数据训练
    • 假设m个训练样本,随机选择其中m个样本放回,有些样本会重复,有些没拿到
    • 大概是1-1/e约等于63%的样本每次都会被采样到,剩下的就作为验证集

Bagging Code

1
2
3
4
5
6
7
8
9
10
11
12
13
class Bagging:
def __init__(self, base_learner, n_learners):
self.learners = [clone(base_learner) for _ in range(n_learners)]

def fit(self, X, y):
for learner in self.learners:
examples = np.random.choice(
np.arange(len(X)), int(len(X)), replace=True) #replace放回
learner.fit(X.iloc[examples, :], y.iloc[examples])

def predict(self, X):
preds = [learner.predict(X) for learner in self.learner]
return np.array(preds).mean(axis=0)

Random Forest

  • 假设使用决策树作为基础的学习器
  • 经常从每个学习器中采样子集特征,比如30%列,能避免一定的过拟合,增加每棵树之间的差异性

Unstable Learners

  • Bagging减少了方差,特别是对于不稳定的学习器

  • 为了简单我们假设回归的情况,给定基本事实 f 和基本学习器 h,bagging:$\hat{f}(x)=E[h(x)]$

  • 给定 $(E[x])^2\le E[x^2]$,方差=平方的期望-期望的平方,所以我们有
    $$
    (f(x)-\hat{f}(x))^2\le E[(f(x)-h(x))^2]\Leftrightarrow (E[h(x)])^2\le E[h(x)^2]
    $$
    Bagging在当基础学习器不稳定时减少了更多的方差

Summary

  • Bagging训练多个学习器时通过bootstrap采样,放回采样
  • Bagging减少了方差,特别是对于不稳定的学习器