ch11 特征选择与稀疏学习

news/2024/9/24 18:06:23

子集选择与评价

缓解维度灾难的另一种重要方法是进行特征筛选,同时它也能降低学习任务的难度,只留下关键特征。

对当前学习任务有用的属性称为“相关特征”,而对当前学习任务没有用的属性称为“无关特征”,包含信息能被其他特征表示的属性称为“冗余特征”。

如果想要从原始特征集中选择出一个子集,那么就是一个特征选择问题。特征选择通常包含以下两个环节

  • 子集搜索:搜索最优特征子集
    暴力搜索会遇见组合爆炸问题,所以需要一些启发式方法,如贪心法(前向、后向、双向)

  • 子集评价:评价特征子集的好坏
    评价指标有很多,如信息增益、信息增益比、基尼指数、方差、相关系数等

常见的特征选择方法有:过滤法、包裹法、嵌入法

过滤法

先对数据集进行特征选择,再用特征子集训练模型,特征选择过程与学习过程无关

著名的算法有:Relief、Relief-F

Relief 设计了一个相关统计量用于度量特征的重要性

相关统计量:对于每一个样本点\(x_i\),寻找与其最近邻的样本点\(x_{i,nh}\)(同类)和\(x_{i,nm}\)(异类),于是我们可以定义如下的相关统计量

\[\delta^j = \sum_{i=1}^m - \text{diff}(x_{i,j}, x_{i,nh,j})^2 + \text{diff}(x_{i,j}, x_{i,nm,j})^2 \]

那么最终得到的一个统计量向量越大,说明子集选择的越好,分类性能越强

包裹法

直接利用学习器的性能来评价特征子集的好坏,通常效果更好,但计算开销也更大

著名的算法有:LVW 框架,在特征选择的过程中使用了随机算法

嵌入法

将特征选择过程与学习过程融为一体,直接在学习器上进行特征选择

著名的算法有: L1 正则化、L2 正则化

对于线性回归算法,我们通常认为有这样一条直线可以拟合数据

\[Y = XW \]

\(X\)不可逆时,我们使用最小二乘法,即

\[\min \| Y - XW \|_2^2 \]

\[W = (X^T X)^{-1} X^T Y \]

\(X\)列不满秩时,即\(X^T X\)不可逆,即样本特征多于样本数,此时我们可以使用正则化

\[\min \| Y - XW \|_2^2 + \lambda \| W \|_2^2 \]

\[W = (X^T X + \lambda I)^{-1} X^T Y \]

保证了\(X^T X + \lambda I\)可逆,从而解决了多重共线性问题

这是一种罚函数法,即在目标函数中加入了一个罚函数,使得优化问题变得更加复杂

最直观的罚函数是 L0 范数,即非零元素的个数,但是 L0 范数是一个非凸函数,所以我们通常使用 L1 范数,L1 通常能获得稀疏解,即有些特征的权重为 0

img

因此可以说,L1 正则化是一种特征选择方法

L1 正则化的求解方法

可以使用近端梯度下降法(Proximal Gradient Descent),对于优化目标

\[\min_x f(x) + \lambda \| x \|_1 \]

如果满足 Lipschitz 连续梯度条件,即

\[\exist L > 0, \quad \| \nabla f(x) - \nabla f(y) \|_2 \leq L \| x - y \|_2, \quad \forall x, y \]

那么在\(x_k\)处对目标函数进行二阶泰勒展开,有

\[f(x) \approx f(x_k) + \nabla f(x_k)^T (x - x_k) + \frac{L}{2} \| x - x_k \|_2^2 \\ = \frac{L}{2} \| x - (x_k - \frac{1}{L} \nabla f(x_k)) \|_2^2 + \text{const} \]

? 那么我们可以得到

\[x_{k+1} = \arg \min_x \frac{L}{2} \| x - (x_k - \frac{1}{L} \nabla f(x_k)) \|_2^2 \\ \Rightarrow x_{k+1} = x_k - \frac{1}{L} \nabla f(x_k) \]

最小值可以通过如上的迭代方式求解,即梯度下降法是对 二次拟合函数的近似

那么应用到 L1 正则化的问题上,我们可以得到

\[x_{k+1} = \arg \min_x f(x_k) + \nabla f(x_k)^T (x - x_k) + \frac{L}{2} \| x - x_k \|_2^2 + \lambda \| x \|_1 \\ \Rightarrow x_{k+1} = \arg \min_x \frac{L}{2} \| x - (x_k - \frac{1}{L} \nabla f(x_k)) \|_2^2 + \lambda \| x \|_1 \]

这个问题不存在交叉项,因此可以使用坐标轴下降法(Coordinate Descent)求解,即

\[x_i^{(k+1)} = \arg \min_{x_i} \frac{L}{2} (x_i - z_i^{k})^2 + \lambda |x_i| \]

求导数,令导数为 0,即可得到

\[x_i^{(k+1)} = \begin{cases} z_i^{(k)} - \frac{\lambda}{L}, & z_i^{(k)} > \frac{\lambda}{L} \\ 0, & |z_i^{(k)}| \leq \frac{\lambda}{L} \\ z_i^{(k)} + \frac{\lambda}{L}, & z_i^{(k)} < -\frac{\lambda}{L} \end{cases} \]

L1 正则化的求解方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/46240.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

深度学习--seqt2seq RNN 英语翻译法语--86

目录1. 结构2. 代码解读 1. 结构我画的:2. 代码解读 导包 import nltk import numpy as np import re import shutil import tensorflow as tf import os import unicodedatafrom nltk.translate.bleu_score import sentence_bleu, SmoothingFunction数据集的预处理 def clean…

# 机器学习day05

机器学习第五天……张量元素类型转换data.type(torch.DoubleTensor)data = torch.full([2, 3], 10)print(data.dtype)# 将 data 元素类型转换为 float64 类型 data = data.type(torch.DoubleTensor)print(data.dtype)# 转换为其他类型 # data = data.type(torch.ShortTensor)# …

Kali 安装并配置 Nessus

Kali 安装并配置 Nessus 安装 Nessus创建nessus文件夹sudo mkdir /opt/nessus下载 Nessus ( https://www.tenable.com/downloads/nessus?loginAttempted=true ),并上传至 /opt/nessus 文件夹在 /opt/nessus 路径下,使用命令安装 Nessusdpkg -i Nessus-10.7.4-debian6_amd64.…

Kotlin 数据类型详解:数字、字符、布尔值与类型转换指南

Kotlin中变量类型由值决定,如Int、Double、Char、Boolean、String。通常可省略类型声明,但有时需指定。数字类型分整数(Byte, Short, Int, Long)和浮点(Float, Double),默认整数为Int,浮点为Double。布尔值是true或false,Char用单引号,字符串用双引号。数组和类型转换…

Exercises

### Auto自动化变量自动存储类别是默认的存储类别,通常用于在”函数内部定义的局部变量“。这些变量会在程序执行到其定义的代码块时对应的栈空间被创建,函数执行完毕后变量对应栈空间会自动销毁。 示例: int main() //宿主 {auto int data;//寄生虫 auto int data; 局部变量…

vxlan基本原理及裸搭过程

https://mp.weixin.qq.com/s/pqVvBd2CbHkWwD79aDb6mg剥离flannel或者其他overlay网络的上层封装,我们可以通过 ip命令纯手工搭建一个vxlan overlay网络, 这其中最关键的部分是:vethpair: 打通容器内外 vxlan.nic: 虚拟网卡,封装/解封数据包除了创建这些硬件,我们还需要设置…

c语言程序实验————实验报告十二

c语言程序实验————实验报告十二实验项目名称: 实验报告十二 用指针处理函数与数组 实验项目类型:验证性 实验日期:2024 年 5 月 30 日一、实验目的 1.掌握指针变量的定义格式,会定义和使用指针变量 2.能正确建立指针变量与数组(包括一维、两维和字符串数组)的联系,并…

6.21-二叉搜索树的最近公共祖先

235. 二叉搜索树的最近公共祖先 题意描述:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己…