关于给定响应变量的最优分箱

机器算法验证 r 数据集 优化 离散数据 分箱
2022-03-06 07:23:14

我正在寻找关于给定响应(目标)二进制变量和最大间隔数作为参数的连续变量的最佳分箱方法(离散化)。

示例:我对具有“身高”(数字连续)和“has_back_pains”(二进制)变量的人进行了一组观察。我想将高度离散化为最多 3 个间隔(组),不同比例的人背痛,以便算法最大化组之间的差异(例如,在给定的限制下,每个间隔至少有 x 个观察值)。

这个问题的明显解决方案是使用决策树(一个简单的单变量模型),但我在 R 中找不到任何将“最大分支数”作为参数的函数 - 所有这些函数都划分变量分成 2 个组(<=x 和 >x)。SAS 矿工有一个“最大分支”参数,但我正在寻找一个非商业解决方案。

我的一些变量只有几个唯一值(并且可以被视为离散变量),但我想将它们离散化为更少的间隔。

最接近我的问题的解决方案是在 R 中的 smbinning 包中实现(它依赖于 party 包中的 ctree 函数),但它有两个缺点:无法设置间隔数(但是,您可以通过更改找到解决方法p 参数)并且当数据向量的唯一值少于 10 个时它不起作用。无论如何,您可以在此处查看示例输出(Cutpoint 和 Odds 列至关重要):

Cutpoint CntRec CntGood CntBad CntCumRec CntCumGood CntCumBad PctRec BadRate   Odds  LnOdds     WoE     IV
1   <= 272   9081     169   8912      9081        169      8912 0.1874  0.9814 0.0190 -3.9653 -0.6527 0.0596
2   <= 311   8541     246   8295     17622        415     17207 0.1762  0.9712 0.0297 -3.5181 -0.2055 0.0068
3   <= 335   2986     163   2823     20608        578     20030 0.0616  0.9454 0.0577 -2.8518  0.4608 0.0163
4  Missing  27852    1125  26727     48460       1703     46757 0.5747  0.9596 0.0421 -3.1679  0.1447 0.0129
5    Total  48460    1703  46757        NA         NA        NA 1.0000  0.9649 0.0364 -3.3126  0.0000 0.0956

哦,我完全知道分箱会导致信息丢失,并且有更好的方法,但我将使用它进行数据可视化并将这些变量视为一个因素。

2个回答

在这里阅读这本书(Nagarajan,2103 [1])时,我发现了这些有价值的信息,我在这里无耻地引用了这些信息:

  • 使用数据的先验知识。为每个变量定义了区间的边界,以对应于显着不同的现实世界场景,例如特定污染物的浓度(不存在、危险、致命)或年龄类别(儿童、成人、老年人)。

  • 在学习网络结构之前使用启发式算法。一些示例包括:Sturges、Freedman-Diaconis 或 Scott 规则(Venables 和 Ripley,2002 年)。

  • 选择间隔的数量及其边界来平衡准确性和信息丢失(Kohavi 和 Sahami,1996),在学习网络结构之前,一次又一次使用一个变量。Hartemink (2001) 提出了一种考虑变量对的类似方法。

  • 迭代地执行学习和离散化,直到没有改进(Friedman 和 Goldszmidt,1996)。

这些策略代表了原始数据的离散表示的准确性和转换的计算效率之间的不同权衡。

提供此信息,以防您想证明您希望使用的分箱方法的合理性,而不仅仅是直接使用包。

[1]:Nagarajan R. (2013),
R 中的贝叶斯网络,在系统生物学
Springer中的应用

尝试 R 的信息包。 https://cran.r-project.org/web/packages/Information/Information.pdf https://cran.r-project.org/web/packages/Information/vignettes/Information-vignette .html

信息包具有计算 WoE 和 IV 的功能(分箱数是一个灵活的参数,默认为 10),并且是用于数据探索和分箱的便捷工具。但是,输出不包含赔率;并且不可能将零指定为单独的箱(对于我的任务,零通常是它自己的有效箱);从信息包中获得类似于 smbinning 的输出会很好。然而,说到信息包的好用但仍然不可用的功能,WoE 和 IV 的其他 R 包(woe,klaR)并没有给人留下像信息包有用的工具的印象,事实上我2-3 次尝试后无法运行它们。对于 dscretisation/binning 的任务,Information 和 smbinning 包可以很好地协同工作,

对于实际的分箱,我使用 data.table 而不是 cut() 函数。请参阅下面我的帖子的链接,它在初始问题的最底部包含通用代码: https ://stackoverflow.com/questions/34939845/binning-variables-in-a-dataframe-with-input-bin-data-来自另一个数据框

希望能帮助到你。