在Scikit-Learn的DecisionTreeClassifier
类documentation中,presort
超参数的描述如下:
presort :bool,optional(默认= False)
是否预先分配数据以加速找到最佳分割 在拟合。对于大型决策树的默认设置 数据集,将其设置为true可能会减慢培训过程。 当使用较小的数据集或受限深度时,这可能 加快培训速度。
我不明白为什么预先排序会减慢大型数据集的培训速度并加快对较小数据集的培训。我完全相反。实际上,关于decision trees's computational complexity的文档说明没有预先排序,复杂性是O(n_features * n_samples ^ 2 * log(n_samples)),但是通过预先分类它变为O(n_features * n_samples * log(n_samples))。 / p>
因此,我希望预先分配花费一点时间,这会减慢训练速度,但如果训练集很大,这将在很大程度上得到补偿。
这只是Scikit-Learn文档中的错误还是我错过了什么?
修改
我进行了一些测试,我发现预先分类确实会减慢大型训练集的训练速度。事实上,我观察了类似O(n_features * n_samples ^ 2 * log(n_samples)),甚至更糟(即指数),预分类和O(n_features * n_samples * log(n_samples))而没有预先分类。当n_samples小于几千时,预训似乎有点快。
所以经验回答是“是”,但我很想理解为什么。
答案 0 :(得分:0)
似乎预排序可以加快寻找最佳拟合的速度,但是将花费额外的时间对训练数据进行排序。
您提到的复杂性如下:
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如何实现它的任何资源。