1 特征选择
特征选择是一个重要的数据预处理过程。为什么要特征选择? 1. 维数灾难 ;2. 去除不相关特征往往会降低学习任务的难度。
冗余特征:它们所包含的信息能从其他特征中推演出来。
冗余特征在很多时候不起作业,去除它们会减轻学习过程的负担。若某个冗余特征恰好对应了完成学习任务所需的中间概念,则该冗余特征是有益的。
最简单的方法就是方差筛选。方差越大的特征,那么我们可以认为它是比较有用的。如果方差较小,比如小于1,那么这个特征可能对我们的算法作用没有那么大。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,可以直接舍弃。在实际应用中,我们会指定一个方差的阈值,当方差小于这个阈值的特征会被我们筛掉。sklearn中的VarianceThreshold类可以很方便的完成这个工作。
2 子集搜索与评价
特征选择便是从给定的特征集合中选出相关特征子集的过程。降维从一定程度起到了提炼优质低维属性和降噪的效果,特征选择则是直接剔除那些与学习任务无关的属性而选择出最佳特征子集。
2.1 前向搜索
初始将每个特征当做一个候选特征子集,然后从当前所有的候选子集中选择出最佳的特征子集;接着在上一轮选出的特征子集中添加一个新的特征,同样地选出最佳特征子集;最后直至选不出比上一轮更好的特征子集。
2.2 后向搜索
初始将所有特征作为一个候选特征子集;接着尝试去掉上一轮特征子集中的一个特征并选出当前最优的特征子集;最后直到选不出比上一轮更好的特征子集。
2.3 双向搜索
将前向搜索与后向搜索结合起来,即在每一轮中既有添加操作也有剔除操作。
2.4 子集评价
我们就可以像决策树选择划分属性那样,通过计算信息增益来评价该属性子集的好坏。
此时,信息增益越大表示该属性子集包含有助于分类的特征越多,使用上述这种子集搜索与子集评价相结合的机制,便可以得到特征选择方法。值得一提的是若将前向搜索策略与信息增益结合在一起,与前面我们讲到的ID3决策树十分地相似。事实上,决策树也可以用于特征选择,树节点划分属性组成的集合便是选择出的特征子集。
2.5 特征选择方法概览(优缺点)
特征选择方法有很多,一般分为三类:
-
过滤式方法运用统计指标来为每个特征打分并筛选特征,其聚焦于数据本身的特点。其优点是计算快,不依赖于具体的模型,缺点是选择的统计指标不是为特定模型定制的,因而最后的准确率可能不高。而且因为进行的是单变量统计检验,没有考虑特征间的相互关系。上面我们提到的方差筛选就是过滤法的一种。
-
包裹式方法使用模型来筛选特征,通过不断地增加或删除特征,在验证集上测试模型准确率,寻找最优的特征子集。包裹式方法因为有模型的直接参与,因而通常准确性较高,但是因为每变动一个特征都要重新训练模型,因而计算开销大,其另一个缺点是容易过拟合。
-
嵌入式方法利用了模型本身的特性,将特征选择嵌入到模型的构建过程中。典型的如 Lasso 和树模型等。准确率较高,计算复杂度介于过滤式和包裹式方法之间,但缺点是只有部分模型有这个功能。
更详细参考:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.108.3429&rep=rep1&type=pdf
3 过滤式选择
3.1 特征的方差
3.2 相关系数
这个主要用于输出连续值的监督学习算法中。我们分别计算所有训练集中各个特征与输出值之间的相关系数,设定一个阈值,选择相关系数较大的部分特征。
3.3 假设检验
比如卡方检验。卡方检验可以检验某个特征分布和输出值分布之间的相关性。在sklearn中,可以使用chi2这个类来做卡方检验得到所有特征的卡方值与显著性水平P临界值,我们可以给定卡方值阈值, 选择卡方值较大的部分特征。除了卡方检验,我们还可以使用F检验和t检验,它们都是使用假设检验的方法,只是使用的统计分布不是卡方分布,而是F分布和t分布而已。在sklearn中,有F检验的函数f_classif和f_regression,分别在分类和回归特征选择时使用。(具体分析方法见文末第9节)
3.4 互信息
即从信息熵的角度分析各个特征和输出值之间的关系评分。在决策树算法中我们讲到过互信息(信息增益)。互信息值越大,说明该特征和输出值之间的相关性越大,越需要保留。在sklearn中,可以使用mutual_info_classif(分类)和mutual_info_regression(回归)来计算各个输入特征和输出值之间的互信息。
3.5 Relief算法:
它使用一个**“相关统计量”来度量特征的重要性**,该统计量是一个向量,其中每个分量代表着相应特征的重要性,因此我们最终可以根据这个统计量各个分量的大小来选择出合适的特征子集。
Relief首先找出与
x
i
x_i
xi同类别的最近邻与不同类别的最近邻,分别称为猜中近邻(near-hit)与猜错近邻(near-miss),接着便可以分别计算出相关统计量中的每个分量。对于j分量:
直观上理解:对于猜中近邻,两者j属性的距离越小越好,对于猜错近邻,j属性距离越大越好。更一般地,若
x
i
x_i
xi为离散属性,diff取海明距离,即相同取0,不同取1;若
x
i
x_i
xi为连续属性,则diff为曼哈顿距离,即取差的绝对值。分别计算每个分量,最终取平均便得到了整个相关统计量。
拓展变体Relief-F则解决了多分类问题。对于j分量,新的计算公式如下:
其中
p
l
p_l
pl 表示第ll类样本在数据集中所占的比例,易知两者的不同之处在于:标准Relief 只有一个猜错近邻,而Relief-F有多个猜错近邻。
4 包裹式选择
与过滤式选择不同的是,包裹式选择将后续的学习器也考虑进来作为特征选择的评价准则。
4.1递归消除特征法
(recursive feature elimination,以下简称RFE)。
递归消除特征法使用一个机器学习模型来进行多轮训练,每轮训练后,消除若干权值系数的对应的特征,再基于新的特征集进行下一轮训练。在sklearn中,可以使用RFE函数来选择特征。
我们下面以经典的SVM-RFE算法来讨论这个特征选择的思路。这个算法以支持向量机来做RFE的机器学习模型选择特征。它在第一轮训练的时候,会选择所有的特征来训练,得到了分类的超平面
w
x
˙
+
b
=
0
wx˙+b=0
wx˙+b=0后,如果有n个特征,那么RFE-SVM会选择出w中分量的平方值
w
i
2
w^2_i
wi2最小的那个序号i对应的特征,将其排除,在第二轮的时候,特征数就剩下n-1个了,我们继续用这n-1个特征和输出值来训练SVM,同样的,去掉
w
i
2
w^2_i
wi2最小的那个序号i对应的特征。以此类推,直到剩下的特征数满足我们的需求为止。
4.2 LVW(Las Vegas Wrapper)
它在拉斯维加斯框架下使用随机策略来进行特征子集的搜索。
LVW算法的具体流程如下所示,其中比较特别的是停止条件参数T的设置,即在每一轮寻找最优特征子集的过程中,若随机T次仍没找到,算法就会停止,从而保证了算法运行时间的可行性。
每次特征子集评价都需训练学习器,计算开销大。
5 嵌入式选择
过滤式中特征选择与后续学习器完全分离,包裹式则是使用学习器作为特征选择的评价准则;嵌入式是一种将特征选择与学习器训练完全融合的特征选择方法,即将特征选择融入学习器的优化过程中。
5.1 L1范数
岭回归就是加上了L2范数的最小二乘法,有效地解决了奇异矩阵、过拟合等诸多问题,下面的嵌入式特征选择则是在损失函数后加上了L1范数。
L1范数(Lasso Regularization)指的是向量中每个元素的绝对值之和,这样在优化目标函数的过程中,就会使得w尽可能地小,在一定程度上起到了防止过拟合的作用,同时与L2范数(Ridge Regularization )不同的是,L1范数会使得部分w变为0, 从而达到了特征选择的效果。
L1范数会趋向产生少量的特征,其他特征的权值都是0;L2会选择更多的特征,这些特征的权值都会接近于0。这样L1范数在特征选择上就十分有用,而L2范数则具备较强的控制过拟合能力。
1)下降速度:L1范数按照绝对值函数来下降,L2范数按照二次函数来下降。因此在0附近,L1范数的下降速度大于L2范数,故L1范数能很快地下降到0,而L2范数在0附近的下降速度非常慢,因此较大可能收敛在0的附近。
2)空间限制:L1范数与L2范数都试图在最小化损失函数的同时,让权值W也尽可能地小。我们可以将原优化问题看做为下面的问题,即让后面的规则则都小于某个阈值。这样从图中可以看出:L1范数相比L2范数更容易得到稀疏解。
解要在平方误差项与正则化项之间折中,要在图中平方误差项等值线与正则化项等值线相交处。采用L1范数时,平方误差项等值线与正则化等值线的交点常出现在坐标轴上。
6 稀疏表示与字典学习
当样本数据是一个稀疏矩阵时,对学习任务来说会有不少的好处,例如很多问题变得线性可分,储存更为高效等。这便是稀疏表示与字典学习的基本出发点。稀疏矩阵即矩阵的每一行/列中都包含了大量的零元素,且这些零元素没有出现在同一行/列,对于一个给定的稠密矩阵,若我们能通过某种方法找到其合适的稀疏表示,则可以使得学习任务更加简单高效,我们称之为稀疏编码(sparse coding)或字典学习(dictionary learning)。
min
D
,
X
∥
Y
−
D
X
∥
F
2
+
λ
∥
x
i
∥
1
(2-3)
\min_{\mathbf{D,\ X}}{\|\mathbf{Y}-\mathbf{DX}\|^2_F}+\lambda\|\mathbf{x}_i\|_1 \tag{2-3}
D, Xmin∥Y−DX∥F2+λ∥xi∥1(2-3)
这里有两个优化变量D, X,为解决这个优化问题,一般是固定其中一个优化变量,优化另一个变量,如此交替进行。
式中的稀疏矩阵X可以利用已有经典算法求解,如Lasso(Least Absolute Shrinkage and Selection Operator)、OMP(Orthogonal Matching Pursuit),这里我重点讲述如何更新字典D,对更新X不多做讨论。
假设X是已知的,我们逐列更新字典。下面我们仅更新字典的第k列,记dk为字典D的第k列向量,记
x
k
T
x_k^T
xkT为稀疏矩阵X的第k行向量
∥
Y
−
D
X
∥
F
2
=
∥
Y
−
∑
j
=
1
K
d
j
x
T
j
∥
F
2
=
∥
(
Y
−
∑
j
≠
k
d
j
x
T
j
)
−
d
k
x
T
k
∥
F
2
=
∥
E
k
−
d
k
x
T
k
∥
F
2
\begin{aligned} {\|\mathbf{Y}-\mathbf{DX}\|^2_F} =&\left\|\mathbf{Y}-\sum^K_{j=1}\mathbf{d}_j\mathbf{x}^j_T\right\|^2_F \\ =&\left\|\left(\mathbf{Y}-\sum_{j\ne k}\mathbf{d}_j\mathbf{x}^j_T\right)-\mathbf{d}_k\mathbf{x}^k_T\right\|^2_F\\ =&\left\|\mathbf{E}_k - \mathbf{d}_k\mathbf{x}_T^k \right\|^2_F \end{aligned}
∥Y−DX∥F2===∥∥∥∥∥Y−j=1∑KdjxTj∥∥∥∥∥F2∥∥∥∥∥∥⎝⎛Y−j=k∑djxTj⎠⎞−dkxTk∥∥∥∥∥∥F2∥∥Ek−dkxTk∥∥F2
求解过程参考:https://www.cnblogs.com/endlesscoding/p/10090866.html
7 压缩感知
它关注的是通过欠采样信息来恢复全部信息。在实际问题中,为了方便传输和存储,我们一般将数字信息进行压缩,这样就有可能损失部分信息,如何根据已有的信息来重构出全部信号,这便是压缩感知的来历,压缩感知的前提是已知的信息具有稀疏表示。
8 寻找高级特征
在Kaggle之类的算法竞赛中,高分团队主要使用的方法除了集成学习算法,剩下的主要就是在高级特征上面做文章。所以寻找高级特征是模型优化的必要步骤之一。当然,在第一次建立模型的时候,我们可以先不寻找高级特征,得到以后基准模型后,再寻找高级特征进行优化。
寻找高级特征最常用的方法有:
8.1 若干项特征加和
我们假设你希望根据每日销售额得到一周销售额的特征。你可以将最近的7天的销售额相加得到。
8.2 若干项特征之差
假设你已经拥有每周销售额以及每月销售额两项特征,可以求一周前一月内的销售额。
8.3若干项特征乘积
假设你有商品价格和商品销量的特征,那么就可以得到销售额的特征。
8.4 若干项特征除商
假设你有每个用户的销售额和购买的商品件数,那么就是得到该用户平均每件商品的销售额。
当然,寻找高级特征的方法远不止于此,它需要你根据你的业务和模型需要而得,而不是随便的两两组合形成高级特征,这样容易导致特征爆炸,反而没有办法得到较好的模型。个人经验是,聚类的时候高级特征尽量少一点,分类回归的时候高级特征适度的多一点。
9 假设检验用于特征选择的具体分析
9.1 卡方检验
过滤式特征选择法是删除掉无关的特征,无关的特征是值与label独立的特征,而卡方检验恰好可以进行独立性检验。
9.1.1 卡方分布
设随机变量
x
1
,
x
2
.
.
.
x
n
,
i.i.d
∼
N
(
0
,
1
)
x_1, x_2 ... x_n \,,\quad \text{i.i.d} \sim N(0,1)
x1,x2...xn,i.i.d∼N(0,1) ,即独立同分布于标准正态分布,那么这 n 个随机变量的平方和:
X
=
∑
i
=
1
n
x
i
2
X = \sum\limits_{i=1}^n x_i^2
X=i=1∑nxi2
构成一个新的随机变量,其服从自由度为 n 的卡方分布 (
χ
2
\chi^2
χ2 分布) ,记为
X
∼
χ
n
2
X \sim \chi^2_n
X∼χn2 。
下图显示不同自由度下卡方分布的概率密度曲线,可以看到自由度越大,卡方分布就越接近正态分布:
9.1.2 卡方检验一般流程
假设我想检验一个人有特殊着装癖好与其变态与否的关系,该独立性检验的假设如下:
- 零假设(H0):着装偏好与变态倾向独立
- 备选假设(H1):着装偏好与变态倾向不独立
- 建立观察频数表
卡方检验一般需要先建立列联表,表中每个格子是观察频数,表示实际观测到的同时满足两个条件的数量:
- 建立期望频数表
同时需要计算每个格子的期望频数,因为零假设是两个变量独立,因此依独立性的定义:P(A,B)=P(A)P(B),于是上表中每个格子的期望频数为 N×P(A,B)=N×P(A)×P(B) ,其中 N 为总数量,那么第一个格子的期望频数为 3100 × 750 3100 × 500 3100 = 121 3100 \times \frac{750}{3100} \times \frac{500}{3100} = 121 3100×3100750×3100500=121 。因此总体期望频数表为:
- 计算检验统计量
χ
2
\chi^2
χ2
然后计算检验统计量 χ 2 \chi^2 χ2( χ 2 \chi^2 χ2 表示卡方值) , χ 2 \chi^2 χ2 越大,表示观测值和理论值相差越大,当 χ 2 \chi^2 χ2 大于某一个临界值时,就能获得统计显著性的结论:
χ 2 = ∑ ( 观 测 频 数 − 期 望 频 数 ) 2 期 望 频 数 = ∑ i = 1 r ∑ j = 1 c ( O i , j − E i , j ) 2 E i , j \chi^2 = \sum\frac{(观测频数 - 期望频数)^2}{期望频数}= \sum_{i=1}^{r} \sum_{j=1}^{c} {(O_{i,j} - E_{i,j})^2 \over E_{i,j}} χ2=∑期望频数(观测频数−期望频数)2=i=1∑rj=1∑cEi,j(Oi,j−Ei,j)2
其中 O i j O_{ij} Oij 为观测频数表中单元格的数值, E i j E_{ij} Eij 为期望频数表中单元格的数值,r 为行数,c 为列数,自由度 df 为 (2−1)×(3−1)=2 , χ 2 \chi^2 χ2 服从卡方分布 - 查卡方分布表:
根据自由度查卡方分布表
得 P( χ 2 \chi^2 χ2>13.82)<0.001 ,而实际计算出的 χ 2 \chi^2 χ2 为 26.99,显著性很高,意味着零假设成立的情况下样本结果出现的概率小于 0.1%,因而可以拒绝零假设,接受备选假设(着装偏好与变态倾向不独立)。
相关性不代表因果性,完全可能是第三个变量 (如:国籍) 同时导致了女装和变态,致使这两个变量产生了某种相关性。 - 根据
χ
2
\chi^2
χ2排序进行特征选择
再回到特征选择的问题,从严格的统计学角度来看,使用卡方检验进行特征选择可能会产生一些问题。假设选择的显著性水平 α 为 0.05,这说明犯第一类错误 (typeIerror,两个变量实际独立却被判为相关) 的概率为 5%,若进行了 1000 次卡方检验,则平均有 1000×0.05=50 次会选择与标签不相关的特征。机器学习问题中动辄就有几千至上百万的特征,那么这里面漏过的特征可能会相当多。
不过好在搞机器学习并不是在搞统计,我们实际上比较关心的是特征的相对重要性。依上面的卡方分布表,检验统计量 χ2越大,越有信心拒绝零假设,接受两个变量不独立 的事实,因而可以按每个特征 χ2 值的大小进行排序,去除 χ2 值小的特征。
def chi2(X, y):
Y = LabelBinarizer().fit_transform(y) # (1)
if Y.shape[1] == 1:
Y = np.append(1 - Y, Y, axis=1)
observed = safe_sparse_dot(Y.T, X) # (2)
feature_count = X.sum(axis=0).reshape(1, -1) # (3)
class_prob = Y.mean(axis=0).reshape(1, -1) # (4)
expected = np.dot(class_prob.T, feature_count) # (5)
return _chisquare(observed, expected)
实际上scikit-learn实现过程中,并不是传统意义上的通过计算频数构建列联表,而是将属于每一个标签类别的特征取值总和作为列联表单元格的观测值,即第 (2) 步 (需要先在第 (1) 步将标签离散化)。
而对于列联表单元格的期望值的计算,则是基于这样的假设:如果标签与特征独立,则每个标签类别为均匀分布,即第 (4) 步中的 class_prob⟹p,则第 (5) 步中每个单元格期望值的计算就与传统意义上期望值类似了:
E
[
x
]
=
∑
i
p
i
x
i
\mathbb{E}[x] = \sum_i p_i x_i
E[x]=∑ipixi 。
这样实现的一大好处是可以通过矩阵相乘快速得出所有特征的观测值和期望值,在计算出各特征的 χ2 值后,如上文所述,可以按每个特征的 χ2 值大小进行排序,方便地进行特征选择。另一个好处是扩大了
χ
2
\chi^2
χ2 的适用范围,观察上面的代码,对于原始特征的唯一处理就是第 (3) 步中的 sum ,而不是原来的计算频数,这样一些连续型特征也可以使用该方法进行特征选择了。
9.2 F检验
F 检验是一类建立在 F 分布基础上的假设检验方法,服从 F 分布的随机变量与上文中卡方分布的关系如下:
9.2.1 F分布
F
=
X
1
/
d
1
X
2
/
d
2
(2)
F = \frac{X_1 / d_1}{X_2 / d_2} \tag{2}
F=X2/d2X1/d1(2)
其中 X1 和 X2 分别服从自由度为 d1 和 d2 的卡方分布,即
X
1
∼
χ
2
(
d
1
)
,
X
2
∼
χ
2
(
d
2
)
X_1 \sim \chi^2(d_1), \;X_2 \sim \chi^2(d_2)
X1∼χ2(d1),X2∼χ2(d2) ,且 X1 与 X2 独立,则随机变量 F 服从自由度为 (d1,d2) 的F分布,记为
F
∼
F
(
d
1
,
d
2
)
F \sim \text{F}(d_1, d_2)
F∼F(d1,d2) 。
下图显示不同自由度下F分布的概率密度曲线:
scikit-learn 中提供了两种F检验方法 —— 适用于分类的 f_classif 和适用于回归的 f_regression ,分别对应单因素方差分析和线性相关分析.
9.2.2 单因素方差分析
按照不同的标签类别将特征划分为不同的总体,我们想要检验的是不同总体之间均值是否相同 (或者是否有显著性差异)。方差分析只适用于连续型特征,以身高为例:
- 零假设 (H0): μ 1 = μ 2 = ⋯ = μ k \mu_1 = \mu_2 = \cdots = \mu_k μ1=μ2=⋯=μk
- 备选假设 (H1) : k 个总体的均值不全相等
设共有 k 个类别,总样本数为 n ,第 j 个类别的样本数为
n
j
n_j
nj ,
x
i
j
x_{ij}
xij 表示第 j 个类别的第 i 个样本,
x
ˉ
j
\bar{x}_j
xˉj 表示第 j 个类别的样本均值,即
x
j
ˉ
=
∑
i
=
1
n
j
x
i
j
n
j
\bar{x_j} = \frac{\sum_{i=1}^{n_j} x_{ij}}{n_j}
xjˉ=nj∑i=1njxij,
x
ˉ
\bar{x}
xˉ 为总样本均值
x
ˉ
=
∑
j
=
1
k
∑
i
=
1
n
j
x
i
j
n
\bar{x} = \frac{\sum_{j=1}^k \sum_{i=1}^{n_j}x_{ij}}{n}
xˉ=n∑j=1k∑i=1njxij,那么样本的总体变异为:
S
S
T
=
∑
j
=
1
k
∑
i
=
1
n
j
(
x
i
j
−
x
ˉ
)
2
SST = \sum\limits_{j=1}^k \sum\limits_{i=1}^{n_j} (x_{ij} - \bar{x})^2
SST=j=1∑ki=1∑nj(xij−xˉ)2
SST 可以分解为两部分 —— 类内差异 SSE 和类间差异 SSB :
S
S
E
=
∑
j
=
1
k
∑
i
=
1
n
j
(
x
i
j
−
x
j
ˉ
)
2
SSE = \sum\limits_{j=1}^k \sum\limits_{i=1}^{n_j} (x_{ij} - \bar{x_j})^2
SSE=j=1∑ki=1∑nj(xij−xjˉ)2
S
S
B
=
S
S
T
−
S
S
E
=
∑
j
=
1
k
n
j
(
x
j
ˉ
−
x
ˉ
)
2
SSB = SST - SSE = \sum\limits_{j=1}^k n_j (\bar{x_j} - \bar{x})^2
SSB=SST−SSE=j=1∑knj(xjˉ−xˉ)2
SSE 衡量每个类别内部样本之间的差异,可以认为是随机误差。SSB 则衡量不同类别之间的差异。方差分析的基本思想是将不同类别之间的变异与随机误差作比较,如果二者之比大于某一临界值,则可拒绝零假设接受备选假设,即不同类别间样本均值不全相等,这也意味着样本特征对于类别有一定的区分度。
对于如何确定临界值,则终于要用到传说中的 F 分布了。式
F
=
X
1
/
d
1
X
2
/
d
2
F = \frac{X_1 / d_1}{X_2 / d_2}
F=X2/d2X1/d1定义了服从F分布的随机变量,注意到分子分母都要除以自由度,而 SSE 和 SSB 的自由度分别为 k−1 和 n−k ,因而统计检验量 F :
F
=
类
别
间
方
差
类
别
内
方
差
=
M
S
B
M
S
E
=
S
S
B
/
(
k
−
1
)
S
S
E
/
(
n
−
k
)
F = \frac{类别间方差}{类别内方差} = \frac{MSB}{MSE} = \frac{SSB \,/\, (k-1)}{SSE\, / \, (n-k)}
F=类别内方差类别间方差=MSEMSB=SSE/(n−k)SSB/(k−1)
服从分子自由度为 k−1,分母自由度为 n−k 为的 F 分布,即
M
S
B
M
S
E
∼
F
(
k
−
1
,
n
−
k
)
\frac{MSB}{MSE} \sim F(k-1, \,n-k)
MSEMSB∼F(k−1,n−k)。看到这里,敏感的同学可能已经注意到了,方差分析的思想和线性判别分析 (Linear Discriminant Analysis,LDA) 非常类似 ( LDA 的思想可大致概括为 “投影后类内方差最小,类间方差最大”)。
于是按假设检验的套路,零假设成立的情况下算出 F 值,查 F 分布表,若p值小于0.05 (或0.01),则拒绝零假设接受备选假设,不同类别间均值不相等。
9.2.2.1 单因素方差分析与t检验
单因素方差分析 (F检验) 与统计学中另一大假设检验方法 —— t 检验也颇有渊源,检验统计量 F 与 t 检验中的检验统计量 t 的关系为: F = t 2 F=t^2 F=t2 ,所以对于只有两个类别来说,F 检验和 t 检验会得出相同的结论,但对于多个类别的情况,t检验只能两两进行比较,这会带来一些问题:
- 多个类别之间两两比较,计算复杂度较高,如果有10个类别,则有 C 10 2 = 45 C^2_{10}=45 C102=45 种组合。
- 对原始资料的利用率低,每次只能用到全部实验数据的几分之一。
- 会增大假阳性 (即第一类错误) 的概率,假设显著性水平 α=0.05 ,则犯第一类错误的概率为0.05,那么不犯第一类错误的概率为 1−0.05=0.95。对于有5个类别,10个组合的两两比较问题,至少犯一次第一类错误的概率上升到 1−0.9510≈0.4 ,这样就降低了统计推断的可靠性。
所以对于多个类别的比较,方差分析是首选,其相当于是 t 检验对于多类别的扩展,我想 scikit-learn 的特征选择模块中使用 F 检验而不是 t 检验是有这方面考虑的。
9.2.3 线性相关分析
对于特征和标签皆为连续值的回归问题,要检测二者的相关性,最直接的做法就是求相关系数
r
x
y
r_{xy}
rxy:
r
x
y
=
c
o
v
(
x
,
y
)
σ
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{cov(x,y)}{\sigma_x \sigma_y} =\frac{\sum_{i=1}^n (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=σxσycov(x,y)=∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2∑i=1n(xi−xˉ)(yi−yˉ)
但 scikit-learn 中的 f_regression 采用的是先计算相关系数,然后转化为F值。在线性回归中常使用判定系数
R
2
R^2
R2 作为回归方程拟合数据点的程度(具体可参考我的“分类/回归/聚类——模型评估”那篇博客),
R
2
R^2
R2 与
r
x
y
r_{xy}
rxy的关系:
R
2
=
S
S
R
S
S
T
=
1
−
S
S
E
S
S
T
=
r
x
y
2
R^2 = \frac{SSR}{SST} = 1- \frac{SSE}{SST} = r_{xy}^2
R2=SSTSSR=1−SSTSSE=rxy2
F
=
M
S
R
M
S
E
=
S
S
R
/
1
S
S
E
/
(
n
−
2
)
=
S
S
R
/
S
S
T
S
S
E
/
S
S
T
×
(
n
−
2
)
=
r
x
y
2
1
−
r
x
y
2
×
(
n
−
2
)
F = \frac{MSR}{MSE} = \frac{SSR \,/\, 1}{SSE \,/\, (n-2)} = \frac{SSR / SST}{SSE / SST} \times (n-2) = \frac{r_{xy}^2}{1-r_{xy}^2} \times (n-2)
F=MSEMSR=SSE/(n−2)SSR/1=SSE/SSTSSR/SST×(n−2)=1−rxy2rxy2×(n−2)
即
M
S
R
M
S
E
∼
F
(
1
,
n
−
2
)
\frac{MSR}{MSE} \sim F(1, \,n-2)
MSEMSR∼F(1,n−2)。这样就可以方便地将相关系数转化为 F 值了,接下来的步骤与之前的假设检验一样。该方法的缺点是只能检测线性相关关系,但不相关不代表独立,可能是非线性相关关系。
9.3 互信息和信息增益
互信息和信息增益,二者是等价的:
I
(
X
;
Y
)
=
I
(
Y
;
X
)
=
∑
y
∈
Y
∑
x
∈
X
p
(
x
,
y
)
log
(
p
(
x
,
y
)
p
(
x
)
p
(
y
)
)
=
−
∑
y
∑
x
p
(
x
,
y
)
log
p
(
y
)
+
∑
x
∑
y
p
(
x
,
y
)
log
(
p
(
x
,
y
)
p
(
x
)
)
=
−
∑
y
p
(
y
)
log
p
(
y
)
+
∑
x
∑
y
p
(
x
)
p
(
y
∣
x
)
log
p
(
y
∣
x
)
=
−
∑
y
p
(
y
)
log
p
(
y
)
+
∑
x
p
(
x
)
∑
y
p
(
y
∣
x
)
log
p
(
y
∣
x
)
=
H
(
Y
)
−
∑
x
p
(
x
)
H
(
Y
∣
X
=
x
)
=
H
(
Y
)
−
H
(
Y
∣
X
)
I(X;Y) = I(Y;X)= \sum\limits_{y \in \mathcal{Y}}\sum\limits_{x \in \mathcal{X}} p(x,y) \,\text{log}\left(\frac{p(x,y)}{p(x)p(y)}\right) \\ = -\sum\limits_y\sum\limits_x p(x,y)\,\text{log}\,p(y) + \sum\limits_x\sum\limits_y p(x,y)\text{log} \left(\frac{p(x,y)}{p(x)}\right) \\ = -\sum\limits_y p(y)\,\text{log}\,p(y) + \sum\limits_x\sum\limits_y p(x)p(y|x)\text{log}\, p(y|x) \\ = -\sum\limits_y p(y)\,\text{log}\,p(y) + \sum\limits_x p(x) \sum\limits_y p(y|x)\text{log}\, p(y|x) \\ = H(Y) - \sum\limits_x p(x)H(Y|X=x) \\ = H(Y) - H(Y|X)
I(X;Y)=I(Y;X)=y∈Y∑x∈X∑p(x,y)log(p(x)p(y)p(x,y))=−y∑x∑p(x,y)logp(y)+x∑y∑p(x,y)log(p(x)p(x,y))=−y∑p(y)logp(y)+x∑y∑p(x)p(y∣x)logp(y∣x)=−y∑p(y)logp(y)+x∑p(x)y∑p(y∣x)logp(y∣x)=H(Y)−x∑p(x)H(Y∣X=x)=H(Y)−H(Y∣X)
互信息的一大优点是其能检测出多种变量之间的关系,而相较而言 F 检验只能表示线性相关关系。
以上参考:
https://www.cnblogs.com/pinard/p/9032759.html
https://blog.csdn.net/love__live1/article/details/83625949
https://www.cnblogs.com/massquantity/p/10486904.html