特征抽取、特征选择、特征工程

(更新于2019/03/02)

注意:关于这三个名词的概念,网上的一些内容并不是非常权威,当然也有人对这方面的内容做了比较详细的区分,所以看这部分内容的时候就需要仔细甄别,多看不同的内容。

1. 引言

在机器学习的流程中,如图1所示,这是一个完整的循环,针对一个特定的机器学习问题,这个循环应该是一直进行的,直到你对整个的模型性能满意的时候。

特征抽取、特征选择、特征工程
图1 机器学习流程[1]

因为现在已经存在了很多开源库,对于机器学习的算法和模型评估部分,都可以自动化的完成。在这种情况下,大部分时间为了解决一个问题,都是在特征工程上:怎么样构建特征,怎么样最大化利用原始数据,怎么样在这个步骤最大化后面模型的性能。
在最近的实践过程中,也发现很多时候我不是在思考算法,而是希望先将数据进行清理,然后转化成可以利用的形式,最后才是算法。可能真正用于测试算法的实践仅占整个流程的20%。不算模型调优的过程,在项目初期,先把这个流程走通,大部分时间都是花费在对数据进行处理上。
这篇随笔就记录下特征工程以及特征抽取、特征选择的定义等。

2. 定义

从众多的文章中挑选了两篇[2][3]比较认可的关于这方面的定义。这两篇定义方面的内容一样的,但他们出现在不同的地方。一开始的时候看了这两篇文章,觉得应该是对了;后面看的多了才发现这里也是不对的。[2][3]文章估计是一个人写的,或者有人抄过来的,所以不要相信。

特征抽取与特征工程:将原始数据转化为可以用来建模的特征;
特征抽取:从原始数据集中抽取到新的特征空间,也是降维过程;
特征转换:将特征进行转换,以提高准确率;
特征选择:移除不必要的特征;

下面分别来解释一下:

  1. 我认为特征工程应该是包含包含特征抽取的,他们共同的目的都是从原始数据中,通过背景知识,提取出可以用来建模的特征;但特征工程感觉上做的工作要别特征抽取要多;特征工程是希望得到的特征更有意义。(个人认为这两个可以混为一谈,即使有些书上也都没有非常明确的规定)
  2. 特征转化
    这个词跟归一化相关。
  3. 特征选择
    直观理解,从一组特征中,选择出对模型的更有利的,涉及一些评价的参数,常用的有相关系数这种;这种过程最终生成的特征子集,他的特征意义是不变的。
    还有一个常用是降维过程,比如PCA算法(这个应该算是特征抽取过程),但特征选择也算是一种降维的过程。

p.s. 正如开头所说,关于这方面,网上的内容很多都有些不是很正式,前面只是我的理解。完整的定义,应该看文章[4],只不过他的特征工程部分的内容不够丰富,更像是前期预处理的部分内容。更丰富的,可以看知乎上的答案[5]。特征工程应该涵盖特征选择和特征抽取,毕竟这个名字在这里摆着,我就是要针对特征做事情嘛;然后比较重要的一方面,他在开始的利用与问题相关的背景知识,将数据转化为可以用的特征,比如自然语言处理过程,语音处理过程等。

简单粗暴一点,特征抽取是将原始空间映射到新的空间,创造了新的特征变量,改变了原始的特征;特征选择是从原始子集中筛选与类别相关的变量,只是对变量空间进行了缩小。


文章[6]的话非常有启发性,在高维空间中,人无法去定位各个变量,你希望从低维的空间中找到解释的观点,这就是特征抽取;特征选择就是你还在原始空间中,只不过去除了一些无用的变量;他们统称为特征降维。

4. 常用的方法

文章[4]中,对这部分的内容进行了描述,后面对这部分内容进行记录。文章[10]也对这个部分的内容进行了介绍。

5. 如何与交叉验证结合

关于特征选择和特征抽取的过程数据集是如何选择的。
https://stats.stackexchange.com/questions/64825/should-feature-selection-be-performed-only-on-training-data-or-all-data
其中提到了nested cross validation.

这个主题的内容貌似非常重要,而且我印象中好像的确很多人都犯了这种错误,不管是在kaggle上,还是在论文里。
具体的形式化描述是这样的,假设要做一个预测分类的问题。
1)首先我在整个数据集上进行了特征选择的过程;
2)然后我利用交叉验证来测试这个过程是不是有效提高;
本上这种做法就是错误的[7],这样的做法会使整个性能的估计是有偏的[8](这个说法我还不太明白,还需要进一步来学习)。正确的做法应该是:
在分出来的每一小部分数据中,再做一次交叉验证。
文章[9]特别提出应该将特征选择作为模型选择一样对待。文章[7]同样提到了对于无监督的特征选择过程是不用在CV中执行的。
(这个问题,牵扯到的东西太多了,包括交叉验证到底干了什么,还有最后特征选择的时候选择的哪一部分,所以这个东西还是需要好好系统的学习)但这里也引入了一个问题,这样我最后特征选择出来的特征集应该是哪些。我这个问题就跟我前面好奇的最后选择交叉验证那个模型一样,可能最后就是选择在全部数据集上的内容。


这部分内容看了很久,感觉越看越迷糊,就先不看了,后面还是要看比较权威的书来的快。

引用

[1]gui-fying-the-machine-learning-workflow-towards-rapid-discovery-of-viable-pipelines
[2]Feature selection vs Feature extraction. Which to use when?
[3]pen-machine-learning-course-topic-6-feature-engineering-and-feature-selection
[4]getting-data-ready-for-modelling-feature-engineering-feature-selection-dimension-reduction
[5]特征工程到底是什么
[6]数据降维(特征提取)和特征选择有什么区别?
[7]not-perform-feature-selection
[8]Feature selection and cross-validation
[9]An Introduction to Feature Selection
[10]使用sklearn做单机特征工程
[11]Getting Data ready for modelling: Feature engineering, Feature Selection, Dimension Reduction (Part two)
(https://towardsdatascience.com/getting-data-ready-for-modelling-feature-engineering-feature-selection-dimension-reduction-39dfa267b95a)