# 1.3 Feature Extraction and Selection

我们常说数据和特征决定了机器学习的上限，而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢？

特征工程是从原始数据出发，构造可以直接作为机器学习模型输入的特征的过程。特征工程主要包括:

* Feature Extraction (特征提取）
* Feature Selection（特征选择）

## 1) Feature Extraction

* Feature Extraction (特征提取) 从最初的一组测量数据开始，构建旨在提供信息且非冗余的派生值（特征），通过X，创造新的X'，以促进后续的学习和泛化过程。
* 一个非常简单的例子，现在出一非常简答的二分类问题题，请你使用逻辑回归，设计一个身材分类器。输入数据X:身高和体重 ，标签为Y:身材等级（胖，不胖）。显然，不能单纯的根据体重来判断一个人胖不胖，姚明很重，他胖吗？显然不是。针对这个问题，一个非常经典的特征工程是，BMI指数，BMI=体重/(身高^2)。这样，通过BMI指数，就能非常显然地帮助我们，刻画一个人身材如何。甚至，你可以抛弃原始的体重和身高数据。
* 特征提取是一个降维过程，将原始变量的初始集合降维至更易于管理的组别（特征）进行处理，同时仍然准确、完整地描述原始数据集。
* 特征提取通常需要基于特定领域的专家知识，也可以基于一些自动化的算法。例如在过去传统的图像分类方法中，有一种是利用一个被称为SIFT(Scale-invariant feature transform)的变换去从图像中计算特征，设计这个变换就需要利用很多专家知识；在近年来发展很快的基于深度学习的图像分类算法中，这种特征提取则是在训练神经网络的过程中自动完成的。
* 对NGS而言，原始数据是一些reads的序列，传统的分类器是很难直接从reads中学到有用的信息的。我们前面介绍的很多NGS数据的分析方法都可以理解为一种特征提取。例如计算表达矩阵，就是从测序的原始数据出发，再利用我们已知的相应物种的基因组序列和注释这样一些外部信息，进行特征提取，最后得到的特征就是每个基因的表达量。

## 2) Feature Selection

特征选择指的是，在通过特征提取把特征确定下来之后，我们很多时候并不是把所有的特征都输给机器学习算法，而是只选取一部分特征。特征选择对于无监督学习和有监督学习都是适用的。

* 对于无监督学习，我们希望特征在样本中应当一定的variation。如果一个特征在不同样本中几乎都是一个恒定值，这个特征对于聚类等任务就没有什么用处。
* 对于有监督学习，我们希望选取和样本的label有关的变量，舍弃无关的变量，以此降低过拟合风险，增加模型可解释性，减少计算开销。

我们这里着重讨论有监督问题的特征选择。根据特征选择的形式又可以将特征选择方法分为三类:

* **Filter**
  * 按照一定的统计指标对单个的特征进行评分，设定阈值或者待选择阈值的个数，选择特征
  * 例如，每一个特征t检验,ANOVA等的p值，和目标变量的互信息等等，都可以作为一个排序的指标
* **Embedded**
  * 对于很多机器学习模型而言，训练好模型之后，我们就可以通过一些方式来评估每一个特征对预测结果的贡献，根据贡献的大小就可以设定阈值或者待选择阈值的个数，选择特征
  * 例如，对于logistic回归，我们认为系数绝对数值越大的特征对分类贡献越大；对随机森林，节点平均深度越浅的特征对分类结果贡献越大，等等
* **Wrapper**
  * 选用不同的特征子集训练模型，以交叉验证的效果等为优化目标确定最优的组合
  * 我们一般不可能枚举所有组合，而是会采用一些heuristics，如递归特征消除(recursive feature elinmination, RFE)等

不难看出，在这三种方法中，**Filter**方法并不涉及机器学习模型的训练，只是计算了一些统计指标。后两种都是依赖于机器学习模型的方法。

* python的[sklearn](https://scikit-learn.org) package提供了一个用于特征选择的模块[sklearn.feature\_selection](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.feature_selection)，在文档中也对feature selection专门进行了介绍，请参考<https://scikit-learn.org/stable/modules/feature_selection.html>。
* R [caret](https://cran.r-project.org/web/packages/caret/vignettes/caret.html) package也实现了很多特征选择的方法，文档里也进行了详细的介绍，请参考<https://topepo.github.io/caret/feature-selection-overview.html>。这里提到的"Models with Built-In Feature Selection"就是我们前面提到的"Embedded"方法。

## 3) References

* [1. 特征工程到底是什么？](https://www.zhihu.com/question/29316149)
* [2. 机器学习：特征工程、特征提取、特征选择与数据降维间的关系](https://blog.csdn.net/mechleechan/article/details/87153050)
