三、特征选择

三、特征选择,第1张

线性相关性F检验特征筛选
  • 一、F检验的基本思路
  • 二、python实现F检验线性相关

一、F检验的基本思路

  从理论上来说,F计算量的分子和分母都是服从卡方分布的, F = S S B / ( k − 1 ) S S E / ( n − k ) F=\frac{SSB/(k-1)}{SSE/(n-k)} F=SSE/(nk)SSB/(k1)中,分子是服从自由度为n-k的卡方分布,而分母是服从自由度为n-k的卡方分布,且能够证明二者相互独立。也就是说,统计检验量F是借助卡方分布构建的,更进一步来说,只要是相互独立的、服从卡方分母的随机变量,相除构成的随机变量都是服从F分布的。而F统计量的标准表达公式如下: F = X 1 / d 1 X 2 / d 2 F=\frac{X_1/d_1}{X_2/d_2} F=X2/d2X1/d1其中 X 1 X_1 X1 X 2 X_2 X2相互独立且服从自由度为 d 1 d_1 d1 d 2 d_2 d2的卡方分布,此时随机变量F服从自由度为( d 1 , d 2 d_1,d_2 d1,d2)的F分布。

  f_classif和chi2检验能够很好的解决分类问题的特征筛选。而如果是回归问题,sklearn提供了一种基于F检验的线性相关性检验方法f_regression,该检验方法并不常见。

f_regression构建了一个如下形式的F统计量:

F = r x y 2 1 − r x y 2 ∗ ( n − 2 ) F = \frac{r^2_{xy}}{1-r^2_{xy}} * (n-2) F=1rxy2rxy2(n2)

其中 r x y r_{xy} rxy为两个连续变量的相关系数,并且满足自由度为(1,n-2)的F分布。该计算过程并不复杂,并且统计量F和 r x y 2 r_{xy}^2 rxy2变化方向一致,即与相关系数绝对值的变化保持一致,本质上和相关系数一样,也是衡量了两个变量之间的相关性,并且是一种线性相关关系,并且数值越大、线性相关关系越强,反之则越弱。这些都不难理解,但问题是为什么 r x y 2 1 − r x y 2 ∗ ( n − 2 ) \frac{r^2_{xy}}{1-r^2_{xy}} * (n-2) 1rxy2rxy2(n2)会服从F分布呢?这里我们需要先回顾下 r x y r_{xy} rxy的计算公式,相关系数的计算公式是用xy的协方差除以x的标准差和y的标准差之积:

r x y = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 r_{xy} = \frac{\sum^n_{i=1} (x_i-\bar x)(y_i-\bar y)}{\sqrt{\sum_{i=1}^n(x_i-\bar x)^2}\sqrt{\sum_{i=1}^n(y_i-\bar y)^2}} rxy=i=1n(xixˉ)2 i=1n(yiyˉ)2 i=1n(xixˉ)(yiyˉ)

  相关系数的另一种解释方法是相互解释的变异占变异的比例。同离散变量的方差分析类似,定义总变差(Total variation)为SST:

S S T = ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 SST = \sum_{i=1}^n(x_i-\bar x)^2\sum_{i=1}^n(y_i-\bar y)^2 SST=i=1n(xixˉ)2i=1n(yiyˉ)2

而已经解释的变差(Explained variation)为SSR:

S S R = ( ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ) 2 SSR=(\sum_{i=1}^n ( x_i-\bar x)(y_i-\bar y))^2 SSR=(i=1n(xixˉ)(yiyˉ))2

则有:

r x y 2 = S S R S S T r_{xy}^2=\frac{SSR}{SST} rxy2=SSTSSR

类似的,未解释的变差部分我们也可以用SSE来进行表示,即SSE=SST-SSR。

  这里需要注意,如果这里不是x和y,而是y的预测值和y的真实值,则决定系数 R 2 = S S R S S T R^2=\frac{SSR}{SST} R2=SSTSSR。这也是为何经常会说决定系数实际上就是相关系数的平方的结论。此时我们再看 r x y 2 1 − r x y 2 \frac{r^2_{xy}}{1-r^2_{xy}} 1rxy2rxy2所代表的含义,就非常清楚了:

r x y 2 1 − r x y 2 = S S R / S S T 1 − S S R / S S T = S S R S S E \frac{r^2_{xy}}{1-r^2_{xy}}=\frac{SSR/SST}{1-SSR/SST}=\frac{SSR}{SSE} 1rxy2rxy2=1SSR/SSTSSR/SST=SSESSR

已解释的变差和未解释的变差比例,而(n-2)实际上就是自由度,即:

F = r x y 2 1 − r x y 2 ∗ ( n − 2 ) = S S R / 1 S S E / ( n − 2 ) F = \frac{r^2_{xy}}{1-r^2_{xy}} * (n-2)=\frac{SSR/1}{SSE/(n-2)} F=1rxy2rxy2(n2)=SSE/(n2)SSR/1

相当于是对统计量的修正,而最终 r x y 2 1 − r x y 2 ∗ ( n − 2 ) ∼ F ( 1 , n − 2 ) \frac{r^2_{xy}}{1-r^2_{xy}} * (n-2)\sim F(1, n-2) 1rxy2rxy2(n2)F(1,n2)

  一旦找到了检验统计变量,我们就可以推断当前事件发生的概率,进而有理有据的接受或者拒绝零假设。而这里的基于相关系数的检验,零假设是二者不存在线性相关关系。由于最终的检验统计变量仍然是服从F分布的,因此我们称其为线性相关性的F检验。

  并且,此时假设检验中零假设与备择假设如下:

H 0 : 两 个 连 续 变 量 间 不 存 在 线 性 相 关 关 系 H_0:两个连续变量间不存在线性相关关系 H0:线
H 0 : 两 个 连 续 变 量 间 存 在 线 性 相 关 关 系 H_0:两个连续变量间存在线性相关关系 H0:线

该方法的缺点是只能检测线性相关关系,但不相关不代表独立,可能是非线性相关关系。

二、python实现F检验线性相关
import pandas as pd
import numpy as np
import random
# 构建数据
random.seed(6)

df = pd.DataFrame({'Y':[random.uniform(1,200) for _ in range(1381)],'X':[random.uniform(1,200) for _ in range(1381)]})

# 自实现线性相关F检验

# 统计总体偏差平方和
X_mean = df['X'].mean()
Y_mean = df['Y'].mean()
SST = np.power(df['Y'] - Y_mean, 2).sum() + np.power(df['X'] - X_mean, 2).sum()

# 已经解释的变差(Explained variation)为SSR

SSR = np.power(((df['Y'] - Y_mean)*(df['X'] - X_mean)).sum(), 2)

# 构建F统计检验量,即满足F(1, n-2)的概率分布
n = df.shape[0]
SSE = SST - SSR

MSR = SSR/(1)
MSE = SSE/(n-2)

F_score = MSR/MSE

F_score


# 借助sklean进行基于线性相关F检验

from sklearn.feature_selection import SelectKBest
KB = SelectKBest(f_regression, k=10)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/723598.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存