在进行特征选择的时候我们要衡量特征和我们的目标之间的相似性,有很多的方法可以衡量,下面介绍一些使用filter特征选择方法的时候能够使用的方法,更多的特征选择方法可以参考我的另一个博客特征选择。
filter特征选择方法是:特征选择的过程和模型的训练过程没有直接关系,使用特征本身的信息来进行特征选择。
参考这篇文章给出下图所示的特征度量方法:
1:相关系数(皮尔逊系数)
对于两个变量$mathbf{x}$ 和$mathbf{y}$ 相关系数是这样定义的:
$ ho(mathbf{x},mathbf{y}) = frac{ cov(mathbf{x},mathbf{y}) } { sqrt{D(mathbf{x})D(mathbf{y})} }$
其中$cov(mathbf{x},mathbf{y}) $是 $mathbf{x}$ 和$mathbf{y}$的协方差,$D(mathbf{x})D(mathbf{y})$是$mathbf{x}$ 和$mathbf{y}$的方差。
当我们用采集到的数据来进行计算的时候,计算公式如下:
$ ho(mathbf{x}, mathbf{y}) = frac{ sum limits_{i=1}^n [(x_i – ar x) (y_i – ar y)] }{sqrt{ sum limits_{i=1}^n {(x_i – ar x)}^2 sum limits_{i=1}^n {(y_i – ar y)}^2 }}$
相关系数的取值在-1和1之间。相关系数为1的时候表明两个变量是线性相关的,而取0的时候表示的是不相关的。当两个变量都是连续的数值类型的时候,可以使用相关系数来进行度量。
关于相关系数的另一个解释是这样的:相关系数是去中心化以后数据的余弦值。中心化是数据减去他们的平均值以后得到的数据。
python当中计算相关系数的方法:
import scipy.stats as stats import numpy as np import pandas as pd a = [1.2, 1.5, 1.9] b = [2.2, 2.5, 3.1] print(stats.pearsonr(a, b)) ''' 使用scipy库来进行计算,返回两个值,第一个是相关系数,第二个是在不相关假设情况下的p值。 (0.9941916256019201, 0.0686487855020298) ''' print(np.corrcoef([a, b])) ''' 使用numpy库来计算相关系数,返回一个数组的形式,为第i行第j行的相关系数 [[1. 0.99419163] [0.99419163 1. ]] ''' df = pd.DataFrame() df['a'] = a df['b'] = b print(df.corr()) ''' 使用pandas库来进行计算,计算第i列和第j列(每一列都是一个Series)的相关系数。返回的结果为一个DataFrame。
注:pandas是计算列的相关系数,numpy是计算行的相关系数。假如有一个df,那么如果用numpy来进行计算?
使用的方法是 np.corrcoef(df.values.T),要进行转置一下。 a b a 1.000000 0.994192 b 0.994192 1.000000 '''
2:Anova(方差分析)
Anova是方差分析(analysis of variance)的意思。 方差分析出现的背景是这样的:在实际的生产生活当中,一个结果会受到多个因素的影响,比如小麦产量受到光照、土壤的酸碱程度、温度等因素影响,化工生产当中产品受到原料成分、原料剂量、催化剂、反应温度、压力、溶液浓度、反应时间、机器设备的影响。如何能够判别哪种因素是对我们的结果影响最大的,这个时候就使用方差分析。我们把要考察的指标叫做试验指标,影响试验指标的条件叫做因素。
单变量的方差分析是只研究一个变量对于结果的影响。让这个变量取不同的值,得到不同值下的几组数据。比如要研究机器对于铝合金薄板厚度是否有影响,那么需要获得在不用的机器上面取得的薄板厚度的一组值。
把这个问题转换为一个检验假设问题:在各组数据符合正态分布,而且正态分布的方差都相同的条件下,看各组数据的均值是否相同。如果结果在可接受的范围内相同,那么则说明这一因素对于试验指标没有太大的影响。如果不相同,那么说明这一因素对于试验指标影响很大。
具体的计算过程当中是要求出这么几个值,最后可以列出一张单因素试验方差分析表。
方差来源 | 平方和 | 自由度 | 均方 | F比 |
因素A | $S_A$ | s-1 | $ar{S_A} = frac{S_A}{s-1}$ | $F=frac{ar{S_A}}{ar{S_E}}$ |
误差 | $S_E$ | n-s | $ar{S_E} = frac{S_E}{n-s}$ | |
总和 | $S_T$ | n-1 |
其中:$S_A$叫做因素A的效应平方和,反应的是在因素A的不同水平下,样本均值和总体数据均值差异的平方和。
$S_E$叫做误差平方和,反应是在因素A的各个取值下,每组观察数据与这组数据均值的平方误差之和,反应的是随机误差的大小。
n是总体样本个数,s表示因素A可以取s种情况。
统计量$F=frac{S_A /(n-1)}{S_E/(n-s)}$ 叫做Anova F统计量,由它确定的检验也佳作Anova F检验。
下面给出一个典型的例子:
使用三台机器产生的铝合金薄板,看机器是否对薄板的厚度有显著的影响,数据集如下
机器1 机器2 机器3
0.236 0.257 0.258
0.238 0.253 0.261
0.248 0.255 0.259
0.245 0.254 0.267
0.243 0.261 0.262
根据一定的计算方法(具体的计算方法可以参考《概率论与数理统计》这本书),得到的方差分析表如下:
方差来源 | 平方和 | 自由度 | 均方 | F比 |
因素 误差 |
0.00105333 0.000192 |
2 12 |
0.00052667 0.000016 |
32.92 |
总和 | 0.00124533 | 14 |
在显著性水平$alpha = 0.05$的情况下,$F_{0.05}(2,12) = 3.89 < 32.92$,拒绝假设。所以认为各台机器生产的薄板厚度有显著的差异。
sklearn的feature_selection中的SelectKBest 结合 f_classif可以实现Anova的F值来选择特征。
$chi^2$检验(Chi-Square 卡方检验)
$chi^2$检测先假设特征和目标变量没有关系,然后利用公式
$chi ^2 = sum frac{(A – T)^2}{T}$来计算$chi ^2$的值,其中A为实际值,T为理论值,是根据我们的假设推出来的。
来看这么一个例子:
在给出下列数据的情况下,是否认为不同性别的人对猫和狗有偏爱。
猫 | 狗 | |
男 | 207 | 282 |
女 | 231 | 242 |
首先,我们将各行各列相加得出一些数据:
猫 | 狗 | ||
男 | 207 | 282 | 489 |
女 | 231 | 242 | 473 |
438 | 524 | 962 |
然后我们算出理论值:即认为在性别对宠物偏爱没有影响的情况下,只和统计值有关的情况下,数据的理论值。
猫的占比为 $frac{438}{962}$,狗的占比为$frac{524}{962}$,所以理论上:
男人喜欢猫的人数应该为 $489 imes frac{438}{962} = 222.64$
男人喜欢狗的人数应该为 $489 imes frac{524}{962} = 266.36$
女人喜欢猫的人数应该为$473 imes frac{438}{962} = 215.36$
女人喜欢狗的人数应该为$473 imes frac{524}{962} = 257.64$
数据如下图所示:
猫 | 狗 | |
男 | 222.64 | 266.36 |
女 | 215.36 | 257.64 |
最后根据我们上面给出的公式来计算$chi ^2$值:
$chi ^2 = frac{(207-222.64)^2}{222.64} + frac{(282-266.36)^2}{266.36} + frac{(231-215.36)^2}{215.36}+ frac{(242-257.64)^2}{257.64} = 4.102$
在知道自由度的情况下,我们可以将$chi ^2$的值转换为p值,在这个问题当中自由度为1,计算出p=0.04283。p的值小于0.05(0.05是一个经典的显著性值),所以拒绝假设的依据很强,即认为不同性别的人对于宠物偏爱是不同的,即这两个变量不独立。
sklearn.feature_selection中的SelectKBest结合chi2可以使用$chi^2$检测来进行特征的选择。
关于假设检验的说明:
我们上面介绍的Anova和$chi^2$检验,都是从检验问题引出来的,检验问题就是说,我们给定一个假设,那么我们观察到一定的样本后,我们是否相信这个假设,或者我们有多大的可能性来相信这个假设。假设问题可以转化为p-value问题,也就是把我们的假设问题转化为一个概率值来进行衡量。
在$chi ^2$检测当中,我们假设我们的特征和目标变量没关系,所以得到的p值说明,在特征和目标变量没有关系的时候,我们能够相信观察到这些样本的概率。所以p值越小,说明我们越不相信,即特征和变量相关性越高。 所以p值越小,相关性越大。
在Anova当中,我们得到F值,F值可以转化为p值,Anova的假设条件是各个因素水平的均值相等,即这个因素对于试验指标并没有影响。所以,在这一假设下,p值越小,说明我们约不相信因素对于试验指标没有影响。 所以p值越小,相关性越大。
LDA
LDA是Linear Discriminant Analysis(线性判别分析)。即是一种分类算法,也可以用在降维当中,经常和PCA并列。这需要另外写一篇博客来进行介绍。
参考:
盛骤 《概率论与数理统计》