线性相关性F检验特征筛选
一、F检验的基本思路
从理论上来说,F计算量的分子和分母都是服从卡方分布的, F = S S B / ( k − 1 ) S S E / ( n − k ) F=\frac{SSB/(k-1)}{SSE/(n-k)} F=SSE/(n−k)SSB/(k−1)中,分子是服从自由度为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=1−rxy2rxy2∗(n−2)
其中 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) 1−rxy2rxy2∗(n−2)会服从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(xi−xˉ)2∑i=1n(yi−yˉ)2∑i=1n(xi−xˉ)(yi−yˉ)
相关系数的另一种解释方法是相互解释的变异占变异的比例。同离散变量的方差分析类似,定义总变差(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=1∑n(xi−xˉ)2i=1∑n(yi−yˉ)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=1∑n(xi−xˉ)(yi−yˉ))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}} 1−rxy2rxy2所代表的含义,就非常清楚了:
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} 1−rxy2rxy2=1−SSR/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=1−rxy2rxy2∗(n−2)=SSE/(n−2)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) 1−rxy2rxy2∗(n−2)∼F(1,n−2)。
一旦找到了检验统计变量,我们就可以推断当前事件发生的概率,进而有理有据的接受或者拒绝零假设。而这里的基于相关系数的检验,零假设是二者不存在线性相关关系。由于最终的检验统计变量仍然是服从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)