【特征选择】Filter - 过滤法中的数学原理

前言

本文主要对特征工程中特征选择部分的部分常见方法的数学原理进行讲解,将不涉及或很少涉及代码实现或应用,阅读前请确保已了解基本的机器学习相关知识。

文章概述

特征选择:特征选择是特征工程中重要的一步,目的在于从全部特征中筛选出真正有意义的、能提供更多有用信息的特征,在维持模型性能的前提下,帮助模型训练降低计算和时间成本。

特征越多往往需要维护的成本也就越高,需要更多的人力物力以及算力资源和时间成本,维护一些无意义的特征是没有必要的,因此才需要特征选择。

K最近邻算法KNN,单棵决策树,支持向量机SVM,神经网络,回归算法,都需要遍历特征或升维来进行运算,所以他们本身的运算量就很大,需要的时间很长,因此特征选择对他们来说尤为重要。但对于不需要遍历特征的算法,例如随机森林随机选取特征进行分枝,本身运算就很快,特征选择对它的效果也就一般。因此,特征选择的主要对象是那些需要遍历特征或升维的算法。

随机森林中的每棵决策树只会选取一小部分特征来建模;而KNN则不同,特征越少,距离计算的维度就越少,模型明显会随着特征的减少变得轻量。

过滤法:特征选择方法中的过滤法通常用作预处理步骤,是根据各种统计检验中的分数以及相关性的各项指标来对特征进行筛选,本文对过滤法中的常用算法的数学原理进行讲解,包括方差过滤和相关性过滤(卡方过滤、F检验、互信息法)。

方差过滤

方差过滤:顾名思义就是依据特征本身的方差来进行筛选过滤,只能处理连续型数值变量(特征)。

处理思路:方差过滤的思路非常简单,对于数据集中的所有特征,我们首先会计算所有特征数据对应的方差,然后自定义设置一个阈值(超参数),丢弃方差小于等于该阈值的特征,保留方差大于该阈值的特征。

方差反应的是一组数据偏离平均值的情况,也就是数据整体波动大小,计算公式如下:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> V a r ( t ) = 1 N − 1 ∑ i = 1 N ( x i − x ˉ ) 2 Var(t) = \frac{1}{N-1}\sum^{N}_{i=1}(x_i - \bar{x})^2 </math>Var(t)=N−11i=1∑N(xi−xˉ)2

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> t t </math>t:数据集下的某特征
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N:特征 <math xmlns="http://www.w3.org/1998/Math/MathML"> t t </math>t 中数据的样本量
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> x i x_i </math>xi:特征 <math xmlns="http://www.w3.org/1998/Math/MathML"> t t </math>t 下的第 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 条数据
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> x ˉ \bar{x} </math>xˉ:特征 <math xmlns="http://www.w3.org/1998/Math/MathML"> t t </math>t 下数据的均值

观察方差过滤的处理流程,也不免会产生几个问题:

  • 为什么计算方差时要除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1,而不是除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N?
  • 为什么要根据方差来对特征来进行过滤?
  • 方差过滤的阈值如何确定?
  • 方差过滤有哪些不足之处?

无偏估计与样本方差

在统计学上,若计算总体方差,则除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N,若计算样本方差,则除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1,若已知总体均数,则计算样本方差时除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1,我们往往不清楚一个总体的总体均数,而是通过抽取样本,计算样本均数,然后用样本均数来代替总体均数。

其实若能计算总体方差,则总体均数也能计算,相当于已知了

很多人可能都会有疑问,为什么要除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1,而不是 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N,但是翻阅资料,发现很多都在说如果除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N,对样本方差的估计不是无偏估计,比总体方差要小,要想是无偏估计就要调小分母,所以除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1,那为什么不是除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 2 N-2 </math>N−2、 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 3 N-3 </math>N−3 等等。在这里我们来完全探讨一下这个问题。

设样本均值为 <math xmlns="http://www.w3.org/1998/Math/MathML"> X ˉ \bar{X} </math>Xˉ,样本方差为 <math xmlns="http://www.w3.org/1998/Math/MathML"> S 2 S^2 </math>S2,总体均值为 <math xmlns="http://www.w3.org/1998/Math/MathML"> μ \mu </math>μ,总体方差为 <math xmlns="http://www.w3.org/1998/Math/MathML"> σ 2 \sigma^2 </math>σ2,样本方差有如下计算公式:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> S 2 = 1 N − 1 ∑ i = 1 N ( x i − X ˉ ) 2 S^2 = \frac{1}{N-1}\sum^N_{i=1}(x_i-\bar{X})^2 </math>S2=N−11i=1∑N(xi−Xˉ)2

无偏估计

无偏估计 :假如你想知道一所大学里学生的平均身高是多少,一个大学好几万人,全部统计有点不现实,但是你可以先随机挑选100个人,统计他们的身高,然后计算出他们的平均值,记为 <math xmlns="http://www.w3.org/1998/Math/MathML"> X 1 ˉ \bar{X_1} </math>X1ˉ,如果直接把 <math xmlns="http://www.w3.org/1998/Math/MathML"> X 1 ˉ \bar{X_1} </math>X1ˉ 作为整体的均值,可能会有一个较大的误差,因为如果你再随机挑选出100个人,身高均值很可能就跟刚才计算的不同,为了使统计结果更加精确,你需要再多抽取几次,然后分别计算出他们的平均值,记为 <math xmlns="http://www.w3.org/1998/Math/MathML"> X 2 ˉ , X 3 ˉ , ⋯   , X 4 ˉ \bar{X_2},\bar{X_3},\cdots,\bar{X_4} </math>X2ˉ,X3ˉ,⋯,X4ˉ,然后在把这些平均值,再做平均,记为 <math xmlns="http://www.w3.org/1998/Math/MathML"> E ( X ˉ ) E(\bar{X}) </math>E(Xˉ),这样的结果肯定比只计算一次更加精确,并且随着重复抽取的次数增多,这个期望值会越来越接近总体均值 <math xmlns="http://www.w3.org/1998/Math/MathML"> μ \mu </math>μ,如果满足 <math xmlns="http://www.w3.org/1998/Math/MathML"> E ( X ˉ ) = μ E(\bar{X})=\mu </math>E(Xˉ)=μ,则这就是一个无偏估计,其中统计的这几个样本均值也都是随机变量, <math xmlns="http://www.w3.org/1998/Math/MathML"> X i ˉ \bar{X_i} </math>Xiˉ 就是 <math xmlns="http://www.w3.org/1998/Math/MathML"> X ˉ \bar{X} </math>Xˉ 的一个取值。无偏估计的意义:在多次重复下,它们的平均数接近所估计的参数真值。

我们接下来用的是反证法,分别假设除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N 和除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1 来计算样本方差,然后推导样本方差的期望,在过程和结果中体会到除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1 的原因。

反证-1

介绍无偏估计的意义就是,我们计算的样本方差,希望它是总体方差的一个无偏估计,那么假如我们的样本方差是如下形式:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> S 2 = 1 N ∑ i = 1 N ( x i − X ˉ ) 2 S^2 = \frac{1}{N}\sum^N_{i=1}(x_i-\bar{X})^2 </math>S2=N1i=1∑N(xi−Xˉ)2

以前面对无偏估计的介绍来看,上面这里计算的 <math xmlns="http://www.w3.org/1998/Math/MathML"> S 2 S^2 </math>S2 就相当于我们在介绍无偏估计时案例中的 <math xmlns="http://www.w3.org/1998/Math/MathML"> X i ˉ \bar{X_i} </math>Xiˉ,也就是其中一个样本均值,同时也是总体方差 <math xmlns="http://www.w3.org/1998/Math/MathML"> μ \mu </math>μ 的一个随机变量,那么,我们根据无偏估计的定义可得:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> E ( S 2 ) = E ( 1 N ∑ i = 1 N ( x i − X ˉ ) ) = E ( 1 N ∑ i = 1 N [ ( x i − μ ) − ( X ˉ − μ ) ] 2 ) ( 引入 μ ) = E ( 1 N ∑ i = 1 N [ ( x i − μ ) 2 − 2 ( x i − μ ) ( X ˉ − μ ) + ( X ˉ − μ ) 2 ] ) ( 展开平方项 ) = E ( 1 N ∑ i = 1 N ( x i − μ ) 2 − 2 ( X ˉ − μ ) 1 N ∑ i = 1 N ( x i − μ ) + ( X ˉ − μ ) 2 ) ( 展开累加符号 ) \begin{align} E(S^2) &= E(\frac{1}{N}\sum^N_{i=1}(x_i-\bar{X})) \\ &= E(\frac{1}{N}\sum^N_{i=1}[(x_i-\mu) - (\bar{X}-\mu)]^2) \quad (引入\mu)\\ &= E(\frac{1}{N}\sum^N_{i=1}[(x_i-\mu)^2-2(x_i-\mu)(\bar{X}-\mu) + (\bar{X}-\mu)^2]) \quad (展开平方项)\\ &= E(\frac{1}{N}\sum^N_{i=1}(x_i-\mu)^2-2(\bar{X}-\mu)\frac{1}{N}\sum^N_{i=1}(x_i-\mu) + (\bar{X}-\mu)^2) \quad (展开累加符号) \end{align} </math>E(S2)=E(N1i=1∑N(xi−Xˉ))=E(N1i=1∑N[(xi−μ)−(Xˉ−μ)]2)(引入μ)=E(N1i=1∑N[(xi−μ)2−2(xi−μ)(Xˉ−μ)+(Xˉ−μ)2])(展开平方项)=E(N1i=1∑N(xi−μ)2−2(Xˉ−μ)N1i=1∑N(xi−μ)+(Xˉ−μ)2)(展开累加符号)

展开累加符号的时候要注意, <math xmlns="http://www.w3.org/1998/Math/MathML"> ( X ˉ − μ ) (\bar{X}-\mu) </math>(Xˉ−μ) 是一个常数。

由于: <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 N ∑ i = 1 N ( x i − μ ) = 1 N ∑ i = 1 N x i − μ = X ˉ − μ \frac{1}{N}\sum^N_{i=1}(x_i-\mu) = \frac{1}{N}\sum^N_{i=1}x_i-\mu = \bar{X}-\mu </math>N1∑i=1N(xi−μ)=N1∑i=1Nxi−μ=Xˉ−μ

则有(上边的式子继续推导):
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> 原式 = E ( 1 N ∑ i = 1 N ( x i − μ ) 2 − 2 ( X ˉ − μ ) 1 N ∑ i = 1 N ( x i − μ ) + ( X ˉ − μ ) 2 ) = E ( 1 N ∑ i = 1 N ( x i − μ ) 2 − 2 ( X ˉ − μ ) 2 + ( X ˉ − μ ) 2 ) = E ( 1 N ∑ i = 1 N ( x i − μ ) 2 − ( X ˉ − μ ) 2 ) = E ( 1 N ∑ i = 1 N ( x i − μ ) 2 ) − E ( ( X ˉ − μ ) 2 ) = σ 2 − E ( ( X ˉ − μ ) 2 ) ≤ σ 2 \begin{align} 原式 &=E(\frac{1}{N}\sum^N_{i=1}(x_i-\mu)^2-2(\bar{X}-\mu)\frac{1}{N}\sum^N_{i=1}(x_i-\mu) + (\bar{X}-\mu)^2)\\ &=E(\frac{1}{N}\sum^N_{i=1}(x_i-\mu)^2-2(\bar{X}-\mu)^2+(\bar{X}-\mu)^2) \\ &=E(\frac{1}{N}\sum^N_{i=1}(x_i-\mu)^2-(\bar{X}-\mu)^2) \\ &=E(\frac{1}{N}\sum^N_{i=1}(x_i-\mu)^2)-E((\bar{X}-\mu)^2) \\ &= \sigma^2 - E((\bar{X}-\mu)^2)\le \sigma^2 \end{align} </math>原式=E(N1i=1∑N(xi−μ)2−2(Xˉ−μ)N1i=1∑N(xi−μ)+(Xˉ−μ)2)=E(N1i=1∑N(xi−μ)2−2(Xˉ−μ)2+(Xˉ−μ)2)=E(N1i=1∑N(xi−μ)2−(Xˉ−μ)2)=E(N1i=1∑N(xi−μ)2)−E((Xˉ−μ)2)=σ2−E((Xˉ−μ)2)≤σ2

由上式可以看出如果除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N,那么样本方差则会小于等于总体方差

我们紧接着上面继续变换式子,看看能发现什么玄乎不:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> 原式 = E ( 1 N ∑ i = 1 N ( x i − μ ) 2 ) − E ( ( X ˉ − μ ) 2 ) = V a r ( X ) − V a r ( X ˉ ) = σ − 1 N σ = N − 1 N σ 即: E ( S 2 ) = N − 1 N σ \begin{align} 原式 &=E(\frac{1}{N}\sum^N_{i=1}(x_i-\mu)^2)-E((\bar{X}-\mu)^2) \\ &=Var(X) - Var(\bar{X}) \\ &=\sigma - \frac{1}{N}\sigma \\ &= \frac{N-1}{N}\sigma \\ 即:&E(S^2)=\frac{N-1}{N}\sigma \end{align} </math>原式即:=E(N1i=1∑N(xi−μ)2)−E((Xˉ−μ)2)=Var(X)−Var(Xˉ)=σ−N1σ=NN−1σE(S2)=NN−1σ

<math xmlns="http://www.w3.org/1998/Math/MathML"> V a r ( X ˉ ) = 1 N σ Var(\bar{X})=\frac{1}{N}\sigma </math>Var(Xˉ)=N1σ: <math xmlns="http://www.w3.org/1998/Math/MathML"> D ( X ) D(X) </math>D(X) 表示随机变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 的方差,根据方差的性质,假设随机变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 与 <math xmlns="http://www.w3.org/1998/Math/MathML"> Y Y </math>Y 相互独立,则有:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> D ( X + Y ) = D ( X ) + D ( Y ) D(X+Y)=D(X)+D(Y) </math>D(X+Y)=D(X)+D(Y)
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> D ( k X ) = k 2 D ( X ) ( k 为常数 ) D(kX)=k^2D(X)\quad (k为常数) </math>D(kX)=k2D(X)(k为常数)

对于我们上面的式子,也就是求样本方差的方差,有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> V a r ( X ˉ ) = D ( X ˉ ) = D ( 1 N ∑ i = 1 N x i ) = 1 N 2 D ( ∑ i = 1 N x i ) = 1 N 2 ∑ i = 1 N D ( x i ) = 1 N 2 N D ( X ) = 1 N D ( X ) Var(\bar{X}) = D(\bar{X})=D(\frac{1}{N}\sum^N_{i=1}x_i)=\frac{1}{N^2}D(\sum^N_{i=1}x_i)=\frac{1}{N^2}\sum^N_{i=1}D(x_i)=\frac{1}{N^2}ND(X)=\frac{1}{N}D(X) </math>Var(Xˉ)=D(Xˉ)=D(N1i=1∑Nxi)=N21D(i=1∑Nxi)=N21i=1∑ND(xi)=N21ND(X)=N1D(X)

<math xmlns="http://www.w3.org/1998/Math/MathML"> ∑ i = 1 N D ( x i ) = N D ( X ) \sum^N_{i=1}D(x_i)=ND(X) </math>∑i=1ND(xi)=ND(X):样本与总体同分布,在同一个分布下的方差是固定的,也就是总体方差,这 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N 个与总体同分布的样本的方差当然也都相同。

  • 总体方差描述的是所有数据的离散程度,也就是每个样本的离散程度。

通过以上推导,我们发现若除以的是 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N 的话,那么样本方差的期望就为 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N σ \frac{N-1}{N}\sigma </math>NN−1σ,并不是总体方差的一个无偏估计,而是总小于总体方差

反证-2

接下来我们假设除以的是 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1,也就是:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> S 2 = 1 N − 1 ∑ i = 1 N ( x i − X ˉ ) 2 S^2 = \frac{1}{N-1}\sum^N_{i=1}(x_i-\bar{X})^2 </math>S2=N−11i=1∑N(xi−Xˉ)2

接下来和上面几乎一样的推导思路:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> E ( S 2 ) = E ( 1 N − 1 ∑ i = 1 N ( x i − X ˉ ) 2 ) = E ( 1 N − 1 ∑ i = 1 N [ ( x i − μ ) − ( X ˉ − μ ) ] 2 ) ( 引入 μ ) = E ( 1 N − 1 ∑ i = 1 N [ ( x i − μ ) 2 − 2 ( x i − μ ) ( X ˉ − μ ) + ( X ˉ − μ ) 2 ] ) ( 展开平方项 ) = E ( 1 N − 1 ∑ i = 1 N ( x i − μ ) 2 − 2 ( X ˉ − μ ) 1 N − 1 ∑ i = 1 N ( x i − μ ) + 1 N − 1 ∑ i = 1 N ( X ˉ − μ ) 2 ) ( 展开累加符号 ) = E ( 1 N − 1 ∑ i = 1 N ( x i − μ ) 2 − 2 N N − 1 ( X ˉ − μ ) 2 + N N − 1 ( X ˉ − μ ) 2 ) = E ( 1 N − 1 ∑ i = 1 N ( x i − μ ) 2 ) − E ( N N − 1 ( X ˉ − μ ) 2 ) = N N − 1 E ( 1 N ∑ i = 1 N ( x i − μ ) 2 ) − N N − 1 E ( ( X ˉ − μ ) 2 ) = N N − 1 V a r ( X ) − N N − 1 V a r ( X ˉ ) = N N − 1 σ 2 − N N − 1 ∗ σ 2 N = σ 2 \begin{align} E(S^2) &= E(\frac{1}{N-1}\sum^N_{i=1}(x_i-\bar{X})^2) \\ &= E(\frac{1}{N-1}\sum^N_{i=1}[(x_i-\mu)-(\bar{X}-\mu)]^2) \quad (引入\mu)\\ &= E(\frac{1}{N-1}\sum^N_{i=1}[(x_i-\mu)^2-2(x_i-\mu)(\bar{X}-\mu) + (\bar{X}-\mu)^2]) \quad (展开平方项)\\ &= E(\frac{1}{N-1}\sum^N_{i=1}(x_i-\mu)^2-2(\bar{X}-\mu)\frac{1}{N-1}\sum^N_{i=1}(x_i-\mu) + \frac{1}{N-1}\sum^N_{i=1}(\bar{X}-\mu)^2) \quad (展开累加符号) \\ &= E(\frac{1}{N-1}\sum^N_{i=1}(x_i-\mu)^2-\frac{2N}{N-1}(\bar{X}-\mu)^2+ \frac{N}{N-1}(\bar{X}-\mu)^2)\\ &= E(\frac{1}{N-1}\sum^{N}{i=1}(x_i-\mu)^2)-E(\frac{N}{N-1}(\bar{X}-\mu)^2) \\ &=\frac{N}{N-1}E(\frac{1}{N}\sum^N{i=1}(x_i-\mu)^2)-\frac{N}{N-1}E((\bar{X}-\mu)^2) \\ &=\frac{N}{N-1}Var(X)-\frac{N}{N-1}Var(\bar{X}) \\ &=\frac{N}{N-1}\sigma^2-\frac{N}{N-1}*\frac{\sigma^2}{N} \\ &= \sigma^2 \end{align} </math>E(S2)=E(N−11i=1∑N(xi−Xˉ)2)=E(N−11i=1∑N[(xi−μ)−(Xˉ−μ)]2)(引入μ)=E(N−11i=1∑N[(xi−μ)2−2(xi−μ)(Xˉ−μ)+(Xˉ−μ)2])(展开平方项)=E(N−11i=1∑N(xi−μ)2−2(Xˉ−μ)N−11i=1∑N(xi−μ)+N−11i=1∑N(Xˉ−μ)2)(展开累加符号)=E(N−11i=1∑N(xi−μ)2−N−12N(Xˉ−μ)2+N−1N(Xˉ−μ)2)=E(N−11i=1∑N(xi−μ)2)−E(N−1N(Xˉ−μ)2)=N−1NE(N1i=1∑N(xi−μ)2)−N−1NE((Xˉ−μ)2)=N−1NVar(X)−N−1NVar(Xˉ)=N−1Nσ2−N−1N∗Nσ2=σ2

可以看到,经过 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1 修正的样本方差的期望是总体方差的一个无偏估计,这就是为什么分母为 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1 而不是 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N。

样本方差与特征信息

数据整体分布越 "散",各个样本值之间的差异就越大,方差就越大,我们就说数据整体的波动也就越大,同理,整体分布越 "密",各个样本值之间的差异就越小,方差就越小,我们就说数据整体的波动就越小。依据方差也就是依据数据整体的波动性来对特征进行过滤。

在一定程度上,某个特征所能提供的特征信息会随着该特征中数据的方差的减小而随之减小

例:我们通过直觉可以判断,房价和占地面积之间相关,占地面积可以作为特征向模型提供信息来预测房价,但是尽管这个特征本身的意义再大,当数据集中该特征下的所有数据的值都相同时,也就没了参考意义,模型也就无法从中获取任何特征信息了。

再举一个例子,例如我们要根据大小、甜度、形状来对苹果、鸭梨、桃子分类,乍一看这三个特征("大小"、 "甜度"、"形状")都是有意义的,但是如果待分类水果的大小都一样,甜度都一样,长得还都一样时,这三个特征尽管本身很有意义,但实际上对于我们来说就没有任何参考价值了。在这个例子中 "我们"就是模型,而 "参考价值" 反映的就是特征信息。

上面的例子是一种极端情况(方差为0),当某特征中数据的方差小于等于某个阈值时,我们就认为它能提供的特征信息太少了,我们过滤掉方差过小的特征也就意味着过滤掉包含特征信息过少的特征。

如何确定方差过滤的阈值

设置阈值为 0:检查和删除方差为0的特征,方差为0的特征表示数据集中所有样本的取值都相同,这对模型训练没有任何帮助,无论我们要做什么,都肯定会先把这些特征删除。

按保留的特征数量来确定阈值:例如我们想通过方差过滤保留一半特征,则可以在计算所有特征的方差并排序后,计算其中位数作为阈值。

当所过滤的特征都是二分类时,特征的取值就是伯努利随机变量,这些变量的方差的计算公式为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> V a r ( t ) = p ( 1 − p ) Var(t) = p(1-p) </math>Var(t)=p(1−p)

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> t t </math>t:数据集下的某特征
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> p p </math>p:二分类中某一类所占的比率

例如我们设置 <math xmlns="http://www.w3.org/1998/Math/MathML"> p p </math>p 为0.8,也就是 <math xmlns="http://www.w3.org/1998/Math/MathML"> 0.8 ( 1 − 0.8 ) 0.8(1-0.8) </math>0.8(1−0.8) 作为阈值,则表示当二分类特征中某种分类占比在80%以上则删除该特征。

具体的阈值需要我们根据具体情况进行测试,在一开始我们可以随便设定一个阈值,经过测试若模型的性能更好了,则说明过滤掉的大部分是噪音,若性能更差了,则说明过滤掉了有用特征,经过不断测试最终确定结果。

ps:阈值可能不太好确定,但是无论如何我们一般都会先使用阈值为 0 的方差过滤对特征进行初步筛选,这对于处理例如手写数字数据这种稀疏矩阵来说非常合适。

方差过滤有哪些不足之处

这里要重点介绍一下方差过滤的坑,如果不假思索的就是随随便便的使用方差过滤进行特征的筛选,可能将重要的特征过滤掉

  • 若每个特征的取值的范围与取值的大小不同(量纲不同),不同特征之间比较方差则并不合适,因为范围和取值更大的特征方差一般也更大。
    • 如何避免:在进行方差过滤前进行数据无量纲化以统一不同特征的量纲
  • 方差阈值难以设置,不同数据集需要调整
  • 只处理数值型特征,对类别型特征无效

方差过滤简单易用,但可能误删有用特征,使用时可以配合其它过滤法使用,设置方差阈值时也需要审慎评估。

相关性过滤

相关性过滤顾名思义就是根据特征与标签之间的相关性强弱来对特征进行筛选过滤,因此重点在于如何计算两变量之间的相关性。

对于卡方检验和F检验,检验相关性的一般步骤:

  1. 建立假设:在统计学上又被称为"无效假设"或"零假设",一般是我们有意去推翻的假设,例如我们想证明两变量之间相关,那我们就假设两变量不相关,然后看结果能不能推翻原假设。
  2. 计算统计量:利用相关统计学方法来根据两变量样本数据计算出某种可以反映出两变量相关性强弱的统计量
  3. 显著性检验:设立显著性水平,计算p值,若p值小于显著性水平则可拒绝原假设,两变量相关,反之不可拒绝原假设,两变量不相关。
    • 显著性水平其实就是一个阈值,当能反映相关性强弱的统计量高于或低于该阈值时,我们就认为可以拒绝原假设,反之则不能。

下面会着重进行讲解,这里只是介绍基本流程

关于相关性过滤,主要介绍的以上步骤的第二步,也就是计算统计量,这也是许多统计相关性分析方法的主要区别所在。

下面我们将介绍三种相关性过滤方法,分别是卡方过滤、F检验、互信息法,其中以卡方过滤为例将整个流程详细进行介绍,对于相似的流程不再做重复讲解。

相关性过滤:卡方过滤

与标签相关且有意义的特征能够为我们提供大量信息,如果特征与标签无关,那只会白白浪费我们的计算内存,可能还会给模型带来噪音。

本文主要介绍三种相关性过滤方法:卡方过滤、F检验、互信息法。

经过卡方过滤的讲解,后面的F检验和互信息法介绍地就相较更为省略了

卡方过滤 :基于卡方检验,专门针对离散型分类变量(特征)的相关性过滤

处理思路 :首先需要计算每个特征和标签之间的卡方统计量,根据所有特征的卡方统计量来对特征进行过滤筛选,按卡方统计量从大到小选择前 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K(超参数)个特征。

卡方检验与卡方分布

卡方检验

卡方检验 (Chi-Square Test):1900年由英国数学家Charl Pearson提出,"卡方" 是由 "Chi-Square" 音译过来的,其中 "Chi" 则是希腊字母 <math xmlns="http://www.w3.org/1998/Math/MathML"> χ \chi </math>χ,卡方又能写为 <math xmlns="http://www.w3.org/1998/Math/MathML"> χ 2 \chi^2 </math>χ2,卡方检验是一种常用的假设检验方法。

卡方检验的一般步骤:

  1. 提出原假设 <math xmlns="http://www.w3.org/1998/Math/MathML"> H 0 H_0 </math>H0
  2. 按不同离散变量的取值(类别)统计各组样本数并将每组数据按 <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 , 2 ⋯   , k 1,2\cdots,k </math>1,2⋯,k 进行编号,共 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 组
    • 例如一共有10个样本、2个特征,特征分别为性别("男":0,"女":1)和是否熬夜("熬夜":0,"不熬夜":1),经过统计我们可以得到四组数据:"性别为男且熬夜"的样本数、"性别为女且熬夜"的样本数、"性别为男且不熬夜"的样本数、"性别为女且不熬夜"的样本数
  3. 把落入第 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 各小区间的Ai的样本值的个数记作 <math xmlns="http://www.w3.org/1998/Math/MathML"> f i f_i </math>fi,被称为组频数(真实值) ,易得所有组频数之和 <math xmlns="http://www.w3.org/1998/Math/MathML"> f 1 + f 2 + ⋯ + f k f_1+f_2+\cdots+f_k </math>f1+f2+⋯+fk 等于样本容量 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n。
    • 继续我们上面的例子,上面统计的四组数据的和也就是所有区间中的样本数加起来也就是我们的总样本数10
  4. 当 <math xmlns="http://www.w3.org/1998/Math/MathML"> H 0 H_0 </math>H0 为真时,根据所假设的总体理论分布,可算出样本落入第 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 组数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> A i A_i </math>Ai 的概率 <math xmlns="http://www.w3.org/1998/Math/MathML"> p i p_i </math>pi,则记 <math xmlns="http://www.w3.org/1998/Math/MathML"> n p i np_i </math>npi 就是落入第 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 个小区间 <math xmlns="http://www.w3.org/1998/Math/MathML"> A i A_i </math>Ai 的样本值的理论频数(理论值) 。
  5. 当 <math xmlns="http://www.w3.org/1998/Math/MathML"> H 0 H_0 </math>H0 为真时, <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 次试验中样本值落入第 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 组数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> A i A_i </math>Ai 的频率 <math xmlns="http://www.w3.org/1998/Math/MathML"> f i n \frac{f_i}{n} </math>nfi 与概率 <math xmlns="http://www.w3.org/1998/Math/MathML"> p i p_i </math>pi 应该很接近,当 <math xmlns="http://www.w3.org/1998/Math/MathML"> H 0 H_0 </math>H0 为假时, <math xmlns="http://www.w3.org/1998/Math/MathML"> f i n \frac{f_i}{n} </math>nfi 与概率 <math xmlns="http://www.w3.org/1998/Math/MathML"> p i p_i </math>pi 应该相差很大。基于这种思想,Karl Pearson(英国数学家) 引进检验统计量,我们称之为卡方统计量,其在零假设成立的情况下服从自由度为 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 的卡方分布

概念性的东西描述起来总是很晦涩,若不理解或看起来比较费劲,可以先看下文的案例。

卡方统计量计算公式:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> χ 2 = ∑ i = 1 k ( f i − n p i ) 2 n p i ,其中 χ i 2 = ( f i − n p i ) 2 n p i \chi^2 = \sum^k_{i=1}\frac{(f_i-np_i)^2}{np_i},其中\chi_i^2 = \frac{(f_i-np_i)^2}{np_i} </math>χ2=i=1∑knpi(fi−npi)2,其中χi2=npi(fi−npi)2

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> f i f_i </math>fi:第 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 组数据的组频数,也就是真实值
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> n p i np_i </math>npi:第 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 组数据的理论频数,也就是理论值
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k:共分了多少组数据

卡方统计量的计算公式是基于 上面提到的 "当 <math xmlns="http://www.w3.org/1998/Math/MathML"> H 0 H_0 </math>H0 为真时, <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 次试验中样本值落入第 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 组数据 <math xmlns="http://www.w3.org/1998/Math/MathML"> A i A_i </math>Ai 的频率 <math xmlns="http://www.w3.org/1998/Math/MathML"> f i n \frac{f_i}{n} </math>nfi 与概率 <math xmlns="http://www.w3.org/1998/Math/MathML"> p i p_i </math>pi 应该很接近,当 <math xmlns="http://www.w3.org/1998/Math/MathML"> H 0 H_0 </math>H0 为假时, <math xmlns="http://www.w3.org/1998/Math/MathML"> f i n \frac{f_i}{n} </math>nfi 与概率 <math xmlns="http://www.w3.org/1998/Math/MathML"> p i p_i </math>pi 应该相差很大" 这种思想得来的,观察公式我们也可以看出,当概率相差越大时,也就是实际频数与理论频数相差越大,最后计算出的统计量也就越大,反之计算出来的统计量就越小,这里我们可以初步得出一个结论:两变量的卡方统计量越大,则其相关性越强。

自由度:统计计量中可自由变化的样本观测值的个数

  • 在卡方检验中,统计分组后会得到一个表格,自由度则为 (行数-1)*(列数-1)
  • 在方差的计算中,方差也等于平方和除以自由度,例如样本方差中分母为 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1;一种常见的说法是随机抽样 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1 次,由于总体的差异(方差)是确定的,则第 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N 个样本就是确定的了,因此自由度为 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1

也许你觉得应该是 行数*列数,具体这里不再进行探讨,感兴趣可以看下面的连接,若理解了本文上方中为什么样本方差除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> N − 1 N-1 </math>N−1 的话应该很好理解。

显著性检验:我们在计算完卡方统计量后,如果要想要拒绝原假设,也就是证明这两个变量相关,只有一个卡方统计量显然是不行的,因为我们不知道具体卡方统计量大于多少才说明相关,拒绝原假设,我们需要继续进行显著性检验。

关于两变量是否相关,我们需要去查卡方分布临界值表(在网上就能搜到),例如:

n/p ... 0.05 ...
... ... ... ...
4 ... 9.49 ...
... ... ... ...

上表中第一列表示 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n(自由度),第一行表示置信度,例如表中当自由度为 4 时,若卡方统计量大于 9.49,则有 99.5% 以上的概率认为两变量相关。我们一般会设定一个阈值,这个阈值又被称为显著性水平,当 <math xmlns="http://www.w3.org/1998/Math/MathML"> α \alpha </math>α(1-置信度) 小于该阈值时,我们则认为可以拒绝原假设,两变量相关。

  • 置信度:例如0.995表示 99.5% 的概率正确。
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> α \alpha </math>α:1-置信度,常被称为p值,也就是原假设成立的概率,当概率小于显著性水平我们就认为原假设不成立,拒绝原假设。

除了卡方分布临界值表外,还有各种临界值表,这些表都是经过不断试验和测试最后汇总得到的,便于对这些统计量在各种情况下进行显著性分析。

卡方分布

特征选择中卡方过滤的重点在于计算卡方统计量,本文下面会稍微介绍一下卡方分布相关的知识作为补充,但是不关注卡方分布对接下来的阅读没什么影响,不感兴趣可以跳过。

卡方分布 :设随机变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> ξ 1 , ξ 2 ⋯ ξ k ( i . i . d ) ∼ N ( 0 , 1 ) \xi_1,\xi_2\cdots \xi_k(i.i.d) \sim N(0,1) </math>ξ1,ξ2⋯ξk(i.i.d)∼N(0,1),则这 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 个服从标准正态分布的随机变量的平方和构成一个新的随机变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> Q Q </math>Q,即 <math xmlns="http://www.w3.org/1998/Math/MathML"> Q = ∑ i = 1 k ξ i 2 Q=\sum^k_{i=1}\xi_i^2 </math>Q=∑i=1kξi2,则称 <math xmlns="http://www.w3.org/1998/Math/MathML"> Q Q </math>Q 为自由度为 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 的 <math xmlns="http://www.w3.org/1998/Math/MathML"> χ 2 \chi^2 </math>χ2 变量,其分布称为自由度为 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 的 <math xmlns="http://www.w3.org/1998/Math/MathML"> χ 2 \chi^2 </math>χ2 分布,正如正态分布中均值或方差不同就是另一个正态分布一样,自由度不同就是另一个 <math xmlns="http://www.w3.org/1998/Math/MathML"> χ 2 \chi^2 </math>χ2 分布。

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> i , i , d i,i,d </math>i,i,d:independent and identically distributed,独立同分布
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> N ( 0 , 1 ) N(0,1) </math>N(0,1):均值为0方差为1的标准正态分布

注意:这里的随机变量是卡方统计量,假设的是各卡方统计量独立同分布且服从标准正态分布,并不是假设的数据中的各个样本值服从正态分布。

卡方分布的概率分布公式:

ps:掘金的Markdown公式块纵向太复杂会叠在一起,这里在其它编辑器输入后以图片方式插入,可能有点糊

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n:自由度
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> Γ ( n 2 ) \Gamma(\frac{n}{2}) </math>Γ(2n):表示的是一个gamma函数

本文对Gamma函数就不再深究了,这里的Gamma函数,它本身是用于泛化阶乘的,例如 <math xmlns="http://www.w3.org/1998/Math/MathML"> 3 3 </math>3 的阶乘为 <math xmlns="http://www.w3.org/1998/Math/MathML"> 3 ∗ 2 ∗ 1 3*2*1 </math>3∗2∗1,但阶乘只能用于表示离散的值,而Gamma函数你可以理解为升级版的阶乘,它不仅能用于这些离散的整数,连续的变量也可以用。

如果你想更多地了解Gamma函数,一篇不错的文章指路(英文):Gamma函数

卡方分布的概率密度函数如下图:

相关代码以供参考(可以忽略并折叠):

python 复制代码
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy.special import gamma

# 定义概率密度函数
def f(x, n):
    if x > 0:
        return ((1 / (2**(n/2) * gamma(n/2))) * (x ** ((n/2)-1)) * np.exp(-x/2))
    else:
        return 0
# 向量化函数
f = np.vectorize(f)

rns = np.random.RandomState(42)
x = sorted(rns.rand(100)*15)
y_1 = f(x, 1)
y_2 = f(x, 2)
y_4 = f(x, 4)
y_6 = f(x, 6)

rc = {'font.family': 'Microsoft YaHei'}
mpl.rcParams.update(rc)
plt.style.use('ggplot')

plt.figure()
plt.plot(x, y_1, color='red', alpha=0.6, label='n=1')
plt.plot(x, y_2, color='blue', alpha=0.6, label='n=2')
plt.plot(x, y_4, color='green', alpha=0.6, label='n=4')
plt.plot(x, y_6, color='deeppink', alpha=0.6, label='n=6')
plt.xlabel('x')
plt.ylabel('概率密度f(x)')
plt.title('$\chi^2$ - 卡方分布')
plt.legend()
plt.show()

卡方分布有两个重要性质:

  • 若随机变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> X ∼ χ n 2 X \sim \chi_n^2 </math>X∼χn2,则期望 <math xmlns="http://www.w3.org/1998/Math/MathML"> E ( X ) = n E(X)=n </math>E(X)=n,方差 <math xmlns="http://www.w3.org/1998/Math/MathML"> D ( X ) = 2 n D(X)=2n </math>D(X)=2n
  • 若随机变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> X 1 , X 2 ∼ χ n 2 X_1,X_2 \sim \chi_n^2 </math>X1,X2∼χn2 且 <math xmlns="http://www.w3.org/1998/Math/MathML"> X 1 X_1 </math>X1 与 <math xmlns="http://www.w3.org/1998/Math/MathML"> X 2 X_2 </math>X2 相互独立,则 <math xmlns="http://www.w3.org/1998/Math/MathML"> X 1 + X 2 ∼ χ n 1 + n 2 2 X_1+X_2 \sim \chi^2_{n_1+n_2} </math>X1+X2∼χn1+n22

在零假设的前提条件下,假设卡方统计量公式中的 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( f i − n p i ) 2 n p i \frac{(f_i-np_i)^2}{np_i} </math>npi(fi−npi)2(随机变量) 服从标准正态分布且随机变量之间独立同分布,则卡方统计量当然服从自由度为 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 的卡方分布。

案例说明

:存在一些关于人是否喝牛奶和是否感冒的样本,现在我们想知道,"是否喝牛奶" 与 "是否感冒" 之间是否相关(案例仅供参考),计算这两个变量之间的卡方统计量。

原数据样本:

序号 是否喝牛奶 是否感冒
1 喝牛奶 感冒
2 不喝牛奶 感冒
3 喝牛奶 未感冒
... ... ...

统计分组后,是否喝牛奶和是否感冒的人数如下表格所示:

感冒 未感冒 总计
喝牛奶 43 96 139
不喝牛奶 28 84 112
总计 71 180 251

可以计算出:

  • 喝牛奶的感冒率: <math xmlns="http://www.w3.org/1998/Math/MathML"> 43 139 ≈ 30.94 % \frac{43}{139}\approx 30.94\% </math>13943≈30.94%,未感冒率 <math xmlns="http://www.w3.org/1998/Math/MathML"> 96 139 ≈ 69.06 % \frac{96}{139} \approx 69.06\% </math>13996≈69.06%
  • 不喝牛奶的感冒率: <math xmlns="http://www.w3.org/1998/Math/MathML"> 28 112 = 25 % \frac{28}{112} = 25\% </math>11228=25%,未感冒率 <math xmlns="http://www.w3.org/1998/Math/MathML"> 84 112 = 75 % \frac{84}{112}=75\% </math>11284=75%

① 建立假设:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> H 0 H_0 </math>H0(原假设):是否喝牛奶和是否感冒不相关

我们假设是否喝牛奶与是否感冒无关,已知251个样本中71个人感冒了,则可以计算出:

  • 感冒率: <math xmlns="http://www.w3.org/1998/Math/MathML"> 71 251 ≈ 28.29 % \frac{71}{251} \approx 28.29\% </math>25171≈28.29%
  • 未感冒率: <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 − 71 251 ≈ 71.71 % 1-\frac{71}{251}\approx 71.71\% </math>1−25171≈71.71%

我们把这251个人由 喝牛奶 和 不喝牛奶 区分开,喝牛奶的一共139人,不喝牛奶的一共112人,由于喝牛奶和感冒之间不相关,我们只需要使用我们上方计算的感冒率来计算理论人数,理论上对于喝牛奶的这群人中,感冒的人数应该为 <math xmlns="http://www.w3.org/1998/Math/MathML"> 139 ∗ 0.2829 139*0.2829 </math>139∗0.2829,未感冒的人数应该为 <math xmlns="http://www.w3.org/1998/Math/MathML"> 139 ∗ 0.7171 139*0.7171 </math>139∗0.7171,同理对于不喝牛奶的这群人中,理论上感冒的人数应该为 <math xmlns="http://www.w3.org/1998/Math/MathML"> 112 ∗ 0.2829 112*0.2829 </math>112∗0.2829,未感冒的人数应该为 <math xmlns="http://www.w3.org/1998/Math/MathML"> 112 ∗ 0.7171 112*0.7171 </math>112∗0.7171。因此理论上的表格应该是这样的:

感冒 未感冒 总计
喝牛奶 39.32 99.68 139
不喝牛奶 31.68 80.32 112
总计 71 180 251

因此我们得到:

  • 组1:喝牛奶且感冒:组频数 <math xmlns="http://www.w3.org/1998/Math/MathML"> f i = 43 f_i=43 </math>fi=43,理论频数 <math xmlns="http://www.w3.org/1998/Math/MathML"> n p i = 39.32 np_i = 39.32 </math>npi=39.32
  • 组2:喝牛奶且未感冒:组频数 <math xmlns="http://www.w3.org/1998/Math/MathML"> f i = 96 f_i=96 </math>fi=96,理论频数 <math xmlns="http://www.w3.org/1998/Math/MathML"> n p i = 99.68 np_i = 99.68 </math>npi=99.68
  • 组3:不喝牛奶且感冒:组频数 <math xmlns="http://www.w3.org/1998/Math/MathML"> f i = 28 f_i=28 </math>fi=28,理论频数 <math xmlns="http://www.w3.org/1998/Math/MathML"> n p i = 31.68 np_i = 31.68 </math>npi=31.68
  • 组4:不喝牛奶且未感冒:组频数 <math xmlns="http://www.w3.org/1998/Math/MathML"> f i = 84 f_i=84 </math>fi=84,理论频数 <math xmlns="http://www.w3.org/1998/Math/MathML"> n p i = 80.32 np_i = 80.32 </math>npi=80.32

因此我们可以计算出卡方统计量:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> χ 2 = χ 1 2 + χ 2 2 + χ 3 2 + χ 4 2 = ( 43 − 39.32 ) 2 39.32 + ( 96 − 99.68 ) 2 99.68 + ( 28 − 31.68 ) 2 31.68 + ( 84 − 80.32 ) 2 90 / 32 ≈ 1.076 \begin{align} \chi^2 &= \chi_1^2 + \chi_2^2 + \chi_3^2 + \chi_4^2 \\ &= \frac{(43-39.32)^2}{39.32}+\frac{(96-99.68)^2}{99.68}+\frac{(28-31.68)^2}{31.68}+\frac{(84-80.32)^2}{90/32} \\ &\approx1.076 \end{align} </math>χ2=χ12+χ22+χ32+χ42=39.32(43−39.32)2+99.68(96−99.68)2+31.68(28−31.68)2+90/32(84−80.32)2≈1.076

计算出卡方统计量后,我们可以轻易计算出自由度为 1,然后再去查表观察 <math xmlns="http://www.w3.org/1998/Math/MathML"> α \alpha </math>α 是否小于显著性水平即可。

超参数 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K 的确定

根据特征个数进行过滤:在某一数据集下,我们可以在计算完所有特征与标签各自的卡方统计量后进行从大到小排序,卡方统计量越大表示相关性越强,然后选择前 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K 个特征。对于 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K 的确定:

  • 基于不同 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K 的取值与模型性能画折线图,通过测试来发现一个对模型性能影响不大且能有效过滤特征的值作为 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K 的取值。
  • 基于预先定义的显著性水平,一般为0.05,然后计算有多少个特征的p值小于显著性水平,拒绝原假设,然后将该值作为 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K 的取值来筛选特征。

相关性过滤:F检验

F检验(F-test):由英国统计学家 Fisher 提出,最常用的别名叫做联合假设检验(joint hypotheses test),此外也称方差比率检验、方差齐性检验、方差分析ANOVA,它是一种在零假设之下,统计值服从F分布的检验。用于判断两个及以上的样本的方差是否有差别的显著性检验,适用于两个或多个样本的检验。

F检验认为不同处理组的均数间的差别来源两个:

  • 组间差异(between-group variation):是不同的处理造成的差异,反映不同组之间的差异;用变量在各组的均值与总均值之偏差的平方和的总和表示(不同组均值组成的这组数据的方差),即为SSA,其中组间自由度=组数-1
  • 组内差异(within-group variation):反映同一组内部的随机误差;例如个体间的差异等,用变量在各组的均值与该组内变量值之偏差平方和(每组数据的方差)的总和表示,记为SSE,其中组内自由度则为样本总数-组数(这里减去组数的原因和上方卡方检验中行-1乘以列-1的原因一样)

检验统计量计算公式:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> F = 组间误差 组内误差 = S S A S S E F = \frac{组间误差}{组内误差}=\frac{SSA}{SSE} </math>F=组内误差组间误差=SSESSA

例如变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> Y Y </math>Y,组间误差是 <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 与 <math xmlns="http://www.w3.org/1998/Math/MathML"> Y Y </math>Y 之间的差异,而组内误差则是 <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 与 <math xmlns="http://www.w3.org/1998/Math/MathML"> Y Y </math>Y 自己样本数据的差异的和,F统计量为组间差异与组内差异的比值,其值越大,说明组间差异相对于组内差异越显著,超过预先设定的某阈值,则认为不同组的均值或方差存在显著差异

F检验的本质:寻找两组数据之间的线性关系,其原假设是 "数据不存在显著的线性关系"。

我自己的理解(不权威,若有错请指出):F检验假设各个样本独立且服从正态分布,在正态分布中我们知道,不同的正态分布由样本均值和样本方差来决定,在正态分布曲线中,均值决定"位置",方差决定"高低",同时不同的方差也决定整个曲线的不同形状(宽胖矮瘦),若两个变量之间的方差相对来说相差很小的话,那这两个变量对应的正态分布曲线就有着类似的形状,也就是两变量之间有着比较强的线性关系,直接在同一分布下比较其方差的话无法做到前面说的"相对",因此F统计量采取组间误差与组内误差的比值来保证这种公平性。

讲到这里,也许你会想到,如果组间差异和组内差异都很大的时候,但组间差异更大,最后的F值很大,也超过了预先定义的阈值,是不是说明存在显著差异呢?----当然不是,我们在做F检验的时候需要优化试验设计来减小组内差异,组内差异大说明该变量本身就不稳定,若几个变量的组内差异很小,则说明这几个变量都较为稳定,可以更准确地反应该变量的信息,这时候我们再去比较组间差异,这样的结果才更有说服力。

  • 例如我们找了三个学生,我们经过他们的最近5次考试成绩来进行F检验:
    • 组间差异大,组内差异小:例如学生A全考了150,学生B全考了100,学生C全考了50,这三个学生成绩本身都很稳定,组间差异却很大,我们认为这三个学生的成绩之间存在显著差异。
    • 组间差异小,组内差异大:学生A(150, 100, 50, 20, 120),学生B(149, 99, 49, 19, 119),学生C(148, 98, 48, 18, 118),这三个学生成绩都很不稳定,啥分都考过,但是因为在0-150之间啥分都考,因此组间差异小,我们认为这三个学生的成绩之间不存在显著差异。
    • 组间差异大,组内差异大:例如学生A(150, 100, 50, 20, 120),学生B(50, 100, 20, 10, 150),学生C(30, 40, 140, 10, 20),这三个学生成绩都不稳定,但是若三个学生考的分都是0-150啥分都有,则说明组间差异相对组内差异小,我们认为不存在显著性差异,若三个学生考的分第一个5次都在100-150之间,第二个都在50-100之间,第三个都在0-50之间,我们就认为组间差异相比组内差异大,这三个学生的成绩之间存在显著性差异。
    • 组间差异小,组内差异小:例如学生A全考了150,学生B全考了145,学生C全考了140,这时候若三个学生均分之间的差异小,但上面这个案例中它们组内差异相对均分之间的差异更小,学生成绩都非常稳定,这时候我们就认为存在显著性差异,反之就是不存在。

解释下这里的"相对":如果两个人=学生考5次,都是0-150啥分都考过,直觉上我们就不能认为这俩学生水平差不多,如果两个人考5此,一个学生五次都是150,另一学生五次都是50,直觉上我们肯定认为这俩学生水平差太多了,因此两变量之间的差异也是要看变量本身的稳定性的。

F检验的假设条件:

  1. 各个样本独立且服从正态分布
  2. 每组样本数相同

从F检验的假设条件我们也可以看出,首先我们的数据集中每个特征中的样本数肯定是相同的,然后F检验假设各个样本服从正态分布,我们则可以在数据预处理时对特征进行数据标准化,让数据服从正态分布,以达到最好的效果。

F检验的一般步骤: 设共 <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N 组数据,样本数为 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n,第 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 组数据的均值为 <math xmlns="http://www.w3.org/1998/Math/MathML"> X i ˉ \bar{X_i} </math>Xiˉ,所有组数据的均值为 <math xmlns="http://www.w3.org/1998/Math/MathML"> ξ ˉ \bar{\xi} </math>ξˉ,

  1. 提出原假设,设定显著性水平 <math xmlns="http://www.w3.org/1998/Math/MathML"> α \alpha </math>α
    • <math xmlns="http://www.w3.org/1998/Math/MathML"> H 0 H_0 </math>H0:变量之间没有显著性差异
    • <math xmlns="http://www.w3.org/1998/Math/MathML"> α = 0.05 \alpha=0.05 </math>α=0.05
  2. 计算每组数据的组间方差和组内方差
    • <math xmlns="http://www.w3.org/1998/Math/MathML"> S S A (组间差异) SSA(组间差异) </math>SSA(组间差异) = <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 N − 1 ∑ i = 1 N ( X i ˉ − ξ ˉ ) 2 \frac{1}{N-1}\sum^N_{i=1}(\bar{X_i}-\bar{\xi})^2 </math>N−11∑i=1N(Xiˉ−ξˉ)2
    • <math xmlns="http://www.w3.org/1998/Math/MathML"> S S E (组内差异) SSE(组内差异) </math>SSE(组内差异) = <math xmlns="http://www.w3.org/1998/Math/MathML"> ∑ i = 1 N 1 n − N ∑ j = 1 n ( x j − X i ˉ ) 2 \sum^N_{i=1}\frac{1}{n-N}\sum^n_{j=1}(x_j-\bar{X_i})^2 </math>∑i=1Nn−N1∑j=1n(xj−Xiˉ)2
  3. 以组间方差和组内方差计算F统计量
  4. 显著性检验
    • 查表,比较F统计量在对应情况下的置信度,1-置信度得到p值,比较p值和预先定义的显著性水平 <math xmlns="http://www.w3.org/1998/Math/MathML"> α \alpha </math>α,若p值小于 <math xmlns="http://www.w3.org/1998/Math/MathML"> α \alpha </math>α,则拒绝原假设,认为有显著性差异,反之原假设成立。

相关性过滤:互信息法

互信息法(Mutual Information):互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法,既可以做回归也可以做分类;

互信息法比F检验更加强大,F检验只能够找出线性关系,而互信息法可以找出任意关系。

互信息:两个随机变量的互信息是变量间相互依赖性的量度。

互信息衡量两个随机变量之间共享的信息多少,也就是已知随机变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 的所有信息,这对随机变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> Y Y </math>Y 的不确定性减少的程度,用 <math xmlns="http://www.w3.org/1998/Math/MathML"> I ( X ; Y ) I(X;Y) </math>I(X;Y)表示。

就是说两变量之间有一部分信息都有,如果我们知道了其中一个变量的所有信息,因为有一部分信息是共有的,所以我们也知道了另一个变量的部分信息,那另一个变量的不确定性就减少了一部分。

若理解过决策树模型原理,应该会对信息熵这一概念较为熟悉,本文这里就不重新介绍了,可以通过下方链接去阅读信息熵部分:

信息熵 :信息熵是信息量的期望,常用于去度量无序程度,也就是对不确定性的度量,这里我们用 <math xmlns="http://www.w3.org/1998/Math/MathML"> H H </math>H 来表示。
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> H ( X ) = e n t r o p y ( X ) = − ∑ i = 1 N p ( x i ) l o g p ( x i ) H(X)=entropy(X)=-\sum^N_{i=1}p(x_i)logp(x_i) </math>H(X)=entropy(X)=−i=1∑Np(xi)logp(xi)

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> H ( X ) H(X) </math>H(X):变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 的不确定度(图中黄色区域)
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> H ( Y ) H(Y) </math>H(Y):变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> Y Y </math>Y 的不确定度(图中绿色区域)
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> I ( X ; Y ) I(X;Y) </math>I(X;Y):已知其中一个变量,另一个变量的不确定度减少的部分(图中共有部分)
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> H ( X ∣ Y ) H(X|Y) </math>H(X∣Y):已知 <math xmlns="http://www.w3.org/1998/Math/MathML"> Y Y </math>Y 下变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 的不确定度(图中黄色减去共有部分)
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> H ( Y ∣ X ) H(Y|X) </math>H(Y∣X):已知 <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 下变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> Y Y </math>Y 的不确定度(图中绿色减去共有部分)
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> H ( X , Y ) H(X,Y) </math>H(X,Y):变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> Y Y </math>Y 总共的不确定度(除去共有的黄色区域和绿色区域+共有区域)

已知条件:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> H ( X ) = − ∑ i = 1 N p ( x i ) l o g p ( x i ) H(X)=-\sum^N_{i=1}p(x_i)logp(x_i) </math>H(X)=−∑i=1Np(xi)logp(xi)
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> H ( Y ) = − ∑ i = 1 N p ( y i ) l o g p ( y i ) H(Y)=-\sum^N_{i=1}p(y_i)logp(y_i) </math>H(Y)=−∑i=1Np(yi)logp(yi)
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> H ( X , Y ) = − ∑ i = 1 N p ( x i , y i ) l o g p ( x i , y i ) H(X,Y)=-\sum^N_{i=1}p(x_i,y_i)logp(x_i,y_i) </math>H(X,Y)=−∑i=1Np(xi,yi)logp(xi,yi)

这里的 <math xmlns="http://www.w3.org/1998/Math/MathML"> H ( X , Y ) H(X,Y) </math>H(X,Y) 是一个联合熵,其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> p ( x i , y i ) p(x_i,y_i) </math>p(xi,yi) 表示的是联合概率,也就是同时抽到 <math xmlns="http://www.w3.org/1998/Math/MathML"> x i x_i </math>xi 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> y i y_i </math>yi

观察上图,我们发现共有区域相当于黄色区域加绿色区域再减去共有区域,因此有如下关系:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> I ( X ; Y ) = H ( Y ) − H ( Y ∣ X ) = − H ( Y ∣ X ) + H ( Y ) = − ∑ i = 1 N p ( x i ) H ( Y ∣ X = x i ) − ∑ j = 1 N p ( y j ) l o g p ( y j ) = ∑ i = 1 N p ( x i ) [ ∑ j = 1 N p ( y j ∣ x i ) l o g p ( y j ∣ x i ) ] − ∑ j = 1 N l o g p ( y j ) [ ∑ i = 1 N p ( x i , y j ) ] = ∑ i , j = 1 N p ( x i ) p ( y j ∣ x i ) l o g p ( y j ∣ x i ) − ∑ i , j = 1 N p ( x i , y j ) l o g p ( y j ) = ∑ i , j = 1 N p ( x i , y j ) ( l o g p ( x i , y j ) − l o g p ( x i ) ) − ∑ i , j = 1 N p ( x i , y j ) l o g p ( y j ) = ∑ i , j = 1 N p ( x i , y j ) l o g p ( x i , y j ) p ( x i ) − ∑ i , j = 1 N p ( x i , y j ) l o g p ( y j ) = ∑ i , j = 1 N p ( x i , y j ) l o g p ( x i , y j ) p ( x i ) p ( y j ) \begin{align} I(X;Y) &= H(Y)-H(Y|X) \\ &= -H(Y|X)+H(Y) \\ &=-\sum^N_{i=1}p(x_i)H(Y|X=x_i) - \sum^N_{j=1}p(y_j)logp(y_j) \\ &= \sum^N_{i=1}p(x_i)[\sum^N_{j=1}p(y_j|x_i)logp(y_j|x_i)] - \sum_{j=1}^Nlogp(y_j)[\sum^{N}{i=1}p(x_i,y_j)] \\ &=\sum{i,j=1}^Np(x_i)p(y_j|x_i)logp(y_j|x_i)-\sum^N_{i,j=1}p(x_i,y_j)logp(y_j) \\ &=\sum_{i,j=1}^Np(x_i,y_j)(logp(x_i,y_j)-logp(x_i)) - \sum^N_{i,j=1}p(x_i,y_j)logp(y_j) \\ &=\sum^N_{i,j=1}p(x_i,y_j)log\frac{p(x_i,y_j)}{p(x_i)}-\sum^N_{i,j=1}p(x_i,y_j)logp(y_j) \\ &=\sum^N_{i,j=1}p(x_i,y_j)log\frac{p(x_i,y_j)}{p(x_i)p(y_j)} \end{align} </math>I(X;Y)=H(Y)−H(Y∣X)=−H(Y∣X)+H(Y)=−i=1∑Np(xi)H(Y∣X=xi)−j=1∑Np(yj)logp(yj)=i=1∑Np(xi)[j=1∑Np(yj∣xi)logp(yj∣xi)]−j=1∑Nlogp(yj)[i=1∑Np(xi,yj)]=i,j=1∑Np(xi)p(yj∣xi)logp(yj∣xi)−i,j=1∑Np(xi,yj)logp(yj)=i,j=1∑Np(xi,yj)(logp(xi,yj)−logp(xi))−i,j=1∑Np(xi,yj)logp(yj)=i,j=1∑Np(xi,yj)logp(xi)p(xi,yj)−i,j=1∑Np(xi,yj)logp(yj)=i,j=1∑Np(xi,yj)logp(xi)p(yj)p(xi,yj)

对于其中一步变换 <math xmlns="http://www.w3.org/1998/Math/MathML"> l o g p ( y j ∣ x i ) = l o g p ( x i , y j ) − l o g p ( x i ) logp(y_j|x_i)=logp(x_i,y_j)-logp(x_i) </math>logp(yj∣xi)=logp(xi,yj)−logp(xi) 的解释:
>

<math xmlns="http://www.w3.org/1998/Math/MathML"> l o g p ( x ) logp(x) </math>logp(x) 是信息量公式,表示的是事件 <math xmlns="http://www.w3.org/1998/Math/MathML"> x x </math>x 发生产生的信息量, <math xmlns="http://www.w3.org/1998/Math/MathML"> l o g p ( y j ∣ x i ) logp(y_j|x_i) </math>logp(yj∣xi) 指的是 <math xmlns="http://www.w3.org/1998/Math/MathML"> x i x_i </math>xi 被抽到后 <math xmlns="http://www.w3.org/1998/Math/MathML"> y j y_j </math>yj 的信息量(维恩图中的 <math xmlns="http://www.w3.org/1998/Math/MathML"> I n f o ( Y ∣ X ) Info(Y|X) </math>Info(Y∣X)区域),该值等于 <math xmlns="http://www.w3.org/1998/Math/MathML"> x i x_i </math>xi 与 <math xmlns="http://www.w3.org/1998/Math/MathML"> y j y_j </math>yj 都被抽到时的信息量(维恩图中的 <math xmlns="http://www.w3.org/1998/Math/MathML"> I n f o ( X , Y ) Info(X,Y) </math>Info(X,Y) 区域)减去 <math xmlns="http://www.w3.org/1998/Math/MathML"> x i x_i </math>xi 被抽到时的信息量(维恩图中的 <math xmlns="http://www.w3.org/1998/Math/MathML"> I n f o ( X ) Info(X) </math>Info(X)区域)。

至此,我们便得到了关于互信息 <math xmlns="http://www.w3.org/1998/Math/MathML"> I ( X ; Y ) I(X;Y) </math>I(X;Y) 的公式,即:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> I ( X ; Y ) = ∑ i , j = 1 N p ( x i , y j ) l o g p ( x i , y j ) p ( x i ) p ( y j ) I(X;Y) =\sum^N_{i,j=1}p(x_i,y_j)log\frac{p(x_i,y_j)}{p(x_i)p(y_j)} </math>I(X;Y)=i,j=1∑Np(xi,yj)logp(xi)p(yj)p(xi,yj)

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> N N </math>N:样本数
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> X , Y X,Y </math>X,Y:随机变量 <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> Y Y </math>Y
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> x i x_i </math>xi: <math xmlns="http://www.w3.org/1998/Math/MathML"> X X </math>X 中第 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 个样本
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> y j y_j </math>yj: <math xmlns="http://www.w3.org/1998/Math/MathML"> Y Y </math>Y 中第 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j 个样本

互信息越大,说明变量之间相关性越强,反之则说明相关性越弱。

观察上图以及上面所说的互信息的概念,易得有:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> I ( X ; Y ) = I ( Y ; X ) I(X;Y) = I(Y;X) </math>I(X;Y)=I(Y;X)

在理解了互信息是如何计算之后,想必对于特征选择的方法也很清晰了:计算特征与之间的互信息,互信息越大,说明两变量越相关,也就是该特征越重要,然后根据互信息大小对特征进行选择,将特征按互信息大小降序排序后,自定义选择前 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K 个特征,至于超参数 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K 的取值,也是需要经验和不断测试来确定的。

过滤法总结

文章一共讲解了方差过滤以及三种相关性过滤方法,算法流程都很简单,本文只是将其中的数学概念和原理进行剖析讲解,过滤法无非就是根据某一可以一定程度上衡量特征所包含特征信息的多少的指标来对特征进行筛选,方差过滤中这一指标就是方差,相关性过滤中这一指标就是特征与标签之间的相关性。

通常来说,我们会先使用方差过滤对特征进行初步筛选,然后利用互信息法来捕捉相关性,相比卡方检验和F检验,互信息法往往更为常用。

Reference

相关推荐
Kenneth風车4 分钟前
【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
人工智能·算法·低代码·机器学习·数据分析
凌不了云6 分钟前
windows环境下安装python第三方包
开发语言·python
AI小白龙*6 分钟前
大模型团队招人(校招):阿里巴巴智能信息,2025届春招来了!
人工智能·langchain·大模型·llm·transformer
大熊程序猿7 分钟前
python 读取excel数据存储到mysql
数据库·python·mysql
生椰拿铁You10 分钟前
Python
python
鸽芷咕12 分钟前
【Python报错已解决】python setup.py bdist_wheel did not run successfully.
开发语言·python·机器学习·bug
空指针异常Null_Point_Ex28 分钟前
大模型LLM之SpringAI:Web+AI(一)
人工智能·chatgpt·nlp
清纯世纪39 分钟前
基于深度学习的图像分类或识别系统(含全套项目+PyQt5界面)
开发语言·python·深度学习
孤华暗香44 分钟前
Python快速入门 —— 第三节:类与对象
开发语言·python
didiplus1 小时前
【趣学Python算法100例】百钱百鸡
python·算法·百钱百鸡