[机器学习-从入门到入土] 特征选择
个人导航
知乎:https://www.zhihu.com/people/byzh_rc
CSDN:https://blog.csdn.net/qq_54636039
注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码
参考文章:各方资料
文章目录
- [[机器学习-从入门到入土] 特征选择](#[机器学习-从入门到入土] 特征选择)
- 个人导航
- 核心概念
-
-
-
- [Relevant feature(相关特征)](#Relevant feature(相关特征))
- [Irrelevant feature(无关特征)](#Irrelevant feature(无关特征))
- [Redundant feature(冗余特征)](#Redundant feature(冗余特征))
- 为什么要做特征选择
-
-
- [子集搜索 Subset Search](#子集搜索 Subset Search)
-
-
-
- [1.序列前向搜索(SFS, Sequential Forward Selection)](#1.序列前向搜索(SFS, Sequential Forward Selection))
- [2.序列后向搜索(SBS, Sequential Backward Selction)](#2.序列后向搜索(SBS, Sequential Backward Selction))
-
-
- [子集评价 Subset Evaluation](#子集评价 Subset Evaluation)
- 特征选择方法
-
-
-
- [1.过滤式 Filter](#1.过滤式 Filter)
- [2.包裹式 Wrapper](#2.包裹式 Wrapper)
- [3.嵌入式 Embedded](#3.嵌入式 Embedded)
-
-
- [字典学习 Dictionary Learning](#字典学习 Dictionary Learning)
核心概念
Relevant feature(相关特征)
对预测或分类任务有帮助的特征。
例:在预测房价时,"房屋面积"就是相关特征。
Irrelevant feature(无关特征)
对预测或分类任务没用的特征。
例:预测房价时,"房屋颜色"可能无关。
Redundant feature(冗余特征)
与其他特征高度相关,可以从其他特征推导出来。
例:房屋"面积"与"每层面积×楼层数"可能高度相关,第二个特征就是冗余特征。
为什么要做特征选择
- 降低模型复杂度
少量特征 → 模型更简单 → 更容易理解、训练快 - 缓解维度灾难(curse of dimensionality)
维度过高会导致样本稀疏、模型泛化差
子集搜索 Subset Search
"在所有特征中找到最佳子集"
问题是:如果有 20 个特征,子集组合有 2 20 ≈ 10 6 2^{20} \approx 10^6 220≈106 种,枚举太慢
解决办法 :贪心策略(Greedy Strategy)
-> 一次只增加或删除一个特征 → 找到局部最优
1.序列前向搜索(SFS, Sequential Forward Selection)
- 策略:从空集合开始,每次加入一个最优特征(提升性能最多的)
- 优点:直观,容易实现
- 缺点:局部最优
2.序列后向搜索(SBS, Sequential Backward Selction)
- 策略:从全特征开始,每次删除一个最不重要的特征(性能下降最小的)
- 优点:适合特征少时从整体优化
- 缺点 :计算量大,仍可能局部最优
子集评价 Subset Evaluation
数据集 D D D 根据特征 A A A 分为 V V V 个子集: { D 1 , D 2 , . . . , D V } \{D^1, D^2, ..., D^V\} {D1,D2,...,DV}
信息增益(Gain)
- 思想:衡量一个特征划分数据集后"减少混乱(entropy)"的程度。
- 公式:
Gain ( A ) = Ent ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ Ent ( D v ) \operatorname{Gain}(A) = \operatorname{Ent}(D) - \sum_{v=1}^{V} \frac{|D^v|}{|D|} \operatorname{Ent}(D^v) Gain(A)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
- Ent ( D ) = − ∑ n p n log 2 p n \operatorname{Ent}(D) = -\sum_n p_n \log_2 p_n Ent(D)=−∑npnlog2pn
- p n p_n pn:第 n 类在数据集中的比例
- Entropy 越大 → 数据越"混乱"(类别越均匀)
- 直观理解 :用特征 A A A 划分后,如果子集内部类别更纯 → 信息增益大 → 特征重要
特征选择方法
1.过滤式 Filter
近似理解: "只看特征本身和标签的关系,先把'看起来没用的特征'筛掉"
- 思路 :先评估特征与目标的相关性,再选特征,不依赖学习器
- 例子:信息增益、相关系数、Chi-square 测试等
- δ j = ∑ i − diff ( x i j , x i , n h j ) 2 + diff ( x i j , x i , n m j ) 2 \delta^j = \sum_i -\text{diff}(x_i^j, x_{i,nh}^j)^2 + \text{diff}(x_i^j, x_{i,nm}^j)^2 δj=∑i−diff(xij,xi,nhj)2+diff(xij,xi,nmj)2
- diff():两个样本在第 j 个特征上的差异
- near-hit:同类最近样本 → 想让相似
( x i , n h x_{i, nh} xi,nh为距离 x i x_i xi 最近且类别相同的样本) - near-miss:异类最近样本 → 想让差异大
( x i , n m x_{i, nm} xi,nm为距离 x i x_i xi 最近且类别不同的样本) - 直观理解 :好的特征 → 同类差距小、异类差距大 → δ j \delta^j δj 大
- 优点:速度快
- 缺点:忽略特征间的组合效果
2.包裹式 Wrapper
近似理解: "哪个特征组合让模型表现最好,我就选哪个"
- 思路 :把"特征子集"当作模型的超参数,用学习器的性能直接评价特征好坏
- 核心机制 :
- 给定一个特征子集
- 用该子集 训练一个学习器
- 用 分类准确率 / 损失函数 / 验证集性能 作为评价指标
- 搜索"性能最优"的特征子集
- 优点 :
- 直接以"最终任务性能"为目标
- 能考虑特征之间的组合效应
- 通常比 Filter 更准确
- 缺点 :
- 计算开销极大(每次评估都要训练模型)
3.嵌入式 Embedded
近似理解: "在训练模型时,顺手把没用的特征权重压成 0"
-
思路 :将特征选择过程"嵌入"到模型训练中,训练完成即完成特征选择
-
核心区别(与 Filter / Wrapper):
- Filter:训练前选特征
- Wrapper:反复训练模型来选特征
- Embedded:训练模型的同时选特征
-
关键技术:稀疏正则化(Sparse Regularization)
设线性模型:
y = w T x y = w^T x y=wTx在损失函数中加入正则项:
min w L ( w ) + λ Ω ( w ) w \min_w \; \mathcal{L}(w) + \lambda \Omega(w)w wminL(w)+λΩ(w)w -
不同范数的作用:
-
L2 正则化(Ridge)
Ω ( w ) = ∥ w ∥ 2 2 \Omega(w) = \|w\|_2^2 Ω(w)=∥w∥22
- 权重变小,但几乎不为 0
- ❌ 不能真正做特征选择
-
L1 正则化(Lasso)
Ω ( w ) = ∥ w ∥ 1 = ∑ j ∣ w j ∣ \Omega(w) = \|w\|_1 = \sum_j |w_j| Ω(w)=∥w∥1=∑j∣wj∣
- 会让部分权重严格变为 0
- ✔ 自动删除不重要特征
-
L0 正则化(理想但不可用)
∥ w ∥ 0 = # { w j ≠ 0 } \|w\|_0 = \#\{w_j \neq 0\} ∥w∥0=#{wj=0}
- 直接表示"使用了多少特征"
- ❌ 非连续、NP-hard,无法优化
→ 用 L1 近似 L0,实现可优化的特征选择
-
-
优点:
- 计算效率高于 Wrapper
- 自动完成特征选择
- 与模型训练高度一致
-
缺点:
- 强依赖模型假设(如线性)
- 对特征缩放敏感
最典型的稀疏建模目标:不关心数值大小, 只关心有多少个分量被使用
但 L 0 L_0 L0非凸,不连续,组合爆炸(NP-hard)
理想替身需要满足:
- 偏好 0(能产生稀疏解)
- 凸(全局最优)
- 尽量"像" L0L_0L0
在 x ≈ 0 x\approx 0 x≈0 附近:
- L 1 L_1 L1:斜率是常数 (会"持续推动"小系数 → 0)
- L 2 L_2 L2:斜率趋近 0 (在 0 附近几乎不管你)
L 1 L_1 L1是菱形, 优化时, 线性等值线最先接触到尖角
(尖角 = 某一维恰好为 0)
而 p < 1 p<1 p<1 时: 虽然更像 L 0 L_0 L0, 但 非凸 -> 优化再次变难
字典学习 Dictionary Learning
字典学习 = 学一组"基元",让每个样本只用其中很少几个来表示自己
字典学习不是选特征,而是学"可被稀疏使用的特征表示"
为什么要引入字典 B B B
在传统线性模型中:
x ≈ W z x \approx W z x≈Wz
- W W W 是固定的特征基(如原始特征、PCA 基)
- 问题:这些基不一定最适合当前数据
字典学习的核心升级:
- 不再使用固定基
- 而是直接从数据中学一组"最适合表示数据的基"
这组基就是 字典矩阵 B B B
字典矩阵 B B B 的每一行(或列)是一个 dictionary atom(原子)
为什么强调"稀疏表示" α i \alpha_i αi
对每个样本 x i x_i xi:
x i ≈ B α i x_i \approx B \alpha_i xi≈Bαi
但有一个强约束:
α i \alpha_i αi 里 大多数元素必须是 0
也就是说:
- 每个样本 只使用很少几个原子
- 不同样本 使用的原子不同
-> "0 元素是散列分布的,而不是某一整行 / 整列为 0"
说明:被"关掉"的不是某个特征, 而是**"某个样本是否使用某个原子"**
目标函数
min B , α i ∑ i = 1 m ∥ x i − B α i ∥ 2 2 ⏟ 重建误差 + λ ∥ α i ∥ 1 ⏟ 稀疏性约束 \min_{B, \alpha_i} \sum_{i=1}^m \underbrace{\|x_i - B\alpha_i\|2^2}{\text{重建误差}} + \lambda \underbrace{\|\alpha_i\|1}{\text{稀疏性约束}} B,αimini=1∑m重建误差 ∥xi−Bαi∥22+λ稀疏性约束 ∥αi∥1
-
第一项:重建误差(data fidelity)
字典 + 稀疏系数,必须能把原样本"拼出来", 否则字典没有表达能力 -
第二项:稀疏约束(sparsity)
逼迫 α i \alpha_i αi 里尽量多的元素变成 0 -
λ λ λ 的物理意义:
- λ ↑ \lambda \uparrow λ↑:表示更稀疏(更少原子),但重建误差变大
- λ ↓ \lambda \downarrow λ↓:表示重建更精确,但用的原子更多
不能一次性优化
B B B 和 α \alpha α 都是未知的
若固定 B B B:
→ 每个 α i \alpha_i αi 是一个 Lasso 问题(凸)
若固定 α \alpha α:
→ B B B 是一个 最小二乘问题(凸)
但同时对 B B B 和 α \alpha α 优化 → 非凸问题
交替优化
虽然不是全局最优,但实践中非常有效
- 固定字典 B B B,求每个样本的稀疏表示 α i \alpha_i αi
- 本质:L1 正则回归
- 固定所有 α i \alpha_i αi,更新字典 B B B
- 本质:最小二乘拟合
- 重复 1--2,直到收敛