【问题标题】:Why does this trivially learnable example break AdaBoost?为什么这个简单易学的例子会破坏 AdaBoost?
【发布时间】:2015-04-15 01:40:06
【问题描述】:

我正在测试使用 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?我相信这个例子应该很容易学习。有没有办法防止这个错误并使用这种方法得到正确的结果?

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

【问题讨论】:

    标签: matlab adaboost


    【解决方案1】:

    这不是错误,只是 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)
    

    【讨论】:

    • 很好的解释。您如何建议测试 AdaBoost 以进行调试?也许是一个非线性可分的例子?
    • 我认为你正在做一些事情。怎么样:X = rand(100, 2);Y = X(:,1).^2 + X(:,2).^2 &gt; .5;boosted_tree = fitensemble(X, Y, 'AdaBoostM1', 100,'Tree');predicted_Y = predict(boosted_tree, X);
    猜你喜欢
    • 2016-08-16
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2021-05-27
    • 2011-11-19
    • 2012-10-08
    相关资源
    最近更新 更多