sklearn集成和树中连续变量的分箱
有没有人能告诉我,在sklearn(Python)中,像随机森林、梯度提升和Adaboost这样的集成方法,以及决策树,是如何处理连续变量的?在构建树的时候,它们是把每个值当作单独的值来处理吗?还是说它们会自动分箱?如果是分箱的话,具体是按照什么逻辑来分的?如果没有分箱,那我肯定漏掉了什么。应该有一些智能的分箱方法(内置的?),可以根据类别分布来对变量值进行分箱(至少在二分类的情况下是这样)。
深入一点说:当我在weka中加载我的arff文件(有几百万行和几百个特征,数据集高度偏斜),并查看变量和目标(二分类)的图表时,我发现很多变量都有明显的分箱(目标为正的区域)。这些分箱,比如说大于等于x且小于等于y,是不是在sklearn中提到的模型自动识别出来的?请看附图(如果你能看到的话,图中有六个条形的细红线)。
如果能提供一些见解,我将非常感激。
祝好
2 个回答
我不太清楚scikit-learn具体是怎么工作的,但我猜它没有进行分箱处理,而是直接使用连续的数值。决策树的最简单形式中,你测试的规则就是检查每个变量是否大于等于某个值。
根据文档(见1.8.7数学公式部分),它们似乎确实采用了这种简单的方法。也就是说,测试每个变量的所有(或者某些)可能的阈值。
在默认设置下(非随机分割),每当我们通过分割数据集来生成一个决策树或回归树时,首先会把当前考虑的数据集按照每个特征的值进行排序(在随机森林或ExtraTrees森林中,每次可能会随机选择特征)。接着,我们会考虑每一对相邻的特征值 f[i], f[j]
的平均值作为可能的分割点,但如果这对值之间的差距小于1e-7(这是一个目前在代码中硬编码的任意常数),就不考虑这对值。然后,根据Gini、熵或其他分割标准,选择最佳的分割点,将数据集分成两部分:一部分是特征值 f
小于 (f[i] + f[j]) / 2
的数据,另一部分则是特征值更大的数据。
换句话说,没有进行明确的分箱处理。
(我其实并不是决策树方面的专家,但我曾参与过scikit-learn的实现,特别是我为它优化了分割代码,写了一个更快的排序算法。)