【问题标题】:What is the O() runtime complexity of AdaBoost?AdaBoost 的 O() 运行时复杂度是多少?
【发布时间】:2014-04-19 07:13:01
【问题描述】:

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

【问题讨论】:

    标签: machine-learning scikit-learn adaboost


    【解决方案1】:

    没有不尊重 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) 行为。如果您输入的唯一值很少,则运行时会显示出比预期的一般情况更快的结果。

    【讨论】:

    • 决策树桩学习的实际复杂性也取决于拆分器,但我相信对于单个固定深度树和最优拆分来说,它的复杂度为 O(DN log N)。在每个候选分割中,所有样本都必须按某个特征的值进行排序。排序渐近地占主导地位。
    • 你不能说排序支配了时间复杂度,因为它使用了不同的变量。排序只是其中的一部分。如果您对数字特征使用基数排序或使用分类特征,则复杂度为 O(DN)。我使用了通用术语,因为有许多不同类型的可能的决策树归纳方法。还有其他方法可以在不使用排序的情况下获得 O(D N) 时间
    • 这都是真的,我不应该假设 N >> D 因为在某些问题中这是不正确的。但问题是关于 scikit-learn,它确实在其决策树学习中使用了经典的比较排序。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这里对迭代过程和AdaBoost复杂性本身的分析在哪里?
    • AdaBoost 在整个数据集上依次训练一棵树(样本权重从前面步骤的结果更新)。由于权重对树的训练时间影响不大,因此不会影响复杂度对 T 的线性依赖性。