【问题标题】:Does presorting slow down training of large decision trees?预排序会减慢大型决策树的训练速度吗?
【发布时间】:2016-10-11 18:49:06
【问题描述】:

在 Scikit-Learn 的 documentationDecisionTreeClassifier 类中,presort 超参数是这样描述的:

预排序:bool,可选(默认=False)

是否对数据进行预排序以加快寻找最佳分割的速度 在拟合。对于大型决策树的默认设置 数据集,将其设置为 true 可能会减慢训练过程。 当使用较小的数据集或有限的深度时,这可能 加快训练速度。

我不明白为什么预排序会减慢大型数据集的训练速度并加快小型数据集的训练速度。我希望完全相反。事实上,关于decision trees's computational complexity 的文档指出,如果不进行预排序,复杂度为 O(n_features * n_samples^2 * log(n_samples)),但经过预排序,复杂度变为 O(n_features * n_samples * log(n_samples))。

因此,我预计预分类需要一点时间,这会稍微减慢训练速度,但如果训练集很大,这将在很大程度上得到补偿。

这只是 Scikit-Learn 文档中的一个错误,还是我遗漏了什么?

编辑

我进行了一些测试,发现预分类似乎确实会减慢大型训练集的训练速度。事实上,我观察到像 O(n_features * n_samples^2 * log(n_samples)) 之类的东西,甚至更糟(即指数),有预排序,而 O(n_features * n_samples * log(n_samples)) 没有预排序。当 n_samples 小于几千时,预排序的训练似乎会更快一些。

所以经验上的答案是“是”,但我很想了解原因。

【问题讨论】:

  • 看起来 scikit-learn 在 0.22 版本中弃用了这个参数,并将在 0.24 版本中删除它。我不知道它在幕后做了什么让大型数据集的速度变慢,但我想我会指出这一点。

标签: scikit-learn time-complexity decision-tree


【解决方案1】:

似乎 presort 可以加快寻找拟合中的最佳分割,但将花费额外的时间来对训练数据进行排序。

您提到的复杂性如下:

with presort: O(n_features * n_samples^2 * log(n_samples))
without presort: O(n_features * n_samples * log(n_samples))

复杂度乘以n_samples是很有意义的,这是排序算法基于link所能提供的最佳复杂度。

但是,我不太确定这种预分类对培训有多大帮助。我找不到任何关于 sklearn 如何实现它的资源。

【讨论】:

    猜你喜欢
    • 2019-06-11
    • 2022-01-27
    • 1970-01-01
    • 2011-04-27
    • 2017-05-11
    • 2019-06-01
    • 1970-01-01
    • 2020-05-19
    • 2015-06-27
    相关资源
    最近更新 更多