使用Boosting / Bagging算法可以解决哪些具体的现实生活示例?代码片段将不胜感激。
答案 0 :(得分:1)
合奏用于对抗过度拟合/改善泛化或对抗特定弱点/使用不同分类器的强度。它们可以应用于任何分类任务。
我在my masters thesis中使用了合奏。 code is on Github。
例如,考虑一个二元问题,你必须告诉你数据点是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
个案例中我们才能做到正确。
因此,在这个简单的例子中,我们为一个班级创造了更好的情况,但对另一个班级则更糟糕。
现在,假设我们有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);