2 min read

卡方分箱 理解

卡方分箱是一种有监督的分箱,也就是向y进行投诚。 例如,我们要回归y=β0+β1x+u, 得知,x是连续的,但是不单调,因此要虚拟化。 我们都知道等频、等距、低频合并等方法弊端太多,瑕疵再说。 这里主要说卡方分箱。

假设我们的y{0,1,2},因此有两种分类, 这里是为了简化,理论上,y可以多分类。 我们sort下我们的连续变量x后, 发现,y变量Speciesx变量Sepal.Length的关系如下。

iris1 <- 
iris %>% 
  select(Sepal.Length,Species) %>%
  group_by(Sepal.Length,Species) %>% 
  summarise(n = n()) %>% 
  spread(Species,n, fill = 0)
## `summarise()` regrouping output by 'Sepal.Length' (override with `.groups` argument)
iris1
## # A tibble: 35 x 4
## # Groups:   Sepal.Length [35]
##    Sepal.Length setosa versicolor virginica
##           <dbl>  <dbl>      <dbl>     <dbl>
##  1          4.3      1          0         0
##  2          4.4      3          0         0
##  3          4.5      1          0         0
##  4          4.6      4          0         0
##  5          4.7      2          0         0
##  6          4.8      5          0         0
##  7          4.9      4          1         1
##  8          5        8          2         0
##  9          5.1      8          1         0
## 10          5.2      3          1         0
## # ... with 25 more rows
iris1 %>% 
  head(2) %>% 
  mutate(total = sum(setosa:virginica)) %>% 
  mutate(Sepal.Length = as.character(Sepal.Length)) %>% 
  ungroup() %>% 
  add_row(Sepal.Length = "total_row", 
          setosa = 4,
          versicolor = 0,
          virginica = 0,
          total = 7)
## # A tibble: 3 x 5
##   Sepal.Length setosa versicolor virginica total
##   <chr>         <dbl>      <dbl>     <dbl> <dbl>
## 1 4.3               1          0         0     1
## 2 4.4               3          0         0     6
## 3 total_row         4          0         0     7

计算4.34.4这两列放在一起的χ2χ2是一种投诚的感觉。 比如, 4.3的总数是14.3的总数是2setosa的总数是4versicolor的总数是4virginica的总数是4。 样本总数是7

我们定义在[1,1]的期望值E1,1=1×47=4/7。 然后真实值A1,1=1。 我们发现Ei,j是受到totaltotal_row两个决定,这两个是不是描述整体样本的两个指标? 如果我们说Ai,jEi,j, 那么就说明这个Ai,jfollow整个样本,因此不是异常的。 如果全部Ai,j都follow整个样本,因此这就不是异常的样本。 我们定义这样的一个公式, i=1totalj=1totalrow(Ai,jEi,j)2Ei,j 。 显然这个值越低,说明越follow整个样本,这就不是异常的样本,很老实,因此时一个样本。 4.34.4,应该合并,否则两个不同。

以上就是卡方检验的思路。


另外 χ2=i=1totalj=1totalrow(Ai,jEi,j)2Ei,jχ¯2。 其中χ¯2是一个阈值,越小,说明判断为同一样本的条件越苛刻。 这个受到样本大小(或者说n1,也就是自由度)和置信度决定。


以下是可以阅读的相关资料。

@article{kerber1992chimerge:,
title={ChiMerge: discretization of numeric attributes},
author={Kerber, Randy},
pages={123--128},
year={1992}}

这是卡方分箱最原始的一篇文献,很短才5页。 Kerber, Randy 这个作者是个独立研究者。

基本思想:对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低卡方值表明它们具有相似的类分布。 这个讲的很清楚。

还有python代码。