Task05: 模型集成

  • 一般的集成学习方法
  • 深度学习中的集成方法

0. 在机器学习中的一般集成方法

模型集成即把同一学习任务的多个独立(弱)学习器的学习结果集合起来形成一个新的(强)学习器,完成最后的学习任务。

常见的有Stacking、Bagging和Boosting,以下是他们的一句话介绍:

策略 一句话理解
Stacking 众弱学习器学完了以后的输出作为强学习器的输入再继续学
Bagging 从原数据集中有放回采样出一群新数据集不同弱学习器分别学
Boosting 第一个弱学习器学不好的,给第二个继续学,以此类推并调整各联级学习器的权重

更详细的介绍可以参考这两篇博客和github代码讲解:

  • Zhihu: Eureka. 集成学习-Boosting,Bagging与Stacking.
  • Medium.com: Robert R.F. DeFilippi. Boosting, Bagging, and Stacking — Ensemble Methods with sklearn and mlens.
  • github.com: robertdefilippi/ensemble-bagging-boosting

1. 深度学习中的集成学习

策略 描述 特点
dropout 在每个训练批次中,通过随机让一部分的节点停止工作。同时在预测的过程中让所有的节点都其作用。 缓解过拟合,预测时增加模型精度
TTA 测试集数据扩增(Test Time Augmentation,简称TTA),在预测时候进行数据扩增,对同一个样本预测三次,然后对三次结果进行平均。 相当于对一张图片进行多角度学习
Snapshot 只训练了一个CNN模型时,使用cyclical learning rate进行训练模型,并保存精度比较好的一些checkopint,最后将多个checkpoint进行模型集成。 模型在不同的局部最优中徘徊,可以提高模型精度但是需要训练更长时间
# dropout,在激活函数后面加一句nn.Dropout(失活神经元比例)就好了
  ...
            nn.Conv2d(16, 32, kernel_size=(3, 3), stride=(2, 2)),
            nn.ReLU(), 
            nn.Dropout(0.25),
            nn.MaxPool2d(2),
  ...

# TTA
def predict(test_loader, model, tta=10):
   model.eval()
   test_pred_tta = None
   # TTA 次数
   for _ in range(tta):
       test_pred = []
   
       with torch.no_grad():
           for i, (input, target) in enumerate(test_loader):
               c0, c1, c2, c3, c4, c5 = model(data[0])
               output = np.concatenate([c0.data.numpy(), c1.data.numpy(),
                  c2.data.numpy(), c3.data.numpy(),
                  c4.data.numpy(), c5.data.numpy()], axis=1)
               test_pred.append(output)
       
       test_pred = np.vstack(test_pred)
       if test_pred_tta is None:
           test_pred_tta = test_pred
       else:
           test_pred_tta += test_pred
   
   return test_pred_tta

其他的一些trick

  • 通过训练集中字符出现频率,修正结果
  • 增加字符长度预测模型,预测字符个数

你可能感兴趣的:(Task05: 模型集成)