我正在测试我使用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?我相信这个例子应该很容易学习。有没有办法防止此错误并使用此方法获得正确的结果?
修改:上面的代码应该重现警告。
答案 0 :(得分: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)