前些日子,星球里讨论风控建模面试中的一些问题,其中就提到了 “卡方分箱”。大家对卡方分箱都有或多或少的疑问,应星球朋友要求,最近整理了一下我对卡方分箱的理解,也借此分享给公众号的朋友们。



什么是分箱?


说到分箱,可能很多朋友都非常熟悉,它是数据科学中常用到的一个技巧,意思就是将连续型的数据分成几个数据段,即离散化。很好理解,举个例子,比如将原本连续的年龄特征离散化,结果可变为0-18,18-30, 30-50,>50等4个范围的特征值,而非连续的无穷的特征值。简单理解,这个过程其实就是:连续 —>不连续



为什么要分箱?


分箱的好处还是很多的,尤其是使用逻辑回归的评分卡建模中,分箱woe也是一种标配。总的来说,分箱有这么几个用处:


  • 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;

  • 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;

  • 单变量离散化后,每个变量有单独的权重,可以为逻辑回归模型引入了非线性,能够提升模型表达能力,加大拟合;

  • 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

  • 可以将缺失作为独立的一类带入模型。



什么是卡方检验?


卡方检验是统计学中经常用到的一种假设检验。用我的理解总结起来,卡方检验就是对分类数据的频数进行分析的一种方法,它的应用主要表现在两个方面:拟合优度检验和独立性检验(列联分析)。


拟合优度


拟合优度是对一个分类变量的检验,即根据总体分布状况,计算出分类变量中各类别的期望频数,与分布的观察频数进行对比,判断期望频数与观察频数是否有显著差异,从而达到对分类变量进行分析的目的。比如,泰坦尼克号中我们观察幸存者是否与性别有关,可以理解为一个X是否与Y有必然联系。


独立性检验


独立性检验是两个特征变量之间的计算,它可以用来分析两个分类变量是否独立,或者是否有关联。比如某原料质量和产地是否依赖关系,可以理解为一个X与另一个X是否独立。


卡方检验步骤


卡方检验的步骤其实就是一般假设检验的过程。下面列出独立性检验的大致步骤,如下:


  • 提出假设,比如假设两个变量之间独立

  • 根据分类的观察频数计算期望频数

  • 根据卡方公式,计算实际频数与期望频数的卡方值

  • 根据自由度和事先确定的显著性水平,查找卡方分布表计算卡法值,并与上一步卡方值比较

  • 得出结果判断是否拒绝原假设



什么是卡方分箱?


分箱的方法有很多,卡方分箱属于其中一种,属于有监督系列的。卡方分箱正是一种基于卡方检验的分箱方法,更具地说是基于上面提到的第二种应用,独立性检验,来实现核心分箱功能的。


网上关于卡方分箱的理解也有一些,但是我们直接从算法提出者的论文来理解一下。下面这部分截取是算法的核心部分。



卡方分箱算法简单来说,有两个部分组成:1)初始化步骤;2)合并。


初始化步骤


  • 根据连续变量值大小进行排序

  • 构建最初的离散化,即把每一个单独的值视为一个箱体。这样做的目的就是想从每个单独的个体开始逐渐合并。


合并


上面已经将初始化的内容构建完毕,这一步就是不断地合并了,自底向上的合并,直到满足停止条件。那么它是如何合并的呢?


论文中提到的具体操作是这样的:


  • 计算所有相邻分箱的卡方值:也就是说如果有1,2,3,4个分箱,那么就需要绑定相邻的两个分箱,共三组:12,23,34。然后分别计算三个绑定组的卡方值。

  • 从计算的卡方值中找出最小的一个,并把这两个分箱合并:比如,23是卡方值最小的一个,那么就将2和3合并,本轮计算中分箱就变为了1,23,4。


背后的基本思想是:如果两个相邻的区间具有非常类似的类分布,那么这两个区间可以合并。否则,它们应该分开。低卡方值表明它们具有相似的类分布。


停止条件


上面的步骤只是每一轮需要计算的内容,如果我们不设置停止条件,算法就会一直运行。当然,我们一般会设置一些停止条件:


  • 卡方停止的阈值

  • 分箱数目的限制


意思就是说,只要当所有分箱对的卡方值都大于阈值,并且分箱数目小于最大分箱数时,计算就会继续,直到不满足。这两个值根据我们的经验来定义,作为函数参数设置,一般推荐使用0.9,0.95,0.99的置信度,分箱数一般可以设置为5。



卡方分箱公式理解


有的朋友问我了,说上面内容可以理解,但是公式看不懂。公式是什么样的呢?根据论文中可以看到,它长这个样的:

  • m=2:表示相邻的两个分箱数目

  • k:表示目标变量的类别数,比如目标是网贷违约的好和坏,那么k=2。k也可以是多类,大于2。

  • Aij:实际频数,即第i个分箱的j类频数

  • Eij:期望频数


其中,期望频数的公式如下,可根据P(AB)=P(A)P(B)推导出来:

  • Ri&Cj:分别是实际频数整列和整行的加和


举个例子说明一下这个公式是如何用的,对于相邻两个分箱的卡方值计算:

实际频数和期望频数都有了,带入卡方公式求解,过程如下:

如果计算结果是所有卡方值中最小的,说明:这组中两个分箱具有最相似的类分布,因此把它们合并。


以上就是结合论文对卡方分箱原理的一个解读。对于卡方分箱的实现有一些特殊情况需要注意,比如初始分箱中每个分箱中的数量,以及是否有全是同一类别的分箱出现等等。不过,如果掌握了上面的核心原理和计算部分,这些特殊情况都可迎刃而解。


©著作权归作者所有:来自51CTO博客作者mb5fe18e9fef50b的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 离散型随机变量的概率分布
  2. 醒醒!Python已经支持中文变量名啦!
  3. Excel公式太复杂?我花一晚上做了个格式化工具
  4. Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
  5. 利用Excel学习Python:变量
  6. 教你预测北京雾霾,基于keras LSTMs的多变量时间序列预测
  7. Python进阶:如何将字符串常量转为变量?
  8. 学了那么多公式,却依旧用不好Excel(实例讲解)
  9. Ansible 之 外部变量文件调用

随机推荐

  1. 基于Android(安卓)XML解析与保存的实现
  2. Android Drawable Importer的使用
  3. Android中判断字符串中必须包含字母或者
  4. android browser 的几个小feature (四) k
  5. Android SDK R17
  6. Android Selector和Shape的使用方法
  7. android ListView中添加ImageButton按钮
  8. Android Handler机制
  9. 如何在android 中编译alsa-utils工具
  10. Android(安卓)最火的快速开发框架XUtils