第十一章:特征选择与稀疏学习

目录

1. 子集搜索与评价

2. 过滤式选择

3. 包裹式选择

4. 嵌入式选择与L正则化

5. 稀疏表示与字典学习

6. 压缩感知

二、实验

1.LVW算法


1. 子集搜索与评价

“特征”:属性

“相关特征”:对当前学习任务有用的属性

“无关特征”:没什么用的属性,与当前的学习任务无关的属性

“特征选择”:从给定的特征集合中选择出相关特征子集的过程,(数据预处理过程),通常在实际的机器学习中都会有这个过程

冗余特征:它们所包含的信息能从其他特征中推演出来,通常是无用的,但如果恰好对应了完成学习任务所需的“中间概念”,则该冗余特征是有益

原因:

  1. 在现实任务中经常会遇到维数灾难问题,这是由于属性过多而造成的
  2. 去除不相关特征往往会降低学习任务的难度

从初始的特征集合中选取一个包含了所有重要信息的特征子集,产生一个特征子集,去验证其他子集,然后看看哪个分类器的效果最好 

基于贪心策的子集搜索:

  • 前向搜索:先定一个最优的子集,然后选一个最优的加入这个特征子集,直到达到最优,无法再优化
  • 后向搜索:从完整的特征集中去掉一个最无关的特征
  • 两者结合叫做双向搜索

但很显然这种算法并不能达到最优 

子集评价:使用决策树的公式进行评价

  • 信息增益:

 \mathrm{Gain}(A)=\mathrm{Ent}(D)-\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}\mathrm{Ent}(D^{v})

  • 信息熵:

\mathrm{Ent}(D)=-\sum_{i=1}^{|\mathcal{Y}|}p_{k}\log_{2}p_{k} 

信息增益越大,意味着特征子集A包含的有助于分类的信息越多.

将子集搜索和子集评价相结合就是特征选择方法

2. 过滤式选择

过滤式方法:

  1. 先对数据集进行特征选择,
  2. 然后再训练学习器,

特征选择过程与后续学习器无关.这相当于先用特征选择过程对初始特征进行“过滤”,再用过滤后的特征来训练模型.

Relief方法:

设计一个“相关统计量”来确定特征的重要性,计量是一个向量,其每个分量分别对应于一个初始特征,而特征子集的重要性则是由子集中每个特征所对应的相关统计量分量之和来决定.

于是,最终只需指定一个阈值\tau,然后选择比\tau大的相关统计量分量所对应的特征即可;

也可指定欲选取的特征个数k,然后选择相关统计量分量最大的k个特征.

确定相关统计量:

“猜中近邻”:对每个示例x_i,Relief先在x_i的同类样本中寻找其最近邻x_{i,nh}

猜错近邻:再从x_i的异类样本中寻找其最近邻x_{i,nm}

相关统计量对应于属性j的分量为:

\delta^j=\sum_i-\mathrm{diff}(x_i^j,x_{i,\mathrm{nh}}^j)^2+\mathrm{diff}(x_i^j,x_{i,\mathrm{nm}}^j)^2

 猜中近邻越小越好,猜错近邻越大越好,属性j所对应的统计量分量.最后,对基于不同样本得到的估计结果进行平均,就得到各属性的相关统计量分量,分量值越大,则对应属性的分类能力就越强.

优点:Relief的时间开销随采样次数以及原始特征数线性增长,因此是一个运行效率很高的过滤式特征选择算法.

Relief只能针对二分类问题,而Relief-F可以处理多分类问题

Relief-F:

  1. 先再同类中找一个最近的,
  2. 再从异类中找一个最近的,
  3. 然后按一个权重加起来

\delta^{j}=\sum_{i}-\mathrm{diff}(x_{i}^{j},x_{i,\mathrm{nh}}^{j})^{2}+\sum_{l\neq k}\left(p_{l}\times\mathrm{diff}(x_{i}^{j},x_{i,l,\mathrm{nm}}^{j})^{2}\right)

3. 包裹式选择

包裹式特征选择:直接把最终将要使用的学习器的性能作为特征子集的评价准则.

结果:效能更好,但开销更大

LVW算法:一个典型的包裹式特征选择方法.它在拉斯维加斯方法框架下使用随机策略来进行子集搜索,并以最终分类器的误差为特征子集评价准则.

4. 嵌入式选择与L正则化

嵌入式特征选择:将特征选择过程与学习器训练过程融为一体,两者在同一个优化过程中完成,即在学习器训练过程中自动地进行了特征选择.

考虑线性回归模型,以平方误差为损失函数,优化目标为:

\min_{\boldsymbol{w}}\sum_{i=1}^m(y_i-\boldsymbol{w}^\mathrm{T}\boldsymbol{x}_i)^2

当样本特征多,样本数少时,模型会陷入过拟合

方法:引入正则化

  • L2正则化:

\min_{\boldsymbol{w}}\sum_{i=1}^{m}(y_{i}-w^{\mathrm{T}}x_{i})^{2}+\lambda\|\boldsymbol{w}\|_{2}^{2}

  • L1正则化:更易于获得“稀疏”解,即它求得的w会有更少的非零分量.

\min_{\boldsymbol{w}}\sum_{i=1}^{m}(y_{i}-w^{\mathrm{T}}x_{i})^{2}+\lambda\|\boldsymbol{w}\|_{1}^{1}

 如下图所示:

图4.1 L1、L2正则化

 两者的交点就是所要取的值,达到最小。而L1正则化相对L2更小一些,它在w2轴上,可以取到0值

对L1正则化求解:近端梯度下降:

损失函数用f(x)替代:

\min_{\boldsymbol{x}}f(\boldsymbol{x})+\lambda\|\boldsymbol{x}\|_1

\bigtriangledown f满足L-Lipschitz条件,得:

\begin{Vmatrix}\nabla f(\boldsymbol{x}')-\nabla f(\boldsymbol{x})\end{Vmatrix}_2^2\leqslant L\begin{Vmatrix}\boldsymbol{x}'-\boldsymbol{x}\end{Vmatrix}_2^2\quad(\forall\boldsymbol{x},\boldsymbol{x}')

函数的变化不大,则在xk附近可以用二阶泰勒展式:

\begin{gathered} \hat{f}(\boldsymbol{x}) \simeq f(\boldsymbol{x}_{k})+\langle\nabla f(\boldsymbol{x}_{k}),\boldsymbol{x}-\boldsymbol{x}_{k}\rangle+\frac{L}{2}\|\boldsymbol{x}-\boldsymbol{x}_{k}\|^{2} \\ =\frac{L}{2}\left\|x-\left(x_{k}-\frac{1}{L}\nabla f(\boldsymbol{x}_{k})\right)\right\|_{2}^{2}+\mathrm{const}, \end{gathered}

最小值在x_{k+1}获得:

x_{k+1}=x_k-\frac{1}{L}\nabla f(\boldsymbol{x}_k)

推广到正则化,加一个正则项求最小值:

x_{k+1}=\arg\min_{\boldsymbol{x}}\frac{L}{2}\left\|\boldsymbol{x}-\left(\boldsymbol{x}_{k}-\frac{1}{L}\nabla f(\boldsymbol{x}_{k})\right)\right\|_{2}^{2}+\lambda\|\boldsymbol{x}\|_{1}

得到每个分量的解:

x_{k+1}^i=\left\{\begin{array}{ll}z^i-\lambda/L,&\lambda/L<z^i ;\\0,&|z^i|\leqslant\lambda/L ;\\z^i+\lambda/L,&z^i<-\lambda/L\end{array}\right. 

5. 稀疏表示与字典学习

将数据集视为一个矩阵,行为样本,列为特征,我们需要通过特征选择把一些不重要的特征去掉,降低学习的难度

另一种稀疏性:矩阵中存在零元素,且非常分散

第二种稀疏性对学习任务是有益的,使问题变得线性可分,同时,因为0元素可以简化表达,还可以减少负担

所以,如果数据是稠密的,我们需要把它变稀疏

字典学习:需学习出一个“字典”.为普通稠密表达的样本找到合适的字典,将样本转化为合适的稀疏表示形式,从而使学习任务得以简化,模型复杂度得以降低

形式:

\min_{\mathbf{B},\alpha_{i}}\sum_{i=1}^{m}\|\boldsymbol{x}_{i}-\mathbf{B}\alpha_{i}\|_{2}^{2}+\lambda\sum_{i=1}^{m}\|\alpha_{i}\|_{1}

求解其最小值,求2个变量,需要先固定一个变量,我们先固定B,得到:

\min_{\alpha_{i}}\|\boldsymbol{x}_{i}-\mathbf{B}\alpha_{i}\|_{2}^{2}+\lambda\|\boldsymbol{\alpha}_{i}\|_{1}

再固定a,

\min_{\mathbf{B}}\|\mathbf{X}-\mathbf{B}\mathbf{A}\|_{F}^{2}

基于逐列更新策略的KSVD,对上式进行求解:

\begin{aligned} \operatorname*{min}_{\mathbf{B}}\|\mathbf{X}-\mathbf{BA}\|_{F}^{2}& =\min_{b_{i}}\left\|\mathbf{X}-\sum_{j=1}^{k}b_{j}\alpha^{j}\right\|_{F}^{2} \\ &=\min_{\boldsymbol{b}_i}\left\|\left(\mathbf{X}-\sum_{j\neq i}\boldsymbol{b}_j\boldsymbol{\alpha}^j\right)-\boldsymbol{b}_i\boldsymbol{\alpha}^i\right\|_F^2 \\ &=\min_{b_{i}}\left\|\mathbf{E}_{i}-b_{i}\alpha^{i}\right\|_{F}^{2} . \end{aligned}

初始化字典矩阵B之后反复迭代上述两步,最终即可求得字典B和样本xi的稀疏表示oi.在上述字典学习过程中,用户能通过设置词汇量k的大小来控制字典的规模,从而影响到稀疏程度.

6. 压缩感知

 现实,常对数据进行压缩,方便处理,但在传递的时候,因为各种情况会出现信息损失,通过压缩感知来解决这个问题

假定我们以远小于奈奎斯特采样定理要求的采样率进行采样,即

y=\Phi x

 这个信号是无法还原出原信号的

但现在假定可以,

y=\Phi \Psi s = As

若s具有稀疏性,这个问题就可以解决

因为稀疏性使得未知因素的影响大为减少.\Psi称为稀疏基,而A的作用则类似于字典,能将信号转换为稀疏表示.

压缩感知:压缩感知关注的是如何利用信号本身所具有的稀疏性,从部分观测样本中恢复原信号.压缩感知分为“感知测量”和“重构恢复”这两个阶段.

  • “感知测量”:关注如何对原始信号进行处理以获得稀疏样本表示
  • “重构恢复”:关注的是如何基于稀疏性从少量观测中恢复原信号,这是压缩感知的精髓

矩阵A满足k限定等距性:

(1-\delta_k)\|s\|_2^2\leqslant\|\mathbf{A}_ks\|_2^2\leqslant(1+\delta_k)\|s\|_2^2

此时就可以恢复原信号:

\begin{array}{cc}\min_{s}&\|s\|_0\\\\\mathrm{s.t.}&y=\mathbf{A}s\end{array}

求Lo范数最小化,这是个NP难问题.值得庆幸的是,L1范数最小化在一定条件下与Lo范数最小化问题共解,于是实际上只需关注L范数最小化问题求解,上式可转化为LASSO的等价形式再通过近端梯度下降法求解,即使用“基寻踪去噪”、

使用如下图的例子:

《笑傲江湖》和《云海玉弓缘》是武侠小说,

《万历十五年》和《人类的故事》是历史读物,

《人间词话》属于诗词文学.

将书籍按题材归类,则题材总数必然远远少于书籍总数

二、实验

1.LVW算法

  1.  导入所需要库
  2. 加载数据集
  3. 定义lVW函数
  4. 初始化,迭代选择特征子集
  5. 随机选择特征子集
  6. 评估特征子集
  7. 记录并比较性能
from sklearn.datasets import load_iris  
from sklearn.model_selection import cross_val_score  
from sklearn.linear_model import LogisticRegression  
from sklearn.feature_selection import SelectKBest, f_classif  
from itertools import combinations  
import numpy as np  
  
# 加载数据集  
iris = load_iris()  
X, y = iris.data, iris.target  
  
# 定义LVW函数  
def LVW(X, y, max_iter=100, threshold=0.01, learning_alg=LogisticRegression()):  
    best_score = 0.0  
    best_features = None  
    best_estimator = None  
  
    # 初始化特征全集  
    full_features = np.arange(X.shape[1])  
  
    for i in range(max_iter):  
        # 随机选择特征子集  
        random_features = np.random.choice(full_features, size=int(np.sqrt(X.shape[1])), replace=False)  
        X_subset = X[:, random_features]  
  
        # 评估特征子集  
        estimator = learning_alg.fit(X_subset, y)  
        scores = cross_val_score(estimator, X_subset, y, cv=5)  
        mean_score = np.mean(scores)  
  
        # 记录并比较性能  
        if mean_score - best_score > threshold:  
            best_score = mean_score  
            best_features = random_features  
            best_estimator = estimator  
  
    return best_score, best_features, best_estimator  
  
# 运行LVW算法  
score, features, estimator = LVW(X, y)  
print(f"Best score: {score:.4f}")  
print(f"Best features: {features}")

结果:

Best score表示通过LVW算法找到的最佳模型性能分数为0.9600(这是一个假设值,实际运行时可能会有所不同)。Best features表示通过LVW算法找到的最佳特征子集包含索引为0、2和3的特征。这意味着,在鸢尾花数据集的四个特征中,算法认为索引为0、2和3的特征组合能够给出最佳的模型性能

猜你喜欢

转载自blog.csdn.net/qq_63029071/article/details/141116601