小谈特征工程
瑞典暑假有一个很长的假期,根据自己的选择,基本上在三到五个礼拜。我们机器学习团队,平时都是不定期shuffle成两三个team。夏天之后,大家基本忘了之前在干嘛,然后重新洗牌,于是我也莫名其妙开始了新任务,优化几个pipeline,然后慢慢演化成搞特征工程,一做就做到现在。现在把粗浅的感想啰嗦一下,免得以后也忘了。
我没有系统的学过特征过程,也就是看过一些前辈们的文章和自己做过一些尝试。一直想看这本书,也没启动。
随着深度学习的推广,夸大,特征过程也慢慢不再像以前那样吸引眼球了。所以这个话题的文章并不是那么多。突然想起了我本科毕业论文<语音识别的特征参数提取>,一个典型特征工程项目啊。
Cousera上吴恩达的<机器学习>课程中的后半部有专门的课,讲特征工程和黑盒机器学习的各种长短利弊比较。总结起来就是,黑盒通过复杂的算法,能隐藏的自动提取利用有用信息参数来学习,不利之处当然就是计算量大。特征工程呢,就是有domain knowledge为什么不用,大大节省计算啊。当然现实世界,也大部分属于二者共存。
Hmm,那特征工程具体工作是什么内容呢。我自己的理解是有两个部分,一选择特征,二是如何表示特征。
有很多文章把清洗数据也当作特征工程的一部分。比如说,缺失数据怎么处理。顺便唠叨一下这个话题。这里的缺失数据,指的是,有一些样本由于各种原因,没有完整的数据。比如说用于房价预测模型的数据,某些样本缺少房子的建造年份。一个简单粗暴的做法就是抛弃这些数据。数据很宝贵,抛弃了太可惜。那怎么办呢,那就猜测。怎么猜测,方法或算法很多,比如说用中值,均值,类似样本的值等等。推荐一篇文章(虽然有点标题党,但空值数据怎么处理还是总结的相当不错):https://towardsdatascience.com/feature-engineering-for-machine-learning-3a5e293a5114
那特征选择该怎么选呢。
我觉得首先要利用domain knowledge,就是和领域专家多交流。比如叫标注工程师给标注的标准。我之前问我们的律师妹子,你标注这个条款时候是怎么标注的,她说首先嘛,这个条款基本上都是出现在合同的开始或者在某个章节,大致会有这些关键词。既然她提到位置,那无疑,位置是一个非常重要的特征。
其次呢,就是体力活,分析数据,从各个角度做统计分析。比如说房价那个案例,可以plot房价和区域,房价和面积,房价和年份。当然,这几个例子,根据常识都知道是相关的,也就是重要特征参数,但是并不是所有的相关性都是常识。之前在学贝叶斯模型的时候,其中有个例子,幼儿死亡率和国家是不是石油出口国相关。找出相关性也是有很多的算法和理论可以使用。
还有的方法就是尝试法。记得我在AutoML里提到过吗,AutoML也是包含了各种特征值的尝试。
麻烦的是有些特征的选取intuition并不是那么高。比如说两个特征值相乘作为一个新的特征,某个特质值取平方值又是一个新的特征。但是这种基本上只是出现在比较简单的线性算法中。如果是一般的神经网络,就不需要人为的制造特征。神经网络的各种复杂运算已经是在制造这些特征了,只是不这么表示,但本质上是一回事。这就是之前提到的是特征工程,还是黑盒神经网络。个人觉得,如果需要人为构造很多特征出来,不如用简单神经网络。
特征选好了后,该怎么表示。有一些可以直接用数值表示,比如说房子大小。类别的可以用one-hot表示。为了模型表现更好,特征值必须做归一化处理,比如说每个特征的取值范围都处于0到1之间,主要目的是不要让特征取值之间数量级差别太大,导致某些特征被系统误差给踢出去。这些都是机器学习的基本常识。就不多啰嗦。
最近看到过一篇文章,说one-hot其实效率很差,而且也不能真实的反应数据的关系 https://towardsdatascience.com/categorical-embedding-and-transfer-learning-dd3c4af6345d
主要观点就是,one-hot其实是假设了特征的两两取值的差别是一样的。但事实上,大部分的类别category数据并不满足这个假设。有效的做法是根据已知知识进行编码。是的,NLP中的word embedding就是基于这个理论。文本能怎么做,那当然普通的category更可以这么做。
要说的细节其实挺多。实践起来更多。
作者微信公众号: