机器学习,数据挖掘等领域的知识碎片【不定期更新】
机器学习,数据挖掘等领域的知识碎片【不定期更新】
这部分内容没有固定主题,不定期更新,都是些零碎的,我觉得有必要记一笔的知识。希望能对其他人也有所帮助。
sklearn.feature_selection 里的 F_regression
特征选择方法众多,sklearn 的特征选择模块里给出了几种非常简易高效的方法。针对回归问题,sklearn 给出了两种方法,其中一种是 F_regression 引起了我的注意。F_regression 在 sklearn 里只有寥寥几句的介绍,好在源码简短易读。之前搜了搜网上其它对这个函数的解读,要么解释不全,要么干脆是错的,所以我就在这里详细讲讲。
先放源码如下:
F_regression 在干什么?一句话就能讲清楚:每个特征 X 单独拎出来和 Y 计算相关系数,并排序。特征选择就是基于 X 和 Y 的相关程度。
实际操作分为三步:
-
计算相关系数;
-
转化为 F score;
-
计算 P 值;
最后排名是根据 F score,可以选择输出 P 值。
一步一步讲。相关系数最不用谈,就是 Y 与 X 线性关系的度量。计算完相关系数还不够,这里的相关系数严格来说是样本相关系数,如何从样本推论到总体呢?这就需要做假设检验,对未知参数提出某种假设,利用样本提供的信息对提出的假设进行检验,根据检验结果对提出的假设做出拒绝或接受的判断。参照线性回归的假设检验形式,在此我们提出的假设(零假设)为 X 与 Y 不存在线性关系,即 \(\beta = 0\)。提出零假设后,我们需要去计算 P 值,P 值即零假设成立的情况下所得到的样本观察结果或更极端结果出现的概率。如果 P 值足够小,我们就能拒绝零假设,从而认为 X 与 Y 存在线性关系。
注意到相关系数和 R 平方的关系,两者在简单一元线性回归情形下是等价的。
先定义一元线性回归式,\(y = \beta_0 + \beta_1 x + \epsilon\),再记录几个值,
\[Y = (y_1, y_2, …, y_n)^T, \quad \beta = (\beta_0, \beta_1)^T\]
\[ X =
\begin{bmatrix}
1 & … & 1 \\
x_1 & … & x_n \\
\end{bmatrix}^T, \quad \epsilon = (\epsilon_1, …, \epsilon_n)^T\]
\[L_{xy} = \sum\limits_{t=1}^n(x_t – \bar x)(y_t – \bar y), \quad L_{xx} = \sum\limits_{t=1}^n(x_t – \bar x)^2, \quad L_{yy} = \sum\limits_{t=1}^n(y_t – \bar y)^2\]
可以证得,
\[\hat\beta = (X^TX)^{-1}X^TY = \begin{bmatrix}
\bar y – \bar x L_{xy} / L_{xx} \\
L_{xy} / L_{xx} \\
\end{bmatrix}
\]
此时,\(\hat\beta_1 = L_{xy} / L_{xx}\),\(\hat\beta_0 = \bar y – \bar x\hat\beta_1\),那么
\[\hat y = \hat \beta_0 + \hat \beta_1x = \bar y + \hat\beta_1(x-\bar x)\]
可以计算出回归平方和 \(U_R\)
\[U_R = \sum\limits_{t=1}^n (\hat y_t – \bar y)^2 = \frac{L_{xy}^2}{L_{xx}}\]
我们已知了总离差平方和 \(S_T = L_{yy}\),那么 R 平方显而易见,
\[R^2 = \frac{U_R}{S_T} = \frac{L_{xy}^2}{L_{xx}L_{yy}} = r^2\]
\(r\) 就是相关系数,于是得证,一元线性回归中 R 平方和相关系数的平方等价。
因此我们计算出的相关系数完全可以理解为 \(Y \sim X\) 线性回归的 R 平方值。从 R 平方值可以推出 F score。
易求得残差平方和 \(Q_e\)
\[Q_e = L_{yy} – U_R = L_{yy}(1-r^2)\]
此时,当零假设成立,即 \(\beta_1 = 0\) 时,F score 即为
\[\begin{align*}
F &= \frac{U_R / 1}{Q_e / (n-2)} \sim F(1, n-2) \\ \notag
&= \frac{r^2}{1 – r^2} (n-2) \notag
\end{align*}\]
在零假设条件下,F score 应该较小,即误差主要由随机误差产生。因此想要拒绝零假设,就需要一个大的 F 值,大到什么程度呢?设定显著性水平为 \(\alpha\),拒绝域为 \(\{F > C\}\),\(C\) 可以通过 \(\alpha = P(F>C \left | H_0 \right)\) 求得。
或者从 P 值的角度,计算 P 值为 \(P(F > \hat F)\),\(\hat F\) 为由样本计算出的 F 值,当 P 值小于显著性水平时,表示拒绝零假设,Y 与 X 存在线性关系。
这种方法的缺陷一目了然,就是完全忽略了其它特征的影响,实际用的时候还需谨慎。我一般会参照 P 值,设定一个显著性水平,高于显著性水平的特征全部舍弃。或者舍弃 F score 排名最靠后的,而不是取排名靠前的。