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

Matlab 为什么这个简单易懂的例子会破坏AdaBoost?,matlab,adaboost,Matlab,Adaboost,我正在测试一个使用Matlab方法构建的增强树模型 我只想在几个简单的例子上运行它,所以我加入了一个简单的例子,一个特性是>.5表示正面例子,而.5boosted_tree=fittensemble(X,Y,'AdaBoostM1',100,'tree')predicted_Y=predicted(增强的_树,X) X = rand(100, 10); Y = X(:, end)>.5; tree = fit(ClassificationTree.template, X, Y); pred

我正在测试一个使用Matlab方法构建的增强树模型

我只想在几个简单的例子上运行它,所以我加入了一个简单的例子,一个特性是>.5表示正面例子,而<.5表示负面例子。我得到了警告

Warning: AdaBoostM1 exits because classification error = 0
这让我想,太好了,它找到了相关的功能,所有的培训示例都正确分类

但如果我看一下准确性

sum(predicted_Y==Y)/length(Y)
结果是0.5,因为分类器只是将阳性类分配给所有示例

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


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

这不是一个bug,只是AdaBoost的设计不适用于第一个弱学习者获得完美分类的情况。更多详情:

1) 您得到的警告是指第一次弱学习的错误,实际上是零。您可以通过将警告随附的堆栈跟踪跟踪到函数
emble.m
(在Matlab R2013b中,第194行)中看到这一点。如果在那里放置断点并运行示例,然后运行命令
H.predict(X)
,您将看到此学习具有完美的预测能力

2) 那么为什么你们的团队没有完美的预测呢?如果您更多地查看
employee.m
,您会发现这个完美的学习者永远不会加入到employee中。这也反映在
增强的树中。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)

很好的解释。那么,为了调试目的,您建议如何测试AdaBoost?也许是一个非线性可分的例子?我想你已经明白了。怎么样:
X=rand(100,2)
Y=X(:,1)。^2+X(:,2)。^2>.5
boosted_tree=fittensemble(X,Y,'AdaBoostM1',100,'tree')
predicted_Y=predicted(增强的_树,X)
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)