- 一般的集成学习方法
- 深度学习中的集成方法
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
- 通过训练集中字符出现频率,修正结果
- 增加字符长度预测模型,预测字符个数