特征工程是机器学习中非常重要的一个环节,它的好坏直接影响了机器学习效果的优劣。而特征工程里非常关键的一步就是特征选择。
如果把机器学习比作是一个厨师做菜的过程,那么数据就是原材料(菜),模型可以理解为炒菜的方式(蒸、煮、炒、炖等等),算法就是这个厨师的炒菜水平。特征工程就是前期处理食材的过程,有了食材(数据),首先要看看食材是啥,长什么样(源数据分布情况),然后看看食材是否新鲜,是否有磕碰破损(数据是否有缺失),再然后就是选取适当的部分(比如我炒做鸡蛋,鸡蛋壳肯定不能一起炒吧)完成我们想做的菜
0、为什么要做特征选择
就和炒菜要择菜一样,把老的菜叶,菜上带的泥土,草啊这些处理干净,这是保证炒出来的菜味道正常的前提。还有比如你一个人吃,你拿了一颗十斤的大白菜全部下锅炒,那肯定是太多了,实际可能只要几瓣叶子就够了。用专业的解释其实就是两个原因:
1、去除无关特征(冗余特征),比如特征属性里有矩形的长和宽两个特征了,那矩形的面积在这里可能就是冗余特征,除去冗余特征大部分时候会让训练更加快速完成。当然冗余特征是指在特定任务中而言,并非在所有任务里这个特征都是冗余的。
2、避免维度灾难,我们知道在实际工程中可能涉及到几千万甚至数十亿的特征,面对这些超大规模的特征数量,如果不降低特征维度,那训练过程耗时会更久,会消耗更多的计算资源。
1、特征选择的方法
如果我们想要从一个给定的特征集合里选出包含全部重要信息的特征子集,如果没有任何领域知识作为先验假设,那唯一的办法就是遍历全部子集然后训练,这样的集合数量有
2
d
2^{d}
2d 个,显然当 d 越来越大时,集合数量是指数增长,穷举法不可实现。
我们可以考虑产生一个候选子集,每次我们用某种“标准”选择最好的一个子集,然后基于该子集再产生一个候选子集,再选择最好的一个,不停迭代直到无法找到更好的子集为止。这里涉及到两个问题,第一如何根据评价结果选出下一个候选特征子集,第二如何评价候选特征子集好坏。
1.1 子集搜索和评价
第一个问题就是子集搜索,对给定的特征集合 { a 1 , a 2 , . . . , a d } \{a_1,a_2,...,a_d\} {a1,a2,...,ad},我们可以把所有单个特征作为子集,假设单特征子集里最优的是 { a 2 } \{a_2\} {a2},于是第一轮的候选子集就是 { a 2 } \{a_2\} {a2},然后,从剩下 d-1 个特征里再选出一个特征,构成包含两个特征的子集,不妨设 { a 4 } \{a_4\} {a4} 是这一轮选出的特征,构成子集 { a 2 , a 4 } \{a_2,a_4\} {a2,a4},且优于子集 { a 2 } \{a_2\} {a2},于是将 { a 2 , a 4 } \{a_2,a_4\} {a2,a4} 作为本轮的最优子集,如此循环,假设到 k+1 轮,得到的子集 A k + 1 A_{k+1} Ak+1 不如上一轮子集 A k A_k Ak,则迭代停止。这种逐步增加特征的方式我们称为“前向”搜索,类似地,从完整的特征集合开始,逐步减少特征的方式称为“后向”搜索,当然也可以将两种策略结合,称为“双向”搜索。
显然上面的过程是基于贪心策略的,因而不可避免地会遇到没有选中全局最优子集的问题,例如在四元特征子集里最优的可能是
{
a
2
,
a
4
,
a
5
,
a
6
}
\{a_2,a_4,a_5,a_6\}
{a2,a4,a5,a6},但是在三元特征子集里最优的可能是
{
a
2
,
a
4
,
a
7
}
\{a_2,a_4,a_7\}
{a2,a4,a7},但是在最优的三元子集基础上无法搜索到四元的最优子集。
第二个问题是子集评价问题,为方便起见,以离散特征为例,对于给定数据集
D
D
D,假设
D
D
D 中第
i
i
i 类样本所占的比例为
p
i
p_i
pi,对属性子集
A
A
A,假设根据其取值,将数据集合
D
D
D,分成了
V
V
V个子集,
{
D
1
,
D
2
,
.
.
.
,
D
V
}
\{D^1,D^2,...,D^V\}
{D1,D2,...,DV},每个子集中的样本在
A
A
A 上的取值相同,那么属性子集
A
A
A 的信息增益为:
G
a
i
n
(
A
)
=
E
n
t
(
D
)
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
E
n
t
(
D
v
)
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)
其中熵定义为:
E
n
t
(
D
)
=
−
∑
i
=
1
∣
y
∣
p
i
log
2
(
p
i
)
Ent(D)=-\sum_{i=1}^{|y|}p_i\log_2(p_i)
Ent(D)=−∑i=1∣y∣pilog2(pi)
信息增益越大,意味着特征子集包含有助于分类的信息越多,对于每个候选特征子集,可以通过计算对数据集
D
D
D 的信息增益来作为评判准则。将上述两个问题合到一起也就得到了特征选择的方法,上面提到的利用信息增益来作为选择标准便和决策树算法很类似。
常见的特征选择算法分为三类:过滤式(filter),包裹式(wrapper),嵌入式(embedding)
1.2 过滤式选择
过滤式方法是先对源数据进行特征选择,然后再给学习器进行训练,相当于是用特征选择方法对初始特征先进行“过滤”。
Relief 算法
Relief算法最早是针对二分类问题提出的,它的主要思想就是设计了一个“相关统计量”来衡量特征的重要性,该统计量是一个向量,向量的每个分量是对其中一个初始特征的评价值,特征子集的重要性就是子集中每个特征所对应的相关统计量之和。因此有两种方式可以选择特征,一个是设定一个阈值 τ \tau τ,选择大于 τ \tau τ 的统计量对应的特征,另一种是指定特征个数 K K K,跟进统计量大小从大到小取前 K K K 个特征。
那如何来设计这个相关统计量呢?因为对于二分类问题,我们希望可以找到一个决策面来区分,Relief算法也是借助这个“假设间隔”的思想,构造了这样一个统计量
θ
=
1
2
(
∥
x
−
M
(
x
)
∥
−
∥
x
−
H
(
x
)
∥
)
\theta=\frac{1}{2}(\lVert x-M(x)\rVert-\lVert x-H(x)\rVert)
θ=21(∥x−M(x)∥−∥x−H(x)∥)
其中
M
(
x
)
,
H
(
x
)
M(x),H(x)
M(x),H(x) 分别是和
x
x
x 同类别的最近的点以及和
x
x
x 异类的最近的点
根据直观的理解,当一个属性对分类效果明显时,在同类别里的样本在该属性上的距离是比较近的,而在异类样本中距离较远。因此在上面的式子中,我们希望第一项越小,第二项越大,那么该属性对于分类越有利。
假设训练集为
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
m
,
y
m
)
}
\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}
{(x1,y1),(x2,y2),...,(xm,ym)},对每个样本
x
i
x_i
xi ,计算同类别的最近邻
x
i
,
n
h
x_{i,nh}
xi,nh,称为“猜中近邻”(near-heat),然后计算异类别最近邻
x
i
,
n
m
x_{i,nm}
xi,nm,称为“猜错近邻”(near-miss),则属性
j
j
j 对应的相关统计量为:
δ
j
=
∑
i
−
d
i
f
f
(
x
i
j
,
x
i
,
n
h
j
)
2
+
d
i
f
f
(
x
i
j
,
x
i
,
n
m
j
)
2
\delta^{j}=\sum_{i}-diff(x_{i}^{j}, x_{i,nh}^{j})^2+diff(x_{i}^{j}, x_{i,nm}^{j})^2
δj=i∑−diff(xij,xi,nhj)2+diff(xij,xi,nmj)2
其中
x
a
j
x_{a}^{j}
xaj 是样本
x
a
x_{a}
xa 在属性
j
j
j 上的属性值,距离的计算根据属性值类型有所不同:
离散型:
i
f
x
a
j
=
x
b
j
d
i
f
f
(
x
a
j
−
x
b
j
)
=
0
e
l
s
e
d
i
f
f
(
x
a
j
−
x
b
j
)
=
1
if \ x_{a}^{j}=x_{b}^{j} \quad diff(x_{a}^{j}-x_{b}^{j})=0 \quad else \quad diff(x_{a}^{j}-x_{b}^{j})=1
if xaj=xbjdiff(xaj−xbj)=0elsediff(xaj−xbj)=1
连续性:
d
i
f
f
(
x
a
j
−
x
b
j
)
=
∣
x
a
j
−
x
b
j
∣
diff(x_{a}^{j}-x_{b}^{j})=\vert x_{a}^{j}-x_{b}^{j}\vert
diff(xaj−xbj)=∣xaj−xbj∣
这里
x
a
j
,
x
b
j
x_{a}^{j}, x_{b}^{j}
xaj,xbj 均已经标准化到[0,1]区间。
Relief-F算法
Relief算法针对二分类问题,对于多分类问题,需要用Relief-F算法处理,假设有
M
M
M 个类别,样本
x
i
x_i
xi 属于第
k
k
k 类,我们首先在
k
k
k 类中找到和
x
i
x_i
xi 最近的点
x
i
,
n
h
x_{i,nh}
xi,nh,然后在其他各类中分别找到与
x
i
x_i
xi 最近的点
x
i
,
l
,
n
m
x_{i,l,nm}
xi,l,nm,则相关统计量关于属性
j
j
j 的分量为:
δ
j
=
∑
i
[
−
d
i
f
f
(
x
i
j
,
x
i
,
n
h
j
)
2
+
∑
l
≠
k
(
p
l
∗
d
i
f
f
(
x
i
j
,
x
i
,
l
,
n
m
j
)
2
)
]
\delta^{j}=\sum_{i}[-diff(x_{i}^{j}, x_{i,nh}^{j})^2+\sum_{l\neq k}(p_l*diff(x_{i}^{j}, x_{i,l,nm}^{j})^2)]
δj=i∑[−diff(xij,xi,nhj)2+l̸=k∑(pl∗diff(xij,xi,l,nmj)2)]
其中
p
l
p_l
pl 是第
l
l
l 个类别样本占总样本的比值。
1.3 包裹式选择
包裹式的特征选择是直接根据给定的学习器进行优化,通常效果比过滤式选择效果好。但是不足之处在于每次都有重新训练模型,开销比较大。
LVW(Las Vegas Wrapper) 是经典的包裹式选择算法,它在拉斯维加斯框架下进行随机子集搜索,并以最终分类器的误差为特征子集评价标准。算法表述如下:
利用交叉验证法来估计学习器 E \mathcal{E} E 在特征子集 A ′ A' A′ 上的误差,若误差小于在子集 A A A 上的误差,则保留 A ′ A' A′ ,仍保留 A A A
1.4 嵌入式选择
过滤式选择和包裹式选择和模型优化的过程是分开的,而嵌入式顾名思义是和模型优化过程合在一起的。
以线性模型为例,损失函数为平方损失,则目标函数为:
min
ω
∑
i
=
1
N
(
y
i
−
w
T
⋅
x
i
)
2
\min_{\omega}\sum_{i=1}^{N}(y_i-w^{T}\cdot x_i)^2
ωmini=1∑N(yi−wT⋅xi)2
但是,当特征数量远远超过样本数量的时候,训练出来的模型就会出现过拟合,为了避免这种情况,我们就需要加入正则项, 引入L-p范数,p=0,1,2等任意非负数
min
ω
∑
i
=
1
N
(
y
i
−
w
T
⋅
x
i
)
2
+
λ
∥
w
∥
p
2
\min_{\omega}\sum_{i=1}^{N}(y_i-w^{T}\cdot x_i)^2+\lambda\lVert w\rVert _{p}^{2}
ωmini=1∑N(yi−wT⋅xi)2+λ∥w∥p2
其中
λ
>
0
\lambda>0
λ>0 是正则化参数,当p=2时,上式称为“岭回归”,当p=1时,称为“LASSO”回归,这两中正则化方式都可以方式过拟合,但是在本质上有差异,L2范数通过调整每个特征的权重来避免过拟合,而L1范数则是会对特征进行筛选,留下有效的特征,删除无效的特征。
L2范数可以直接求导解决,但是L1范数不能,只能通过求次微分来计算,周志华老师《机器学习》书里提到用近似梯度下降(PGD)来求解。求解过程不在此具体展开。
参考资料:
1、周志华《机器学习》
2、https://zhuanlan.zhihu.com/p/26015351