1

有哪些具体的现实生活示例可以使用 Boosting/Bagging 算法解决?代码片段将不胜感激。

4

3 回答 3

2

集成用于对抗过度拟合/改进泛化或对抗特定弱点/使用不同分类器的强度。它们可以应用于任何分类任务。

我在硕士论文中使用了合奏。代码在 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,我们预测其中A0.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 页面

集成学习最具体的例子是随机森林。

于 2016-07-02T09:21:14.237 回答
0

集成是将不同的学习者(单个模型)组合在一起以提高模型的稳定性和预测能力的艺术。

集成学习技术:

  1. Bagging:Bagging 尝试在小样本总体上实现相似的学习器,然后取所有预测的平均值。在广义 bagging 中,您可以在不同的人群中使用不同的学习者。

  2. Boosting:Boosting是一种迭代技术,它根据最后的分类调整观察的权重。如果一个观察被错误地分类,它会尝试增加这个观察的权重,反之亦然。Boosting 通常会减少偏差误差并建立强大的预测模型。

  3. Stacking:这是一种非常有趣的模型组合方式。在这里,我们使用一个学习器来组合来自不同学习器的输出。根据我们使用的组合学习器,这可能会导致偏差或方差误差的减少。

更多参考: 集成学习基础解释

于 2018-05-13T06:15:09.857 回答
0

这是用于基本集成学习的基于 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);
于 2020-11-27T18:15:17.363 回答