有哪些具体的现实生活示例可以使用 Boosting/Bagging 算法解决?代码片段将不胜感激。
3 回答
集成用于对抗过度拟合/改进泛化或对抗特定弱点/使用不同分类器的强度。它们可以应用于任何分类任务。
我在硕士论文中使用了合奏。代码在 Github上。
示例 1
例如,考虑一个二元问题,您必须判断数据点是属于 A 类还是 B 类。这可能是一张图像,您必须决定上面是 (A) 狗还是 (B) 猫它。现在您有两个分类器 (1) 和 (2)(例如,两个神经网络,但以不同的方式训练;或者一个 SVM 和一个决策树,或者......)。他们犯了以下错误:
(1): Predicted
T | A B
R ------------
U A | 90% 10%
E B | 50% 50%
(2): Predicted
T | A B
R ------------
U A | 60% 40%
E B | 40% 60%
例如,您可以首先使用 (1) 将它们组合成一个整体。如果它预测B
,那么您可以使用 (2)。否则你坚持下去。
现在,(错误地)假设两者都是独立的),预期的错误是什么?
如果真正的类别是A
,那么我们预测 90% 的真实结果。在 10% 的情况下,我们预测B
并使用第二个分类器。这一个在 60% 的情况下是正确的。这意味着如果我们有A
,我们预测其中A
的0.9 + 0.1*0.6 = 0.96 = 96%
情况。
如果真正的类是B
,我们预测50%
的情况B
。但是我们还需要第二次把它弄好,所以只有在0.5*0.6 = 0.3 = 30%
某些情况下我们才能把它弄好。
所以在这个简单的例子中,我们让一个班级的情况变得更好,但对另一个班级来说更糟。
示例 2
现在,假设我们有 3 个分类器
Predicted
T | A B
R ------------
U A | 60% 40%
E B | 40% 60%
每个,但分类是独立的。当你获得多数票时,你会得到什么?
如果你有 A 类,至少有两个人说它是 A 类的概率是
0.6 * 0.6 * 0.6 + 0.6 * 0.6 * 0.4 + 0.6 * 0.4 * 0.6 + 0.4 * 0.6 * 0.6
= 1*0.6^3 + 3*(0.6^2 * 0.4^1)
= (3 nCr 3) * 0.6 + (3 nCr 2) * (0.6^2 * 0.4^1)
= 0.648
另一个班级也是如此。所以我们将分类器改进为
Predicted
T | A B
R ------------
U A | 65% 35%
E B | 35% 65%
代码
有关代码,请参阅Ensembles 上的 sklearns 页面。
集成学习最具体的例子是随机森林。
集成是将不同的学习者(单个模型)组合在一起以提高模型的稳定性和预测能力的艺术。
集成学习技术:
Bagging:Bagging 尝试在小样本总体上实现相似的学习器,然后取所有预测的平均值。在广义 bagging 中,您可以在不同的人群中使用不同的学习者。
Boosting:Boosting是一种迭代技术,它根据最后的分类调整观察的权重。如果一个观察被错误地分类,它会尝试增加这个观察的权重,反之亦然。Boosting 通常会减少偏差误差并建立强大的预测模型。
Stacking:这是一种非常有趣的模型组合方式。在这里,我们使用一个学习器来组合来自不同学习器的输出。根据我们使用的组合学习器,这可能会导致偏差或方差误差的减少。
更多参考: 集成学习基础解释
这是用于基本集成学习的基于 Python 的伪代码:
# 3 ML/DL models -> first_model, second_model, third_model
all_models = [first_model, second_model, third_model]
first_model.load_weights(first_weight_file)
second_model.load_weights(second_weight_file)
third_model.load_weights(third_weight_file)
def ensemble_average(models: List [Model]): # averaging
outputs = [model.outputs[0] for model in all_models]
y = Average()(outputs)
model = Model(model_input, y, name='ensemble_average')
pred = model.predict(x_test, batch_size = 32)
pred = numpy.argmax(pred, axis=1)
E = numpy.sum(numpy.not_equal(pred, y_test))/ y_test.shape[0]
return E
def ensemble_vote(models: List [Model]): # max-voting
pred = []
yhats = [model.predict(x_test) for model in all_models]
yhats = numpy.argmax(yhats, axis=2)
yhats = numpy.array(yhats)
for i in range(0,len(x_test)):
m = mode([yhats[0][i], yhats[1][i], yhats[2][i]])
pred = numpy.append(pred, m[0])
E = numpy.sum(numpy.not_equal(pred, y_test))/ y_test.shape[0]
return E
# Errors calculation
E1 = ensemble_average(all_models);
E2 = ensemble_vote(all_models);