11.1 子集搜索与评价
如果我们想从特征集合中选区一个包含了所有重要信息的特征子集,如果我们没有任何先验知识,那么就只能遍历可能的子集,这会带来很高的计算复杂度;可行的一种做法是先产生一个“候选子集",评价它的好坏,然后在此基础之上产生下一个子集。这里涉及到两个关键环节,一是如何根据评价结果选择下一个候选子集,二是如何评价子集的好坏。
第一个环节是子集搜索,给定特征集合{
a1,a2,...,ad}\{a_1,a_2,...,a_d\}{
a1,a2,...,ad},我们可以将每个特征看作一个候选子集,对这ddd个候选单特征子集进行评定,假如{
a2}\{a_2\}{
a2}最优,那么我们就把{
a2}\{a_2\}{
a2}作为第一轮的选定集;然后,在上一轮选定集中加入一个特征,构成两个特征的候选子集,我们假定{
a2,a4}\{a_2,a_4\}{
a2,a4}最优且优于{
a2}\{a_2\}{
a2},那么我们就得到了新的候选子集,以此类推。这是一种前向搜索。我们也可以从完整的属性集合开始,每次去掉一个无关的特征,这样的方法叫后向搜索。#这个和决策树的生成很像。
显然,这个策略是贪心的。
第二个环节是子集评价,给定数据集DDD,我们可以计算属性子集的信息增益
Gain(A)=Ent(D)−∑v=1V∣Dv∣∣D∣Ent(Dv)Gain(A)=Ent(D)-\sum_{v=1}^V\frac{|D^v|}{|D|}Ent(D^v) Gain(A)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
更一般地,特征子集AAA实际上确定了对数据集DDD的一个划分,而样本标记信息YYY也对应着DDD的真实划分,我们对两个划分进行对比,也能对AAA进行评价。
常见的特征选择方法大体上分为三类:过滤式、包裹式、嵌入式
11.2 过滤式选择
过滤式方法先对数据集进行特征选择,然后训练学习器,特征选择过程与后续学习器无关。这相当于先用特征选择过程对初始特征进行过滤,再用过滤后的特征来训练模型。
Relief是一种著名的过滤式选择方法,我们先来描述这个算法工作流程,我们先定义一个向量δ\deltaδ。给出训练集{
(x1,y1),(x2,y2),...,(xm,ym)}\{(\mathbf{x_1},y_1),(\mathbf x_2,y_2),...,(\mathbf x_m,y_m)\}{
(x1,y1),(x2,y2),...,(xm,ym)},对每个示例xi\mathbf x_ixi,Relief先在xi\mathbf x_ixi的同类样本中寻找其最近邻xi,nh\mathbf x_{i,nh}xi,nh,称为猜中近邻;再从它的异类样本中寻找最近邻xi,nm\mathbf x_{i,nm}xi,nm,称为猜错近邻,对于属性jjj
δj=∑i−diff2(xij,xi,nhj)+diff2(xij,xi,nmj)\delta^j=\sum_{i} -diff^2(\mathbf x_i^j,\mathbf x_{i,nh}^j)+diff^2(\mathbf x_i^j,\mathbf x_{i,nm}^j)δj=i∑−diff2(xij,xi,nhj)+diff2(xij,xi,nmj)
其中diffdiffdiff的体现了两个样本对应属性的差异性,对于离散属性,我们可以取0/1,对连续属性,我们可以作差取绝对值。我们可以看到,如果同类样本越近,异类样本越远,向量对应位置的值的增益越大,也就是这个属性对分类越有用。#最后,通常要对上式进行平均。
扩展到多分类问题,
δj=∑i−diff2(xij,xi,nhj)+∑l≠kpl×diff2(xij,xi,nmj)\delta^j=\sum_{i} -diff^2(\mathbf x_i^j,\mathbf x_{i,nh}^j)+\sum_{l=\not k}p_l\times diff^2(\mathbf x_i^j,\mathbf x_{i,nm}^j)δ