2 min read

卡方分箱 理解

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

假设我们的\(y \in \{0,1,2\}\),因此有两种分类, 这里是为了简化,理论上,\(y\)可以多分类。 我们sort下我们的连续变量\(x\)后, 发现,\(y\)变量Species\(x\)变量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这两列放在一起的\(\chi^2\)\(\chi^2\)是一种投诚的感觉。 比如, 4.3的总数是\(1\)4.3的总数是\(2\)setosa的总数是\(4\)versicolor的总数是\(4\)virginica的总数是\(4\)。 样本总数是\(7\)

我们定义在\([1,1]\)的期望值\(E_{1,1} = \frac{1 \times 4}{7} = 4/7\)。 然后真实值\(A_{1,1}=1\)。 我们发现\(E_{i,j}\)是受到totaltotal_row两个决定,这两个是不是描述整体样本的两个指标? 如果我们说\(A_{i,j} \to E_{i,j}\), 那么就说明这个\(A_{i,j}\)follow整个样本,因此不是异常的。 如果全部\(A_{i,j}\)都follow整个样本,因此这就不是异常的样本。 我们定义这样的一个公式, \(\sum_{i=1}^{total}\sum_{j=1}^{total_-row}\frac{(A_{i,j}-E_{i,j})^2}{E_{i,j}}\) 。 显然这个值越低,说明越follow整个样本,这就不是异常的样本,很老实,因此时一个样本。 4.34.4,应该合并,否则两个不同。

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


另外 \(\chi^2 = \sum_{i=1}^{total}\sum_{j=1}^{total_-row}\frac{(A_{i,j}-E_{i,j})^2}{E_{i,j}} \sim \bar \chi^{2}\)。 其中\(\bar \chi^{2}\)是一个阈值,越小,说明判断为同一样本的条件越苛刻。 这个受到样本大小(或者说\(n-1\),也就是自由度)和置信度决定。


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

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

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

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

还有python代码。