# 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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.ncrnalab.org/teaching/part-iv.-machine-learning/1.machine-learning-basics/1.3.feature-engineering.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
