特征离散化(二) 之 Chi2分箱
话接上回,基于ChiMerge的卡方分箱可大致分为四个部分:1. 排序(连续型根据值大小排序,离散型根据给定的标准(如正例样本占比)排序);2. 自底向上计算相邻两项的卡方值(这一部分的计算尤其需要注意);3. 合并卡方值最小的两项;4. 重复步骤2&3直至满足给定的停止条件。如果有不清楚的地方,可以参见上篇博客。
ChiMerge分箱有一个致命的问题是:迭代结束的卡方阈值 δ \delta δ取决于显著性水平(sigLevel),该值由用户指定。对于不同的场景,该如何确定一个合适的sigLevel呢?基于此,Chi2分箱横空出世。
1. 卡方分箱 之 Chi2
Chi2分箱与ChiMerge分箱都是基于卡方值的自底向上分箱方法。Chi2分箱是对ChiMerge分箱的一种优化,不同于ChiMerge,通过引入不一致性检验(原文对应consistency check),Chi2的分箱效果不严重依赖于用户指定的卡方阈值。其伪码如下:
从伪码可知,Chi2分箱可分为两个阶段:第一个阶段,相当于在ChiMerge分箱(图中红色框框)的外层增加了一层循环。逐步降低显著性水平(sigLevel),直至数据的不一致性度量小于指定阈值 δ \delta δ,从而提高卡方阈值。第二个阶段,在第一阶段确定的sigLevel基础上,进行更细致的划分。
注意*:这里的讨论都只考虑针对单个变量的分箱。
这里面有三个关键的地方论文里讲的不是很清楚:
- 不一致性(Inconsistency Rate)如何计算。modified_chi2.pdf
- 卡方值计算(坑最深的地方)。这个上篇博客已经介绍了,此处不再赘述。
- 显著性水平(Significance Level)如何衰减。
下面我们将具体讨论这三个问题。
2. 不一致性衡量
根据论文中的解释,不一致性的度量标准如下:
相应的代码如下:
def calc_inconsistency_rate(count, group):
"""
计算分组的不一致性,参考论文《Feature Selection via Discretizations》
:param count: DataFrame 待分箱变量的分布统计
:param group: list 分组信息
:return: float 该分组的不一致性
"""
inconsistency_rate = 0.0
for intv in group:
count_intv = count