3、特征选择(filter):线性相关性的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)
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,可以使用不同的方法进行特征选择,其中之一是filter特征选择。这种方法通过计算每个特征与目标变量之间的相关来评估特征的重要。在这个过程中,可以使用皮尔逊相关系数来度量两个变量之间的线性相关。\[1\] 在使用filter特征选择时,可以使用scikit-learn库中的SelectPercentile函数。该函数可以根据特征与目标变量之间的相关选择指定百分比的特征。具体来说,可以使用SelectPercentile函数的percentile参数来指定要选择的特征的百分比。\[2\] 另外,还可以使用递归特征消除法(Recursive Feature Elimination,RFE)来进行特征选择。这种方法通过反复构建模型并选择最好或最差的特征来进行特征消除。在这个过程中,特征被消除的次序就是特征的排序。可以使用scikit-learn库中的RFE函数来实现递归特征消除法。\[3\] 总结起来,filter特征选择是一种通过计算特征与目标变量之间的相关来评估特征重要的方法。在Python中,可以使用scikit-learn库中的SelectPercentile函数和RFE函数来实现filter特征选择。 #### 引用[.reference_title] - *1* *3* [机器学习--特征选择(Python代码实现)](https://blog.csdn.net/github_38980969/article/details/82252412)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [基于Filter特征选择的python实现](https://blog.csdn.net/weixin_38314865/article/details/108691090)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值