特征工程
一、特征工程
数据决定了机器学习的上限,而算法只是尽可能逼近这个上限。如果输入的数据本身不反应客观事实,比如数据采集不充分,异常数据、噪声数据、冗余数据太多,再牛逼的算法也无能为力。所以需要对输入数据(特征)有一个充分采集、清理、选择的过程,让算法模型更好的识别到客观事实的规律所在。
特征工程大体上可以分为几个方面,一是特征采集构造,二是数据清洗预处理,三是特征生成,四是特征选择。
二、特征采集构造
特征构造是指人工的从原始数据中找出、构造出具有业务意义的特征。这个部分需要根据业务知识观察原始数据,思考问题的潜在影响形式,构造加入新的特征。属性的分割和组合是常用的方法。有协同作用的特征可以考虑其协同方式,然后组合为新的特征。时间信息的不同粒度的影响不同,可以考虑分割为小时时段、周末平日等。
另外,如滴滴司机与订单的供求间隔预测比赛中,有些参赛队伍以原始订单数据组合构造出每个时段前三个小时的订单量,作为当天所在地图cell的即时订单趋势的参考。
个人理解,这个部分是包含最多个人经验,领域知识的部分。复杂的算法模型可能是极少数的数据科学及在做,而大多数工程师们基本工作是不断分析业务寻找特征,从数据仓库采集数据,清洗数据。例如,广告部门的数据挖掘工程师,2周内完成一次特征迭代,一个月左右可以完成模型的小优化,来提升auc。
三、数据清洗预处理
从业务平台采集到的数据,或从各原始数据源获取的数据,因为各种原因或原有业务平台的bug,或业务异常数据(如刷单行为,或理解偏差的业务逻辑),而导致的数据值显著异常或者缺失,这样的数据会让算法模型学习到不反应业务正常逻辑应该体现的规律,应该清理或适当处理。比如我在做外卖订单派单时间预测的时候,并不知道存在人工塞单的情况(相对于系统派单),而人工塞单是瞬间完成的,并没有派单时间,这样的订单样本混在样本数据集中,对模型的学习就不利,应该直接剔除掉。当然有些业务中,业务的需求本身就是检测到异常值,比如金融领域的欺诈检测,外卖平台的刷单检测。
同时,原始数据形式并不一定合适于算法模型的输入,比如原始数据的字符串分类变量。
1、异常值检测
1.1、基于分布概率
如果数据分布近似符合正态分布,可以直接以各维度均值及标准差作为正态分布的参数,计算样本点的正态分布概率值,概率值过小的为异常值。同时在一元变量中可以简单以偏离均值超过3倍(有时取2倍)标准差的点为异常值,因为在正态分布的假设下,区域包含了99.7% 的数据。
但是,基于概率统计的异常检测算法通常需要假设数据服从特定的概率分布,这个假设往往是不成立的。
1.2、基于距离
1.2.1、马氏距离(Mahalanobis 距离)
马氏距离相对欧式距离,马氏距离考虑数据集的方差分布,以数据集协方差矩阵作为內积度量矩阵。离数据集均值向量点的马氏距离太大的被识别为异常值。
1.2.2、KNN
相对离数据集均值的距离作为度量,KNN以离最近的那些点的距离过大作为识别异常值的标准。
1.3、聚类检测
聚类算法产生的类别簇,样本过小(需要人工设定阈值),即可被识别为异常值。但是,不同的聚类算法识别不同数据集有较大差异,例如很多聚类算法只能识别凸集,对于识别非凸集数据集中的异常值就不太合适。
聚类的方法通常只能给出 0/1 的判断(即:是不是异常点),不能量化每个数据点的异常程度。
DBSCAN,基于密度聚类,该聚类算法会产生一些无法聚类的异常点,即可识别为异常值。
1.4、LOF(Local Outlier Factor局部异常因子)
参考:https://zhuanlan.zhihu.com/p/28178476
1.4、主成分分解
为了发现这些异常点,基于主成分分析(PCA)的算法会把原始数据从原始的空间投影到主成分空间(选取topN主成分),然后再把投影拉回到原始的空间。如果只使用第一主成分来进行投影和重构,对于大多数的数据而言,重构之后的误差是小的;但是对于异常点而言,重构之后的误差依然相对大。这是因为第一主成分反映了正常值的方差,最后一个主成分反映了异常点的方差。
参考:http://mp.weixin.qq.com/s?__biz=MzIzODExMDE5MA==&mid=2694182465&idx=1&sn=c644809b757bb1c3f0439eae4bb2f78c#rd
2、缺失值处理
3、
四、特征生成
相对特征构造,特征生成更侧重于通过算法自动生成特征。例如卷积神经网络的卷积层就是可以理解为一个特征生成的过程。
1、PCA主成分分析
2、SVD奇异值分解
3、LDA
4、ICA
5、GBDT生成特征
五、特征选择
1、皮尔逊相关系数
2、互信息
3、卡方分析
4、决策树