Feature Selection详解(附带Relief、Relief-F、LVM详解)(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40793975/article/details/83068130

Feature Selection详解

第二十五次写博客,本人数学基础不是太好,如果有幸能得到读者指正,感激不尽,希望能借此机会向大家学习。这一篇主要是针对特征选择问题的几种常见方法进行阐述,并介绍其中几种比较经典的特征选择算法(Relief、Relief-F、LVM)。

特征选择

  “特征选择”(Feature Selection)是一种数据预处理(Data Preprocessing)手段,一般是在明确机器学习任务并且获得数据后,就对数据进行特征选择,然后再使用这一批数据训练学习器。
  为什么需要特征选择呢?在现实任务中,我们常常会遇到维度很高(属性很多)的数据集,在这种情况下常常会在训练学习器的过程中遇到“维度灾难”(Dimension Disaster)问题,这时对数据集的重要特征提取就变得十分重要。因此,特征选择作为另一种处理高维数据的技术,与之前讲过的降维有相似的目的,都可以大大减轻学习过程中的维数灾难问题。由于原始样本空间中存在一些“无关属性”(即与学习任务无关的属性),或是一些“冗余属性”(即可以通过其他属性推演出来的属性,例如房屋价格可以通过房屋面积和每平方米的价格推演出来)。
  特征选择的最终目标是从原始特征集合中选取一个包含了所有重要信息的特征子集,基本的方法是首先产生一个“候选子集”,然后评价他的好坏,并基于评价结果产生下一个候选子集,再对其进行评价,循环往复直到无法找到更好的候选子集为止。这其中涉及到了两个重要的步骤,一是子集搜索,二是子集评价。

子集搜索

  “前向搜索”(Forward Search)首先从数据集的全部属性中选择一个最优的特征作为初始候选子集,然后每次都在上一轮得到的候选子集中加入一个属性,使该候选子集成为当前最优的,如果该轮得到的最优候选子集与上一轮得到的候选子集相比评价比较差,那么选择上一轮的候选子集作为这个数据集的最优特征子集。
  “后向搜索”(Backward Search)与前向搜索的过程正好相反,他首先将数据集的全部属性的集合作为初始候选子集,然后从该集合中剔除一个属性以得到该轮的最优候选子集,重复这一步骤直到无法找到更好的候选子集为止,同样,如果该轮得到的最优候选子集与上一轮得到的候选子集相比评价比较差,那么选择上一轮的候选子集作为这个数据集的最优特征子集。
  “双向搜索”(Bidirectional Search)则是上述两种搜索方法的综合,在每一轮迭代中增加一个相关属性,而且这些增加的属性在和后续迭代中不会被剔除,同时剔除无关或者冗余的属性。
  上述方法都是“贪心”的,如果不使用上述方法就不得不对整个特征空间进行穷举。

子集评价

  给定数据集 D D ,假定 D D 中第 i i 类样本所占的比例为 p i ( i = 1 , 2 , . . . , y ) p_{i}\left(i=1,2,...,|y|\right) ,假设样本属性均为离散型,对于特征子集 A A ,假定根据其取值将 D D 分成了个 V V 子集 { D 1 , D 2 , . . . , D V } \{D^1,D^2,...,D^V\} ,每个子集中的样本在 A A 上的取值相同,于是特征子集 A A 的信息增益可以通过下式计算
Gain ( A ) = E n t ( D ) v = 1 V D v D E n t ( D v ) \text{Gain}\left(A\right)=Ent\left(D\right)-\sum^{V}_{v=1}\frac{|D^{v}|}{|D|}Ent\left(D^{v}\right)
其中,信息熵定义为
E n t ( D ) = k = 1 y p k log 2 p k Ent\left(D\right)=-\sum^{|y|}_{k=1}p_k\log^{p_k}_2
信息增益越大,那么特征子集 A A 中有助于分类的信息越多,因此可以使用信息增益作为特征子集的评价标准。其他“多样性度量”例如不合度量、相关系数等,稍加调整都可以用于特征子集的评价。

特征选择方法

  将特征子集搜索域特征子集评价相结合就可以得到特征选择方法,例如将前向搜索与信息熵相结合,这显然与决策树算法非常类似,事实上,决策树也可以应用于特征选择,树结点的划分属性所组成的集合就是选择出的特征子集。其他的特征选择方法未必像决策树特征选择这么明显,但他们实质上都是显式或隐式的结合了某种(或多种)子集搜索和子集评价机制。常见的特征选择方法大致可以分为三大类:过滤式(filter)、包裹式(wrapper)和嵌入式(embedding)。

“过滤式”特征选择

  “过滤式”方法首先对数据集进行特征选择,然后在训练学习器,因此特征选择过程与后续学习器的训练无关。其中最著名的方法是Kira和Rendell在1992年提出来的Relief(Relevant Features),以及由Kononenko于1994年提出的上述算法的改进版Relief-F,这两种方法通过设计出一个“相关统计量”来度量某个特征对于学习任务的重要性,下面分别介绍这两种算法。
1. Relief(Relevant Features)
  该算法是一种基于特征权重(feature weight)的算法,灵感来源于1991年提出的“基于实例的学习”(Instance-based Learning),目的是为了解决现实任务中的概念学习问题,由于原始数据集中过多的特征会对要学习到的“目标概念”(target concept)产生不良的影响,例如,维度过高会导致计算效率的降低,过多的无关信息会造成预测精确度的下降,因此特征选择对于提高算法效率和精度十分重要。原文通过对之前提出的特征选择算法进行分析,提出了一种非启发式的、鲁棒性高、即使特征之间有相关性也同样适用的特征选择方法。
  给定数据集 S S ,每个样本点 x ( x 1 , x 1 , . . . , x p ) \mathbf{x}\left(\mathbf{x}_1,\mathbf{x}_1,...,\mathbf{x}_p\right) 是一个 p p 维向量,即原始数据集的特征个数为 p p ,采样个数为 m m 和一个合适的阈值 τ ( 0 τ 1 ) \tau\left(0\leq{\tau\leq{1}}\right) ,Relief通过检测并找出那些在统计学上与当前学习任务相关的特征,这些特征的“相关统计量”要大于之前设定的阈值 τ \tau 。根据数据集中数据类型的不同,两个样本点的对应特征之间的差别(diff)有如下的计算方法。
  标记型(例如,小雨、中雨、大雨):
(1) diff ( x k , y k ) = { 0 , if  x k = y k 1 , if  x k y k \text{diff}\left(x_k,y_k\right)= \begin{cases} 0, & \text{if $x_k=y_k$} \\[2ex] 1, & \text{if $x_k\neq{y_k}$} \end{cases} \tag 1
  数值型(离散型或连续型):
(2) diff ( x k , y k ) = ( x k y k ) / n u k \text{diff}\left(x_k,y_k\right)= \left(x_k-y_k\right)/nu_k \tag 2
(3) diff ( x k , y k ) = x k y k \text{diff}\left(x_k,y_k\right)=|x_k-y_k| \tag 3
以上各式中, x k x_k y k y_k 分别是样本点 x \mathbf{x} y \mathbf{y} 的第 k k 个特征值,需要注意的是在处理数值型数据集时,可以使用式(2)或(3),其中式(2)的 x k x_k y k y_k 是未经规范化的,而 n u k nu_k 是一个用来将 diff ( x k , y k ) \text{diff}\left(x_k,y_k\right) 规范化到 [ 0 , 1 ] [0,1] 之间的规范单元,式(3)中的 x k x_k y k y_k 则是已经规范到 [ 0 , 1 ] [0,1] 之间的值。
  Relief算法的伪代码如下图所示,

图1 Relief算法

算法第1行:输入量是数据集 S S ,采样个数 m m 和阈值 τ \tau
算法第2-3行:将数据集按正负标记划分为两个集合 S + S^+ S S^- (由此可见Relief只能应用在二分类问题上);
算法第4行:初始化特征权重向量 W \mathbf{W}
算法第5-14行:循环次数是一开始设定的采样个数 m m ,每次循环都要执行如下步骤,a.从数据集中随机采样得到样本点 x \mathbf{x} ,b.从正样本集合 S + S^+ 中选择距离 x \mathbf{x} 最近的样本点 z + \mathbf{z}^+ ,c.从负样本集合 S S^- 中同样选择距离 x \mathbf{x} 最近的样本点 z \mathbf{z}^- ,d.如果 x \mathbf{x} z + \mathbf{z}^+ 的标记相同,那么将 N e a r h i t Near-hit 设定为 z + \mathbf{z}^+ N e a r m i s s Near-miss 设定为 z \mathbf{z}^- ,否则相反,e.根据上一步得到的 N e a r h i t Near-hit N e a r m i s s Near-miss 对权重向量 W \mathbf{W} 进行更新,更新函数 update-weight ( ) \text{update-weight}\left(\right) 的描述在算法第20-22行;
算法第15行:计算每个特征与学习任务的相关度 R e l e v a n c e Relevance
算法第16-19行:如果第 i i 个特征的相关度 R e l e v a n c e i Relevance_i 大于阈值 τ \tau ,就将其作为相关特征保留下来,剔除那些低相关度的特征;
算法第20-22行: update-weight ( ) \text{update-weight}\left(\right) 函数根据每次循环采样得到的 x \mathbf{x} N e a r h i t Near-hit N e a r m i s s Near-miss 以及 diff \text{diff} 的计算方法,对权重向量中的每个分量进行更新。
从算法第22行所示的权重更新公式可以看出, diff ( x i , n e a r h i t i ) \text{diff}\left(x_i,near-hit_i\right) 越小代表样本点 x \mathbf{x} 在第 i i 个维度上与相同标记的样本点距离越近,即第 i i 个特征越有助于对样本点 x \mathbf{x} 进行正确分类, diff ( x i , n e a r m i s s i ) \text{diff}\left(x_i,near-miss_i\right) 越小代表第 i i 个特征越不利于对样本点 x \mathbf{x} 进行正确分类,因此越是对当前学习任务有利的特征,其权重越大,相关度也越高,这正好符合Relief算法的根本目的。文章中还根据切比雪夫不等式推导了阈值 τ \tau 的最佳取值与采样数 m m 和人工设置的算法可以容忍的最高第一类错误率 α \alpha 有关,当然也可以根据观察直接得出合适的 τ \tau 。另外,该算法的时间复杂度是 O ( p m ) O\left(pm\right) ,随着采样数的增加乘线性增长,因此不会受到数据集大小的影响,而且即使是在小样本集上,该算法也可以有效的剔除无关特征,但是就像之前提到的,该算法只适用于二分类问题,而且不能处理冗余特征。
2. Relief-F
  该算法作为Relief算法的扩展,于1994年由Kononenko提出,解决了原始Relief算法在处理不完全的、有噪声的、多类别标记的数据集上遇到的问题,文中提出一系列改进算法(Relief-A、Relief-B、…Relief-F),在Relief-D中为了解决样本点丢失特征值问题,引入了一种计算 diff ( x k , y k ) \text{diff}\left(x_k,y_k\right) 的新方法:两个样本 x \mathbf{x} y \mathbf{y} 在指定的第 k k 个特征上的值不同,如果相同那么 diff ( x k , y k ) = 0 \text{diff}\left(x_k,y_k\right)=0 ,下面首先假设样本 x \mathbf{x} 在选定的特征上的值丢失,那么通过下式计算
diff ( x k , y k ) = 1 P ( y k class ( x ) ) \text{diff}\left(x_k,y_k\right)=1-P\left(y_k|\text{class}\left(\mathbf{x}\right)\right)
其中, P ( y k class ( x ) ) P\left(y_k|\text{class}\left(\mathbf{x}\right)\right) 代表与样本 x \mathbf{x} 的标记相同的集合中,第 k k 个特征的值等于 y k y_k 的概率,假设样本 x \mathbf{x} y \mathbf{y} 在选定的特征上的值都丢失,那么通过下式计算
diff ( x k , y k ) = 1 v v a l u e k ( P ( v class ( x ) ) × P ( v class ( y ) ) ) \text{diff}\left(x_k,y_k\right)=1-\sum^{value_k}_{v}\left(P\left(v|\text{class}\left(\mathbf{x}\right)\right)\times{P\left(v|\text{class}\left(\mathbf{y}\right)\right)}\right)
其中, v a l u e k value_k 代表第 k k 个特征出现的所有值,但是使用这种计算法方法在处理数值型数据时会遇到问题。
  Relief-F基于上述算法又对处理多类别标记数据集提出了进一步改进,该算法考虑了所有类别标记不同于样本点 x \mathbf{x} 的标记并且与 x \mathbf{x} 距离最接近的样本点的影响,数学表达如下所示
W i = W i diff ( x i , n e a r h i t i ) / m + C class ( x ) ( P ( C ) × diff ( x i , n e a r m i s s i C ) ) / m W_i=W_i-\text{diff}\left(x_i,near-hit_i\right)/m+\sum_{C\neq{\text{class}\left(\mathbf{x}\right)}}\left(P\left(C\right)\times\text{diff}\left(x_i,near-miss^C_i\right)\right)/m
其中, C C 代表每个不同于样本点 x \mathbf{x} 标记的类别标记, P ( C ) = S c / S P\left(C\right)=|S_c|/|S| 是数据集中类别标记为 C C 的样本所占的比例, n e a r m i s s i C near-miss^{C}_i 代表类别标记为 C C 的样本集合中与 x \mathbf{x} 最近的样本的第 i i 个特征的取值。


这篇文章主要对过滤式(filter)特征选择方法,以及两个典型算法进行介绍,下一篇将会介绍其他两种选择方法:包裹式(wrapper)和嵌入式(embedding)。

猜你喜欢

转载自blog.csdn.net/qq_40793975/article/details/83068130