2

我正在测试我使用 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

这让我想,太好了,它找出了相关的特征,并且所有的训练样本都被正确分类了。

但是如果我看一下准确性

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

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

为什么Matlab认为分类误差= 0,而它显然不是0?我相信这个例子应该很容易学习。有没有办法防止此错误并使用此方法获得正确的结果?

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

4

1 回答 1

2

这不是错误,只是 AdaBoost 不适用于第一个弱学习器获得完美分类的情况。更多细节:

1)你得到的警告是指第一次弱学习的错误,确实为零。您可以通过跟踪伴随警告进入函数的堆栈跟踪来看到这一点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)
于 2015-02-17T17:35:44.857 回答