sklearn 集成和树中连续变量的分箱

Posted

技术标签:

【中文标题】sklearn 集成和树中连续变量的分箱【英文标题】:Binning of continuous variables in sklearn ensemble and trees 【发布时间】:2014-10-06 21:21:24 【问题描述】:

谁能告诉我 sklearn (Python) 中的集成(如随机森林、梯度提升、Adaboost)和树(如决策树)如何处理连续变量?在建造树木时,它们是否被视为每个单独的价值?还是他们自动装箱?如果它们被分箱 - 遵循的逻辑是什么。如果它们没有被装箱,我肯定我错过了一些东西。应该有一些可用的智能分箱(内置?),它将根据类分布将变量值分箱(至少在二进制分类的情况下)

深入:当我在 weka 中加载我的 arff(高度倾斜的数据集中的数百万行和数百个特征)并滚动浏览变量/目标(二进制)图时,我可以看到其中许多具有strong bins(目标为正的区域)。这些垃圾箱,即 >=x

非常感谢您对此的任何见解

问候

【问题讨论】:

每棵树的每个节点都是一个bin,它本身定义为上游拆分规则。很少有完美的分箱程序,但许多低相关树模型的平均集成甚至可以成为一个几乎平滑的函数估计器。如果连续变量的值为 1:5(1 到 5),则可能的拆分为 1;2:5、1:2;3:5、1:3;4:5 和 1:4;5。尝试数百或数千个可能的断点非常快。 【参考方案1】:

使用默认设置(非随机拆分),每次通过拆分数据集来生成决策树或回归树时,正在考虑的数据集部分按所考虑的每个特征的值依次排序(在随机森林或 ExtraTrees 森林中,每次都可能随机选择特征)。然后每个相邻特征值对的平均值f[i], f[j] 被视为候选拆分,除非该对之间的距离小于 1e-7(当前在代码中硬连线的任意常数)。根据 Gini/entropy/other 拆分标准,最佳拆分用于将数据集拆分为具有f < (f[i] + f[j]) / 2 的点和具有较高值的​​f 的点。

I.o.w.,不执行显式分箱。

(我实际上并不是一个决策树专家,但我确实致力于 scikit-learn 的实现,特别是我通过为其编写更快的排序算法来优化拆分代码。)

【讨论】:

Larsmans - 太棒了,来自马嘴。谢谢。我想知道为什么相邻的一对特征。例如,如果 house_sqft、house_pincode、house_hasdeck 是决定 house_highvalue(是或否)的单个树的选定特征。如果我做对了 - 首先将数据集拆分为 house_sqft (sum(house_sqft) + sum(house_pincode)/2 并计算 gini/entropy。然后将数据集拆分为 house_sqft (sum(house_sqft) + sum(house_hasdeck)/2 等等....?但这肯定会要求跨特征(不常用)和松散信息进行标准化。我肯定是错的 @Run2:我的意思是排序后的相邻样本。因此,您对sqft 上的房屋进行排序,然后比较所有n-1 对sqft[i], sqft[i+1],其中i 索引房屋的排序列表。 (实际上只是计算所有拆分,可能我涉及的算法细节太多。scikit-learn 中的决策树算法是您在 ISLR 等教科书中找到的算法。) 谢谢,我明白了。我绝对认为这里有改进的余地。很想研究它并实施它。我对子组发现做了一些研究,这可能是这个拆分逻辑的一个很好的附加/额外功能。如果您对如何走这条路有一些指示,请提出建议。 @Run2 在邮件列表上注册并在那里发布消息。它在 scikit-learn.org 的某个地方列出。【参考方案2】:

我不确切知道 scikit-learn 的作用,但我怀疑没有分箱,它只是使用连续值。在最简单的决策树形式中,您测试的规则只是 x_j >= x_ij 对于每个变量以及对于该变量的每个观察到的实现。

documentation(参见 1.8.7 数学公式)建议他们使用这种简单的方法。只需测试每个变量的每个(或某些子集)可能的阈值。

【讨论】:

当您有数百万行的值彼此接近(在每个特征中)但彼此不同时,这种树构建将无法正常工作。如果您看到上图 - 每个特征中都有强箱,并且可能有弱豆(您看不到红色,因为它可能太薄了)。如果我们可以获得每个特征的强分类,并通过组合它们来创建规则,那么与检查单个值相比,这可能会提供更好的分类。特别是在倾斜数据中,bin 中也有很多 0 值。那里一定有什么东西。 是的,但在这种情况下,您可能应该自己做。如果我正在设计一个通用的决策树实现,我会在幕后感到非常不舒服。这种特征转换需要领域和数据知识。当然,请记住,我实际上并不了解 sk-learn 的实现,我只是从他们的文档中删除。 嗯-好的-谢谢罗杰。我将拭目以待,看看是否有其他人提供任何其他建议。 WEKA 是如何分箱的?如果我将鼠标悬停在 WEKA 中的条上,那么我可以看到它已经对每个功能进行了某种分箱。

以上是关于sklearn 集成和树中连续变量的分箱的主要内容,如果未能解决你的问题,请参考以下文章

spark 特征工程 -- 分箱 Binning

第四章 数据的预处理与特征构建(续)

第四章 数据的预处理与特征构建(续)

机器学习特征工程之连续变量离散化:等频分箱

机器学习特征工程之连续变量离散化:等宽分箱

机器学习特征工程之连续变量离散化:聚类法进行分箱