为什么这个简单易学的例子会破坏 AdaBoost?

Why does this trivially learnable example break AdaBoost?

我正在测试我使用 Matlab 的 fitensemble 方法构建的提升树模型。

X = rand(100, 10);
Y = X(:, end)>.5;
boosted_tree = fitensemble(X, Y, 'AdaBoostM1', 100,'Tree');
predicted_Y = predict(boosted_tree, X);

我只是想 运行 它在几个简单的例子上,所以我提出了一个简单的例子,一个特征是 >.5 代表正例,< .5 代表负例。我收到警告

Warning: AdaBoostM1 exits because classification error = 0

这让我想到,太棒了,它找出了相关的特征,并且所有的训练样本都被正确地 class 化了。

但是如果我看准确率

sum(predicted_Y==Y)/length(Y)

结果是 0.5,因为 classifier 只是将正 class 分配给所有示例!

为什么Matlab认为classification error = 0 明明不是0?我相信这个例子应该很容易学习。有没有办法防止这个错误并使用这个方法得到正确的结果?

编辑:上面的代码应该重现警告。

这不是错误,只是 AdaBoost 并非设计用于第一个弱学习器获得完美分类的情况。更多详情:

1) 你得到的warning指的是第一个weak learning的error,确实是0。您可以通过跟踪随警告一起进入函数 Ensemble.m 的堆栈跟踪来看到这一点(在 Matlab R2013b 中,第 194 行)。如果你在那里放置一个断点和 运行 你的例子,然后 运行 命令 H.predict(X) 你会看到这个学习有完美的预测。

2) 那么为什么你的集成没有完美的预测?如果你多看 Ensemble.m,你会发现这个完美的学习器永远不会被添加到集成中。这也体现在boosted_tree.NTrained为零。

3) 那么为什么这个完美的学习器没有被添加到集成中呢?如果您找到 AdaBoost.M1 算法的描述,您会看到在每一轮中,训练示例都由前一个弱学习器的错误加权。但是如果那个弱学习者没有错误,那么权重将为零,因此所有后续学习者都将无事可做。

4) 如果你在现实世界中遇到这种情况,你会怎么做?不要为 AdaBoost 而烦恼!这个问题很简单,你的一个弱学习者可以解决它:

X = rand(100, 10);
Y = X(:, end)>.5;
tree = fit(ClassificationTree.template, X, Y);
predicted_Y = predict(tree, X);
accuracy = sum(predicted_Y == Y) / length(Y)