AdaBoost的O()运行时复杂性是什么?

时间:2014-03-14 06:11:09

标签: machine-learning scikit-learn adaboost

我正在使用典型的DecisionTree弱学习者从scikit-learn中学习AdaBoost。我想了解数据大小N和弱学习者数量方面的运行时复杂性。我已经搜索过这些信息,包括来自Yoav Freund和Robert Schapire的一些原始Adaboost论文,并没有看到非常明确的答案

2 个答案:

答案 0 :(得分:3)

没有不尊重orgrisel,但他的答案缺乏,因为它完全忽略了功能的数量。

AdaBoost的时间复杂度通常为O(T f),其中f是使用中弱学习者的运行时间。

对于正常的样式决策树,例如C4.5,时间复杂度为O(N D^2),其中D是要素的数量。单级决策树将是O(N D)

您不应该使用实验来确定算法的运行时复杂性。首先,您将无法轻易区分类似的复杂性,如O(N log(N))和O(N log(N)^ 2)。它还有被底层实现细节所欺骗的风险。例如,当数据主要被排序或包含一些唯一属性时,许多种类可以表现出O(N)行为。如果您输入的输入具有很少的唯一值,则运行时将显示比预期的一般情况更快的结果。

答案 1 :(得分:1)

它是O(N.T)。对T的线性依赖是确定的,因为用户可以选择树的数量并且它们是按顺序训练的。

我认为在sklearn中拟合树的复杂性是O(N),其中N是训练集中的样本数。当max_features保留其默认值时,功能的数量也会产生线性影响。

为了确保您可以编写一个脚本来测量adaboost模型的训练时间10%,20%,... 100%的数据和n_estimators = 10,20,... 100,然后绘制matplotlib的结果。

编辑:由于AdaBoost通常应用于浅树(一般情况下,max_depth介于1和7之间),因此复杂性的依赖性实际上可能不是线性的N.我认为我测量过去对完全开发的树木的线性依赖性(例如在随机森林中)。浅树的复杂性可能接近于O(N.log(N)),但我不确定。