请问在sklearn(Python)中,集成方法(如随机森林、梯度提升、Adaboost)和树模型(如决策树)是如何处理连续变量的?它们在构建树时是否将每个连续值视为独立的值?还是会自动进行分箱处理?如果进行了分箱,那么遵循的是什么逻辑?如果没有分箱,我肯定是错过了什么。应该有一些智能的分箱方法(内置的?)可以根据类别分布对变量值进行分箱(至少在二元分类的情况下)。
深入探讨:当我在weka中加载我的arff文件(数百万行和数百个特征的严重偏斜数据集)并浏览变量/目标(二元)图时,我可以看到其中许多变量有明显的分箱区域(目标为正的区域)。这些分箱,即 >=x <=y,是否会被sklearn中提到的模型自动识别?请看附件图片(如果您能看到的话,变量/目标图中有六个条形的非常细的红色线条)
对于任何见解,我将非常感激
此致
回答:
在默认设置(非随机分割)下,每次构建决策树或回归树时,通过分割数据集来生长树,考虑中的数据集部分会按每个待考虑特征的值进行排序(在随机森林或ExtraTrees森林中,每次可能随机选择特征)。然后,每对相邻特征值f[i], f[j]
的平均值被视为候选分割点,除非这对值之间的差距小于1e-7(这是代码中当前硬编码的一个任意常数)。根据Gini/熵/其他分割标准,最佳分割点被用来将数据集分割成f < (f[i] + f[j]) / 2
的点和f
值更高的点。
换句话说,没有进行显式的分箱处理。
(我实际上不是决策树专家,但我确实参与了scikit-learn的实现,特别是我通过编写更快的排序算法优化了分割代码。)