前言
上个月参加了微信大数据挑战赛,由于是第一次参加类似的比赛,并没有什么经验,最终也没有进复赛。不过在这期间还是学到了很多知识,尤其是特征处理相关的内容。接近2周的时间我几乎都在编写特征处理相关的代码,因为模型大家都用的差不多,无非就是DeepFM、DIN、GBDT等等,但是提取的特征却各不相同。在很多大佬分享出来的baseline代码中学习到了一些特征提取的技巧,但是真正可以上大分的特征,人家肯定也不会放出来。这次比赛经历让我意识到在机器学习或者说深度学习中特征处理的重要性。也许有人会说,深度学习模型本身就有很好的特征提取的能力,不需要自己再手动提取特征。其实我想说,万事万物都不存在绝对,即便是在深度学习横行的时代,比如在图像领域,传统的图像局部特征提取方法比如SIFT依旧发挥着重要的作用,将其与深度学习的方式结合起来往往能发挥出意想不到的的效果。同理,搜索、推荐领域也类似,在很多场景下,原始数据根本无法直接输入模型,必须要对原始数据做相关处理,深挖隐藏在数据背后的信息,这便是特征工程存在的意义。
在知乎上搜索算法工程师职责相关话题,会发现大部分算法工程师的工作日常也并不是所谓的阅读paper,提出创新点,发明新的模型,更多是与实际业务结合,比如熟悉业务逻辑和数据,数据清洗、特征提取等等,即更多是与数据打交道,因此很多人称自己为‘SQLBoy’。但是这也从另外一个方面印证了数据的重要性。毕竟有这么一句话在工业界广泛流传,如下:
数据和特征决定了结果的上限,而模型和算法只是逼近这个上限而已。
综上所述,我决定深入学习一下特征工程相关的内容,并且记录下来,这是这个系列的第一篇。
简介
特征工程本质上可以理解成数据预处理,其目的是最大限度地从原始数据中提取特征以供算法和模型使用,从而提高模型的准确率等指标。你处理的数据中的特征直接影响到你正在使用的模型以及你能达到的最好的结果。这一点相信很多参加过比赛的同学都深有体会,当模型和特征都确定之后,通过调参带来的收益微乎其微,似乎已经到达模型的上限了。但是如果此时发现了更好的特征,只更换特征的情况下,效果会有很大的提升,这不是靠调参能够得到的。
当然也有人会说,你筛选出来的特征越好,模型输出的结果就越好。这确实是事实,但是也有一定的误导性。模型所能取得的结果受到诸多因素影响,包括模型本身的选择,可用的原始数据,以及提取的特征。甚至也包括你是如何分解这个问题的,还有结果的评估标准等。总之,结果的好坏取决于多种因素,不过本文主要要介绍的是特征提取这一要素。
特征工程的重要性
特征工程的目的就是找到更好的特征来表征原始数据中的固有结构,因为更好的特征一般具有以下的属性。
- 良好的特征意味着更好的灵活性
即便我们选择了一个相对较差的模型,但是由于良好的特征加持,我们依旧可以获得较好得到结果。因为大部分模型其实都可以很好地利用数据中良好的结构信息。良好的特征可以使我们使用更加简单的的模型,这样更容易训练,也更容易理解和维护。 - 良好的特征意味着更简单的模型
如果我们提取出了较好的特征,其实它已经具备足够强的表达能力,可以为我们节省大量在模型选择和参数调优上的时间。 - 良好的特征意味着更好的结果
对于Kagglers,或者参加其他比赛的同学来说,大家使用的算法都大同小异,大部分时间都花在了特征工程上面。
特征工程的位置
在近一步讨论特征工程的细节之前,我们需要先明确一下机器学习或者说深度学习模型的工作管道。这会帮助我们了解一项任务,从问题提出到问题解决的全过程。机器学习的一般流程大概如下:
特征类型
我们知道由于特定的机器学习或深度学习的任务不同,对应所需要的数据集也不同。不过数据的类型还是可以总结出来,一般来说无非就以下几种类型:
- 图像
- 文本
- 音频
- 视频
- ...
以文本数据举例,如果我们将其细分一下,其实还可以分为许多类型。比如有:
- 数值数据(整数,浮点数)
- 单词、句子、段落数据(字符串,单词)
- 类别数据(字符串,数字)
要知道我们的模型的输入只能是数值类型,对于不是数值类型的特征,我们需要通过一系列方法来将其转换成模型和算法能接受的数据类型。这里面又包含了很多方法,比如One-hot编码,词袋模型,Word2Vec等等等等。
文章目录
本文是特征工程系列文章的第一篇,所以本文不会介绍特征处理的技术细节,只是从宏观角度给出特征工程的定义及其重要性。接下来的文章会分别详细介绍常见的特种处理方法。这个系列的文章是根据原始数据的类型来编排,即从数值类型的特征处理到类别类型的特征处理,基本上会涵盖常见的特征处理方法。同时也会提供对应的数据和示例代码。文章目录链接如下:
上述文章待更新。。。
参考
- 《Feature Engineering For Machine Learning》
- 《Data Preparation For Machine Learning》
- https://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/
- https://www.cnblogs.com/jasonfreak/p/5448385.html