Ensemble Learning的一些具体例子是什么?

时间:2016-07-01 01:07:59

标签: machine-learning nlp ensemble-learning boosting

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

2 个答案:

答案 0 :(得分:1)

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

我在my masters thesis中使用了合奏。 code is on 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%的{​​{1}}中预测。但是我们还需要第二次才能做到正确,所以只有在B个案例中我们才能做到正确。

因此,在这个简单的例子中,我们为一个班级创造了更好的情况,但对另一个班级则更糟糕。

示例2

现在,假设我们有3个带

的分类器
0.5*0.6 = 0.3 = 30%

各自,但分类是独立的。当你进行多数投票时你会得到什么?

如果你有A级,那么至少有两个人认为它是A级的概率是

      Predicted
T    | A    B
R  ------------
U  A | 60%  40%
E  B | 40%  60%

另一个班同样如此。所以我们将分类器改进为

  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

代码

有关代码,请参阅sklearns page on Ensembles

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

答案 1 :(得分: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);