栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

三、特征选择(filter):线性相关性的F检验

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

三、特征选择(filter):线性相关性的F检验

线性相关性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/(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​/d2​X1​/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−rxy2​rxy2​​∗(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−rxy2​rxy2​​∗(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)^2sum_{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−rxy2​rxy2​​所代表的含义,就非常清楚了:

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−rxy2​rxy2​​=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−rxy2​rxy2​​∗(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−rxy2​rxy2​​∗(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)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/829177.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号