干货 | 万字长文详解到底什么是特征工程?
共 8150字,需浏览 17分钟
·
2021-08-22 14:13
首先,大多数机器学习从业者主要在公司做什么呢?不是做数学推导,也不是发明多高大上的算法,而是做特征工程,如下图所示(图来自集训营的预习课之一:机器学习 第九期)
![48f44eab55f5ceb432a1e3bf77d2e57d.webp](https://filescdn.proginn.com/b6e36d86c882b63f2619f1dd01540659/48f44eab55f5ceb432a1e3bf77d2e57d.webp)
那到底什么是特征工程呢?
下文是july针对七月在线机器学习第九期第五次课 特征工程的课程笔记。
前言
我所在公司七月在线每个月都是各种机器学习、深度学习、人工智能课程,通过三年半的打磨,内容质量已经足够精良,我也在这耳闻目染中不断被各种从传统IT成功转行转型转岗AI,然后拿到年薪30~50万的消息刷屏。
数学推导,也不是发明多高大上的算法,而是做特征工程,如下图所示(图来自集训营的预
被刷的心痒痒不说,加上自己喜欢研究,擅长把艰深晦涩的东西通俗易懂的阐述出来,所以准备未来一个月三十篇ML课程笔记,平均每天一篇,类似之前的KMP SVM CNN 目标检测,发博客、公号、题库、社区。且联合公司的讲师团队确保专业,争取每个专题/模型 都成为每一个ML初学者必看的第一篇 。
另外,每一篇笔记基本都将是带着beats耳机边用七月在线APP听课程边做笔记(恩,APP支持倍速1.5倍或2倍播放),为的是我确保通俗,讲授课程的讲师确保专业。还是那句老话,有何问题,欢迎在评论里留言指正,thanks。
1、什么是特征工程
有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
但特征工程很少在机器学习相关的书中阐述,包括很多网络课程,七月在线还是第一个在机器学习课程里讲特征工程的课。但直到现在,很多机器学习课程还是不讲特征工程,在我眼里,讲机器学习但不讲特征工程是不专业的(相信此文一出,会改进他们)。
那特征工程到底是什么,它真的有那么重要么?
顾名思义,特征工程其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。
而在公司做机器学习,大部分时间不是研究各种算法、设计高大上模型,也不是各种研究深度学习的应用,或设计N层神经网络,实际上,70~80%的时间都是在跟数据、特征打交道。
因为大部分复杂模型的算法精进都是数据科学家在做。而大多数同学在干嘛呢?在跑数据,或各种map-reduce,hive SQL,数据仓库搬砖,然后做数据清洗、分析业务和case,以及找特征。包括很多大公司不会首选用复杂的模型,有时就是一招LR打天下。
在某kaggle数据科学二分类比赛,通过有效特征的抽取,auc能提升2%(auc是评价模型好坏的常见指标之一),而通过看起来高大上的模型调参优化,auc提升只能约5‰。包括在一个电商商品推荐比赛,推荐大赛第一名的组,基于特征工程,比工程师的推荐准确 度提升16%。
通过总结和归纳,一般认为特征工程包括以下方面(下图来源于ml9学员海阔天空对特征工程一课的总结):
今天给大家一个超棒的课程福利——【特征工程于模型优化特训】课程!8月23日开课,限时1分拼团秒杀!
秒杀链接:https://www.julyedu.com/course/getDetail/379
课程通过两大实战项目学习多种优化方法,掌握比赛上分利器,且包含共享社群答疑 ➕ 免费CPU云平台等课程配套服务,理论和实践完美结合;从数据采集到数据处理、到特征选择、再到模型调优,带你掌握一套完整的机器学习流程。
课程配备优秀讲师、专业职业规划老师和助教团队跟踪辅导、答疑,班主任督促学习,群内学员一起学习,对抗惰性。
2 数据与特征处理
2.1 数据采集
2.2 数据格式化
2.3 数据清洗
当然,算法大多数时候就是一个加工机器,至于最后的产品/成品如何,很大程度上取决于原材料的好坏。而选取或改进原材料的过程会花掉一大部分时间,而效率高低取决于你对于业务的理解程度。
2.4 数据采样
那怎么处理正负样本不平衡的问题呢?为了让样本是比较均衡,一般用随机采样,和分层采样的办法。
比如如果正样本多于负样本,且量都挺大,则可以采用下采样。如果正样本大于负样本,但量不大,则可以采集更多的数据,或者oversampling(比如图像识别中的镜像和旋转),以及修改损失函数/loss function的办法来处理正负样本不平衡的问题。
2.5 特征处理
在特征处理的过程中,我们会面对各种类型的数据,比如数值型(比如年龄的大小)、类别型(比如某个品牌的口红可能有十八种色号,比如衣服大小L XL XLL,比如星期几)、时间类、文本型、统计型、组合特征等等。
2.5.1 数值型数据
接下来,重点阐述下其中几种方法。比如,把数据幅度调整到[0,1]范围内,如下代码所示
![f1297d045d1077b59da4ef060ef8b700.webp](https://filescdn.proginn.com/d0967f50afd0172359a02e7df9352ac2/f1297d045d1077b59da4ef060ef8b700.webp)
这个操作有一个专有名词,即叫归一化。
为什么要归一化呢?很多同学并未搞清楚,维基百科给出的解释:1)归一化后加快了梯度下降求最优解的速度;2)归一化有可能提高精度。
下面再简单扩展解释下这两点。
1 归一化为什么能提高梯度下降法求解最优解的速度?
![102b3270aa329ec6b37b14c5ca96929a.webp](https://filescdn.proginn.com/3f2774184c0a61ac7f63ed843530cc6b/102b3270aa329ec6b37b14c5ca96929a.webp)
蓝色的圈圈图代表的是两个特征的等高线。其中左图两个特征X1和X2的区间相差非常大,X1区间是[0,2000],X2区间是[1,5],像这种有的数据那么大,有的数据那么小,两类之间的幅度相差这么大,其所形成的等高线非常尖。
当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;而右图对两个原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。
因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛甚至不能收敛。
2 归一化有可能提高精度
3 归一化的类型
1)线性归一化
这种归一化方法比较适用在数值比较集中的情况。这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量值来替代max和min。
2)标准差标准化
经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:
3)非线性归一化
在实际应用中,通过梯度下降法求解的模型一般都是需要归一化的,比如线性回归、logistic回归、KNN、SVM、神经网络等模型。
但树形模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、随机森林(Random Forest)。
接下来,我们再看下对数据做标准化的操作
![bc3757a36d9a23a13f97dcb0b6d47dce.webp](https://filescdn.proginn.com/9f7b82d808eb2b8abd7005708acfdf6c/bc3757a36d9a23a13f97dcb0b6d47dce.webp)
![ee1f4ec50f7e938d730745fda69d790a.webp](https://filescdn.proginn.com/85c6bf1a43d631a3617e3a46560f0a07/ee1f4ec50f7e938d730745fda69d790a.webp)
再比如,对数据做统计值
![f0021d2ea21637229f76fd67aa37987f.webp](https://filescdn.proginn.com/ee3d952c2d210bac5263cf122ac23f55/f0021d2ea21637229f76fd67aa37987f.webp)
![2f79d1368196dff2e678070ed72068fa.webp](https://filescdn.proginn.com/84aa9472a899a130fd7420c655e8026a/2f79d1368196dff2e678070ed72068fa.webp)
![e1e6c5f4f0d2f1bbd42e73f5c6b07049.webp](https://filescdn.proginn.com/7a81a795f8da68541045c01ce68f962c/e1e6c5f4f0d2f1bbd42e73f5c6b07049.webp)
或者,对数据做离散化。比如说一个人的年龄是一个连续值,但连续值放进一些模型里比如Logistic Regression则不太好使,这个时候便要对数据进行离散化,通俗理解就是把连续的值分成不同的段,每一段列成特征,从而分段处理。
![156263079e0f5c8de6fdcae1bb1b972a.webp](https://filescdn.proginn.com/3e5caea3b90cba17f25ef5773a3c67ac/156263079e0f5c8de6fdcae1bb1b972a.webp)
![06376cd78e3bb4a13f8c34a564ce5b09.webp](https://filescdn.proginn.com/6166801fbc4de17ef96d62c65a038e3c/06376cd78e3bb4a13f8c34a564ce5b09.webp)
![ada69c300eb7991f82fe643d133cc74c.webp](https://filescdn.proginn.com/f78da54c047c0ff8681c8910eba23d28/ada69c300eb7991f82fe643d133cc74c.webp)
以及对数据做柱状分布(比例)
![550f24c2478ad0858e1e33cf17d5d8a3.webp](https://filescdn.proginn.com/8e34fa044e62e4ae85f36da741b02cb3/550f24c2478ad0858e1e33cf17d5d8a3.webp)
2.5.2 类型型数据
针对口红色号这种类别型数据的特征,可以使用One-hot编码/哑变量。
One-hot编码一般使用稀疏向量来节省空间,比如只有某一维取值为1,其他位置取值均为0。且需要配合特征选择来降低维度,毕竟高维度会带来一些问题
比如K近邻算法中,高维空间下两点之间的距离不好测量;
又比如某些分类场景下,只有部分维度有用。
![c81facf543f50998f425a9739990fb33.webp](https://filescdn.proginn.com/5d282b900efbf1aceffbdf07b93c5afe/c81facf543f50998f425a9739990fb33.webp)
![3dca391fccac9dfc1bf89d3cad94c1df.webp](https://filescdn.proginn.com/8a249a970787c9c2896b9cb6b7a249a0/3dca391fccac9dfc1bf89d3cad94c1df.webp)
![b1a54cae6bc638c36255ebc3fd47e7b0.webp](https://filescdn.proginn.com/37716e2f8696d5ba5753c995762ac049/b1a54cae6bc638c36255ebc3fd47e7b0.webp)
而针对一些文本形式的类别型数据时,也可以使用Hash技巧做一些词频统计
![55c237de8913bdd392e5288a3477340b.webp](https://filescdn.proginn.com/c80710f1ffb2fb54611a045c8f89249d/55c237de8913bdd392e5288a3477340b.webp)
最后,还有一种类别型的数据,比如男性女性在很多行为上会有差别,对此,可以使用Histogram映射方法统计男女生的爱好。
![e0976cfeaa01954c53fe6350b01c31fa.webp](https://filescdn.proginn.com/4ec11e3c59ca2e9db0f9c636167944dc/e0976cfeaa01954c53fe6350b01c31fa.webp)
男:[1/3,2/3,0]; 女:[0,1/3,2/3]; 21:[1,0,0];22:[0,0,1]…
2.5.3 时间型数据
这些时间型数据可以看做是连续值:持续时间(用户单页的浏览时长)、间隔时间(用户上次购买/点击离现在的时间)。
这些时间型数据可以看做是离散值:一天中哪个时间段(hour_0-23)、一周中星期几(week_monday...)、一年中哪个星期、一年中哪个季度、工作日/周末等方面的数据。
2.5.4 文本型数据
如果是文本类型的数据,比如词袋,则可以在文本数据预处理后,去掉停用词,剩下的词组成的list, 在词库中的映射稀疏向量。
![62fe4a3389f87768939d31c05a961d01.webp](https://filescdn.proginn.com/5d2a1fa6c11b0d81d67a506a45cd576b/62fe4a3389f87768939d31c05a961d01.webp)
下图所示的操作是词袋的Python处理方法
![b69f3d4c5707c1e405bfb5b44302ed3e.webp](https://filescdn.proginn.com/b9380928496e5eab3624262a7eb7095f/b69f3d4c5707c1e405bfb5b44302ed3e.webp)
这个时候会遇到一个问题,比如李雷喜欢韩梅梅,跟韩梅梅喜欢李雷这两句话的含义是不一样的,但用上面那种词袋模型无法区分男追女还是女追男这种顺序。
为处理这个问题,可以把词袋中的词扩充到n-gram
![60828bfcd2293877a5c901363fd9a910.webp](https://filescdn.proginn.com/d883ae36e32b1a261ac041dd03ef2f4b/60828bfcd2293877a5c901363fd9a910.webp)
2.5.5 文本型数据
为了更准确的评估一字词对于一个文件集或一个语 料库中的其中一份文件的重要程度,我们会用到TF-IDF这种统计方法。字词的重要性随着它在文件中 出现的次数成正比增加,但同时会随着它在语料库中出现的频率成 反比下降。
TF: Term Frequency
TF(t) = (词t在当前文中出现次数) / (t在全部文档中出现次数)
IDF:IDF(t) = ln(总文档数/ 含t的文档数)
实际使用中,我们便经常用TF-IDF来计算权重,即TF-IDF = TF(t) * IDF(t)
对于词袋,Google于2013年提出了Word2Vec这个模型,成为目前最常用的词嵌入模型之一。
![12a54d582a4e03d1fe46a1da28d1ee0e.webp](https://filescdn.proginn.com/04d6920881e769744fb99c9f869c9899/12a54d582a4e03d1fe46a1da28d1ee0e.webp)
对于这个模型,现在有各种开源工具,比如:google word2vec、gensim、facebook fasttext
![f58b5e5da3cd0f9cec82f5aa9fe18075.webp](https://filescdn.proginn.com/bdc9cec812641fc5b46eb1cde5d918ef/f58b5e5da3cd0f9cec82f5aa9fe18075.webp)
2.5.6 统计型数据
对于统计特征而言,历届的Kaggle/天池比赛,天猫/京东排序和推荐业务线里 模型用到的特征,比如
分位线:商品属于售出商品价格的多少分位线处
次序型:排在第几位
比例类:电商中,好/中/差评比例
你已超过全国百分之…的同学
2.5.7 组合特征
之前阿里云天池(目前是七月在线的长期合作方)上有一个移动推荐算法大赛,比赛的目标是为了给移动用户在合适的时间地点下精准推荐合适的商品/内容,以提升移动用户的浏览或购买体验。
竞赛题目
定义如下的符号:
U——用户集合I——商品全集
P——商品子集,P ⊆ I
D——用户对商品全集的行为数据集合
数据说明
第一部分是用户在商品全集上的移动端行为数据(D),表名为tianchi_mobile_recommend_train_user,包含如下字段:
![54ac97a3c7b9d24d09c6ad7a27fb19d6.webp](https://filescdn.proginn.com/7aebf28c726eb88ba023a1c991595dd4/54ac97a3c7b9d24d09c6ad7a27fb19d6.webp)
![fb4474e8fa52fb239d07a4608c92ce45.webp](https://filescdn.proginn.com/b8b798f41ad62db6ef4b9957ba60f496/fb4474e8fa52fb239d07a4608c92ce45.webp)
对于这个问题,我们要做大量的数据处理,比如:
2、剔除掉在30天里从来不买东西的人 => 数据清洗
3、加车N件,只买了一件的,剩余的不会买=> 规则
4、购物车购买转化率 =>用户维度统计特征
5、商品热度 =>商品维度统计特征
6、对不同item点击/收藏/购物车/购买的总计 =>商品维度统计特征
7、变热门的品牌/商品 =>商品维度统计特征(差值型)
8、对不同item点击/收藏/购物车/购买平均每个user的计数=>用户维 度统计特征
9、最近第1/2/3/7天的行为数与平均行为数的比值 =>用户维度统计 特征(比例型)
10、商品在类别中的排序 =>商品维度统计特征(次序型)
11、商品交互的总人数 =>商品维度统计特征(求和型)
12、商品的购买转化率及转化率与类别平均转化率的比值=>商品维度统 计特征(比例型)
13、商品行为/同类同行为均值=>商品维度统计特征(比例型)
14、最近1/2/3天的行为(按4类统计)=>时间型+用户维度统计特征
15、最近的交互离现在的时间=>时间型
16、总交互的天数=>时间型
17、用户A对品牌B的总购买数/收藏数/购物车数=>用户维度统计特征
18、用户A对品牌B的点击数的平方 =>用户维度统计特征
19、用户A对品牌B的购买数的平方=>用户维度统计特征
20、用户A对品牌B的点击购买比=>用户维度统计特征(比例型)
21、用户交互本商品前/后,交互的商品数=>时间型+用户维度统计特征
22、用户前一天最晚的交互行为时间=>时间型
23、用户购买商品的时间(平均,最早,最晚)=>时间型
而有些特征也可以做一下组合,比如以下一些拼接型的简单组合特征
简单组合特征:拼接型
user_id&&style: 10001&&蕾丝 10002&&全棉
包括实际电商点击率预估中:正负权重,喜欢&&不喜欢某种类型
以及一些模型特征组合
用GBDT产出特征组合路径
组合特征和原始特征一起放进LR训练
最早Facebook使用的方式,多家互联网公司在用
包括另一种基于树模型的组合特征:GBDT+LR,每一条分支都可以是一个特征,从而学习出来一系列组合特征。
![fadf0314674c49708c84ad1c6b7e39dd.webp](https://filescdn.proginn.com/5536e5638457e90fc7bdc42ee2ada8f9/fadf0314674c49708c84ad1c6b7e39dd.webp)
3 特征选择
冗余:部分特征的相关度太高了,消耗计算性能
噪声:部分特征是对预测结果有负影响
针对这两个问题,咱们便得做下特征选择,包括降维
特征选择是指踢掉原本特征里和结果预测关系不大的
SVD或者PCA确实也能解决一定的高维度问题
接下来,咱们了解下各种特征选择的方式。
3.1 过滤型
这种方法的缺点是:没有考虑到特征之间的关联作用,可能把有用的关联特征误踢掉。
![15872951606a3e63b0166096a4d0200b.webp](https://filescdn.proginn.com/64f68f9ee96393ecc3bddf9e15cc5b2e/15872951606a3e63b0166096a4d0200b.webp)
过滤型特征选择Python包
![8c81b33a67ed4cb5e6156c83e1c4aea6.webp](https://filescdn.proginn.com/396731d1abe86ef97d68391591e1732b/8c81b33a67ed4cb5e6156c83e1c4aea6.webp)
3.2 包裹型
比如用逻辑回归,怎么做这个事情呢?
用全量特征跑一个模型
根据线性模型的系数(体现相关性),删掉5-10%的弱特征,观察准确率/auc的变化
逐步进行,直至准确率/auc出现大的下滑停止
包裹型特征选择Python包
![3a913e740c546323f2d744cfbae1509a.webp](https://filescdn.proginn.com/cfbbbf1dc2d785c518b3669dc738ddee/3a913e740c546323f2d744cfbae1509a.webp)
![9fda4c3f74cf3d72e80cc156c78cc899.webp](https://filescdn.proginn.com/ccc42945930825f50402e0289a3993fd/9fda4c3f74cf3d72e80cc156c78cc899.webp)
![61eca7aee261d7a73152c03227b5fa94.webp](https://filescdn.proginn.com/e3a19cfdcd529924a8599900cf6a12cf/61eca7aee261d7a73152c03227b5fa94.webp)
3.3 嵌入型
且慢,什么是正则化?正则化一般分为两种:L1正则化和L2正则化。
L1正则化是指权值向量w中各个元素的绝对值之和,通常表示为||w||1
L2正则化是指权值向量w中各个元素的平方和然后再求平方根(可以看到Ridge回归的L2正则化项有平方符号),通常表示为||w||2
一般都会在正则化项之前添加一个系数,Python中用α表示,一些文章也用λ表示。这个系数需要用户指定。
那添加L1和L2正则化有什么用?
L2正则化可以防止模型过拟合(overfitting)。当然,一定程度上,L1也可以防止过拟合
稀疏模型与特征选择
稀疏矩阵指的是很多元素为0,只有少数元素是非零值的矩阵,即得到的线性回归模型的大部分系数都是0. 通常机器学习中特征数量很多,例如文本处理时,如果将一个词组(term)作为一个特征,那么特征数量会达到上万个(bigram)。
在预测或分类时,那么多特征显然难以选择,但是如果代入这些特征得到的模型是一个稀疏模型,表示只有少数特征对这个模型有贡献,绝大部分特征是没有贡献的,或者贡献微小(因为它们前面的系数是0或者是很小的值,即使去掉对模型也没有什么影响),此时我们就可以只关注系数是非零值的特征。这就是稀疏模型与特征选择的关系。
举个例子,最早在电商用LR做CTR预估,在3-5亿维的系数 特征上用L1正则化的LR模型。剩余2-3千万的feature,意 味着其他的feature重要度不够。
嵌入型特征选择Python包
![c59b1ebff5bc14906462614325ddc3d2.webp](https://filescdn.proginn.com/c2d9e5b875624e21fbde57e3ccb71c78/c59b1ebff5bc14906462614325ddc3d2.webp)
至于课程上的两个实践案例,比如kaggle自行车租赁预测比赛暂不更。有兴趣的可以先自行查看「特征工程与模型优化特训」课程的视频内容,本文基本就是这次课的课程笔记。
今日学习推荐
想要逃避总有借口,想要成功总有办法!今天给大家一个超棒的课程福利——【特征工程于模型优化特训】课程!8月23日开课,限时1分拼团秒杀!
课程通过两大实战项目学习多种优化方法,掌握比赛上分利器,且包含共享社群答疑 ➕ 免费CPU云平台等课程配套服务,理论和实践完美结合;从数据采集到数据处理、到特征选择、再到模型调优,带你掌握一套完整的机器学习流程。
课程配备优秀讲师、专业职业规划老师和助教团队跟踪辅导、答疑,班主任督促学习,群内学员一起学习,对抗惰性。
戳↓↓“阅读原文”立即1分秒杀【特征工程与模型优化特训】课程!