# 特征选择总结

## 过滤式(Filter)

### 规则

可以用简单的规则用来剔除一些信息很少的特征:

* **特征值缺失比**过大, 如缺失率大于95%
* 特征中**单类别比例**过大, 如大于95%, 绝大多数样本在这个特征上表现相同, 也就没有区别度了, 可以抛弃

### 统计指标

统计指标计算的是单项特征与标签真值之间的关系, 分析出单个特征**与真值标签的相关性**或**包含信息的多少**, 选择出高相关性或包含更多信息的特征. 常用的统计指标有:

* 卡方统计量
* 基尼系数
* IV值, 在[评分卡模型](https://kerasnoone.gitbook.io/garnet/xi-fen-ling-yu/jin-rong-ling-yu/ping-fen-ka-mo-xing)中使用
* 相关系数, 这里指的是特征与真值标签之间的相关系数. 常用的有Pearson相关系数, 最大互信息系数(MIC), 距离相关系数(Distance Correlation)

### 结合模型

将所有特征通过集成模型(Ensemble model)拟合, 模型本身提供每种特征的重要程度, 依据特征重要程度的定量衡量进行特征选择. 常用的模型有XGBoost, LightGBM等.

### 特征间相关性分析

除了分析单个特征所包含的信息, 还要衡量**特征之间的相关性**, 或者说**共线性**. 如果多个特征之间相关, 甚至是高度的线性相关, 会带来:

* 模型预测稳定性低, 进而带来模型预测质量低
* 相关特征的权重/重要性会有较大的随机性, 使系数权重变得无法解释

分析特征之间相关性的方法与分析特征与标签之间相关性的方法相同, 最长用的**Pearson相关系数**, 简单高效, 但缺点是只能衡量线性相关性. 另外常用的还有:

* 互信息, Mutual Information, MI
* 最大互信息系数, Maximal Information Coefficient, MIC
* 距离相关系数, Distance Correlation

## 包裹式(Wrapper)

Wrapper的核心思想是**基于模型评估指标选择**.

### 单特征训练模型

使用数据集中的一个特征, 在训练集上训练模型, 在验证集(dev)上预测结果, 并使用metric指标进行评价. 例如对于分类任务, 使用AUC指标, 并设定一个阈值, 如果在验证集上的AUC值小于0.5, 则认为这个特征是一个**噪音比较大**的特征, 应当筛除.

一般使用基于决策树的ensemble模型, 如XGBoost, LightGBM等.

### Stepwise

主要包含三种:

* **前向选择 forward**: 逐步将变量一个一个放入模型, 并计算相应的指标, 如果指标值符合条件, 则保留, 然后再放入下一个变量, 直到没有符合条件的变量纳入或者所有的变量都可纳入模型
* **后向选择 backward**: 一开始将所有变量纳入模型, 然后挨个移除不符合条件的变量, 持续此过程, 直到留下所有最优的变量为止
* **逐步选择 stepwise**: 该算法是向前选择和向后选择的结合, 逐步放入最优的变量, 移除最差的变量

### Permutation importance

首先使用全部的特征进行训练得到模型, 然后在**验证集**上, 对某一个特征在样本层面上进行shuffle, 如果shuffle之后的"验证集"的预测准确性没有发生大的变化, 甚至变的更好了, 那么这个特征的意义不大, 应当剔除.

## 嵌入式(Embedding)

嵌入式的方法严格来说不是一种典型的特征选择方法. 表象是不需要进行显式的特征选择过程, 而是在模型训练过程中对某些特征依赖大, 某些特征依赖小, 从而实现隐式地特征选择.

### 损失函数的正则化约束

L1, L2正则化对特征的权重直接加以限制, 都会带来权值稀疏的作用, 从而带来了隐式的特征选择的作用.

## 参考资料

* [机器学习之特征选择方法](https://www.biaodianfu.com/feature-selection.html)
* [变量选择主要方法](http://shichen.name/slide/20171115scorecard/#24)
* [IEEE Part3强特强tricks介绍](https://mp.weixin.qq.com/s/P5tPFVFqpIp-xhjcP-6gXQ)
