关闭

转自美团技术:机器学习中的数据清洗与特征处理综述&实例详解机器学习如何解决问题

标签: 数据清洗特征选择机器学习
507人阅读 评论(0) 收藏 举报
分类:

机器学习中的数据清洗与特征处理综述

背景

随着美团交易规模的逐步增大,积累下来的业务数据和交易数据越来越多,这些数据是美团做为一个团购平台最宝贵的财富。通过对这些数据的分析和挖掘,不仅能给美团业务发展方向提供决策支持,也为业务的迭代指明了方向。目前在美团的团购系统中大量地应用到了机器学习和数据挖掘技术,例如个性化推荐、筛选排序、搜索排序、用户建模等等,为公司创造了巨大的价值。
本文主要介绍在美团的推荐与个性化团队实践中的数据清洗与特征挖掘方法。主要内容已经在内部公开课"机器学习InAction系列"讲过,本博客的内容主要是讲座内容的提炼和总结。

综述

机器学习框架
如上图所示是一个经典的机器学习问题框架图。数据清洗和特征挖掘的工作是在灰色框中框出的部分,即“数据清洗=>特征,标注数据生成=>模型学习=>模型应用”中的前两个步骤。
灰色框中蓝色箭头对应的是离线处理部分。主要工作是

  • 从原始数据,如文本、图像或者应用数据中清洗出特征数据和标注数据。
  • 对清洗出的特征和标注数据进行处理,例如样本采样,样本调权,异常点去除,特征归一化处理,特征变化,特征组合等过程。最终生成的数据主要是供模型训练使用。

灰色框中绿色箭头对应的是在线处理的部分。所做的主要工作和离线处理的类似,主要的区别在于1.不需要清洗标注数据,只需要处理得到特征数据,在线模型使用特征数据预测出样本可能的标签。2.最终生成数据的用处,最终生成的数据主要用于模型的预测,而不是训练。
在离线的处理部分,可以进行较多的实验和迭代,尝试不同的样本采样、样本权重、特征处理方法、特征组合方法等,最终得到一个最优的方法,在离线评估得到好的结果后,最终将确定的方案在线上使用。
另外,由于在线和离线环境不同,存储数据、获取数据的方法存在较大的差异。例如离线数据获取可以将数据存储在Hadoop,批量地进行分析处理等操作,并且容忍一定的失败。而在线服务获取数据需要稳定、延时小等,可以将数据建入索引、存入KV存储系统等。后面在相应的部分会详细地介绍。

本文以点击下单率预测为例,结合实例来介绍如何进行数据清洗和特征处理。首先介绍下点击下单率预测任务,其业务目标是提高团购用户的用户体验,帮助用户更快更好地找到自己想买的单子。这个概念或者说目标看起来比较虚,我们需要将其转换成一个技术目标,便于度量和实现。最终确定的技术目标是点击下单率预估,去预测用户点击或者购买团购单的概率。我们将预测出来点击或者下单率高的单子排在前面,预测的越准确,用户在排序靠前的单子点击、下单的就越多,省去了用户反复翻页的开销,很快就能找到自己想要的单子。离线我们用常用的衡量排序结果的AUC指标,在线的我们通过ABTest来测试算法对下单率、用户转化率等指标的影响。

特征使用方案

在确定了目标之后,下一步,我们需要确定使用哪些数据来达到目标。需要事先梳理哪些特征数据可能与用户是否点击下单相关。我们可以借鉴一些业务经验,另外可以采用一些特征选择、特征分析等方法来辅助我们选择。具体的特征选择,特征分析等方法我们后面会详细介绍。从业务经验来判断,可能影响用户是否点击下单的因素有:

  • 距离,很显然这是一个很重要的特征。如果购买一个离用户距离较远的单子,用户去消费这个单子需要付出很多的代价。 当然,也并不是没有买很远单子的用户,但是这个比例会比较小。
  • 用户历史行为,对于老用户,之前可能在美团有过购买、点击等行为。
  • 用户实时兴趣。
  • 单子质量,上面的特征都是比较好衡量的,单子质量可能是更复杂的一个特征。
  • 是否热门,用户评价人数,购买数等等。

在确定好要使用哪些数据之后,我们需要对使用数据的可用性进行评估,包括数据的获取难度,数据的规模,数据的准确率,数据的覆盖率等,

  • 数据获取难度
    例如获取用户id不难,但是获取用户年龄和性别较困难,因为用户注册或者购买时,这些并不是必填项。即使填了也不完全准确。这些特征可能是通过额外的预测模型预测的,那就存在着模型精度的问题。
  • 数据覆盖率
    数据覆盖率也是一个重要的考量因素,例如距离特征,并不是所有用户的距离我们都能获取到。PC端的就没有距离,还有很多用户禁止使用它们的地理位置信息等。
    用户历史行为,只有老用户才会有行为。
    用户实时行为,如果用户刚打开app,还没有任何行为,同样面临着一个冷启动的问题。
  • 数据的准确率
    单子质量,用户性别等,都会有准确率的问题。

特征获取方案

Ok,在选定好要用的特征之后,我们需要考虑一个问题。就是这些数据从哪可以获取?只有获取了这些数据我们才能用上。否则,提一个不可能获取到的特征,获取不到,提了也是白提。下面就介绍下特征获取方案。

  • 离线特征获取方案
    离线可以使用海量的数据,借助于分布式文件存储平台,例如HDFS等,使用例如MapReduce,Spark等处理工具来处理海量的数据等。

  • 在线特征获取方案
    在线特征比较注重获取数据的延时,由于是在线服务,需要在非常短的时间内获取到相应的数据,对查找性能要求非常高,可以将数据存储在索引、kv存储等。而查找性能与数据的数据量会有矛盾,需要折衷处理,我们使用了特征分层获取方案,如下图所示。
    服务架构
    出于性能考虑。在粗排阶段,使用更基础的特征,数据直接建入索引。精排阶段,再使用一些个性化特征等。

特征与标注数据清洗

在了解特征数据放在哪儿、怎样获取之后。下一步就是考虑如何处理特征和标注数据了。下面3节都是主要讲的特征和标注处理方法

##标注数据清洗
首先介绍下如何清洗特征数据,清洗特征数据方法可以分为离线清洗和在线清洗两种方法。

  • 离线清洗数据
    离线清洗优点是方便评估新特征效果,缺点是实时性差,与线上实时环境有一定误差。对于实时特征难以训练得到恰当的权重。
  • 在线清洗数据
    在线清洗优点是实时性强,完全记录的线上实际数据,缺点是新特征加入需要一段时间做数据积累。

样本采样与样本过滤

特征数据只有在和标注数据合并之后,才能用来做为模型的训练。下面介绍下如何清洗标注数据。主要是数据采样和样本过滤。

数据采样,例如对于分类问题:选取正例,负例。对于回归问题,需要采集数据。对于采样得到的样本,根据需要,需要设定样本权重。当模型不能使用全部的数据来训练时,需要对数据进行采样,设定一定的采样率。采样的方法包括随机采样,固定比例采样等方法。

除了采样外,经常对样本还需要进行过滤,包括

  • 1.结合业务情况进行数据的过滤,例如去除crawler抓取,spam,作弊等数据。
  • 2.异常点检测,采用异常点检测算法对样本进行分析,常用的异常点检测算法包括
    • 偏差检测,例如聚类,最近邻等。
    • 基于统计的异常点检测算法
      例如极差,四分位数间距,均差,标准差等,这种方法适合于挖掘单变量的数值型数据。全距(Range),又称极差,是用来表示统计资料中的变异量数(measures of variation) ,其最大值与最小值之间的差距;四分位距通常是用来构建箱形图,以及对概率分布的简要图表概述。
    • 基于距离的异常点检测算法,主要通过距离方法来检测异常点,将数据集中与大多数点之间距离大于某个阈值的点视为异常点,主要使用的距离度量方法有绝对距离 ( 曼哈顿距离 ) 、欧氏距离和马氏距离等方法。
    • 基于密度的异常点检测算法,考察当前点周围密度,可以发现局部异常点,例如LOF算法

特征分类

在分析完特征和标注的清洗方法之后,下面来具体介绍下特征的处理方法,先对特征进行分类,对于不同的特征应该有不同的处理方法。

根据不同的分类方法,可以将特征分为(1)Low level特征和High level特征。(2)稳定特征与动态特征。(3)二值特征、连续特征、枚举特征。

Low level特征是较低级别的特征,主要是原始特征,不需要或者需要非常少的人工处理和干预,例如文本特征中的词向量特征,图像特征中的像素点,用户id,商品id等。Low level特征一般维度比较高,不能用过于复杂的模型。High level特征是经过较复杂的处理,结合部分业务逻辑或者规则、模型得到的特征,例如人工打分,模型打分等特征,可以用于较复杂的非线性模型。Low level 比较针对性,覆盖面小。长尾样本的预测值主要受high level特征影响。 高频样本的预测值主要受low level特征影响。

稳定特征是变化频率(更新频率)较少的特征,例如评价平均分,团购单价格等,在较长的时间段内都不会发生变化。动态特征是更新变化比较频繁的特征,有些甚至是实时计算得到的特征,例如距离特征,2小时销量等特征。或者叫做实时特征和非实时特征。针对两类特征的不同可以针对性地设计特征存储和更新方式,例如对于稳定特征,可以建入索引,较长时间更新一次,如果做缓存的话,缓存的时间可以较长。对于动态特征,需要实时计算或者准实时地更新数据,如果做缓存的话,缓存过期时间需要设置的较短。

二值特征主要是0/1特征,即特征只取两种值:0或者1,例如用户id特征:目前的id是否是某个特定的id,词向量特征:某个特定的词是否在文章中出现等等。连续值特征是取值为有理数的特征,特征取值个数不定,例如距离特征,特征取值为是0~正无穷。枚举值特征主要是特征有固定个数个可能值,例如今天周几,只有7个可能值:周1,周2,...,周日。在实际的使用中,我们可能对不同类型的特征进行转换,例如将枚举特征或者连续特征处理为二值特征。枚举特征处理为二值特征技巧:将枚举特征映射为多个特征,每个特征对应一个特定枚举值,例如今天周几,可以把它转换成7个二元特征:今天是否是周一,今天是否是周二,...,今天是否是周日。连续值处理为二值特征方法:先将连续值离散化(后面会介绍如何离散化),再将离散化后的特征切分为N个二元特征,每个特征代表是否在这个区间内。

特征处理与分析

在对特征进行分类后,下面介绍下对特征常用的处理方法。包括1.特征归一化,离散化,缺省值处理。2.特征降维方法。3.特征选择方法等。

特征归一化,离散化,缺省值处理

主要用于单个特征的处理。

  • 归一化
    不同的特征有不同的取值范围,在有些算法中,例如线性模型或者距离相关的模型像聚类模型、knn模型等,特征的取值范围会对最终的结果产生较大影响,例如二元特征的取值范围为[0,1],而距离特征取值可能是[0,正无穷),在实际使用中会对距离进行截断,例如[0,3000000],但是这两个特征由于取值范围不一致导致了模型可能会更偏向于取值范围较大的特征,为了平衡取值范围不一致的特征,需要对特征进行归一化处理,将特征取值归一化到[0,1]区间。常用的归一化方法包括1.函数归一化,通过映射函数将特征取值映射到[0,1]区间,例如最大最小值归一化方法,是一种线性的映射。还有通过非线性函数的映射,例如log函数等。2.分维度归一化,可以使用最大最小归一化方法,但是最大最小值选取的是所属类别的最大最小值,即使用的是局部最大最小值,不是全局的最大最小值。3.排序归一化,不管原来的特征取值是什么样的,将特征按大小排序,根据特征所对应的序给予一个新的值。

  • 离散化
    在上面介绍过连续值的取值空间可能是无穷的,为了便于表示和在模型中处理,需要对连续值特征进行离散化处理。常用的离散化方法包括等值划分和等量划分。等值划分是将特征按照值域进行均分,每一段内的取值等同处理。例如某个特征的取值范围为[0,10],我们可以将其划分为10段,[0,1),[1,2),...,[9,10)。等量划分是根据样本总数进行均分,每段等量个样本划分为1段。例如距离特征,取值范围[0,3000000],现在需要切分成10段,如果按照等比例划分的话,会发现绝大部分样本都在第1段中。使用等量划分就会避免这种问题,最终可能的切分是[0,100),[100,300),[300,500),..,[10000,3000000],前面的区间划分比较密,后面的比较稀疏。

  • 缺省值处理
    有些特征可能因为无法采样或者没有观测值而缺失,例如距离特征,用户可能禁止获取地理位置或者获取地理位置失败,此时需要对这些特征做特殊的处理,赋予一个缺省值。缺省值如何赋予,也有很多种方法。例如单独表示,众数,平均值等。

特征降维

在介绍特征降维之前,先介绍下特征升维。在机器学习中,有一个VC维理论。根据VC维理论,VC维越高,打散能力越强,可容许的模型复杂度越高。在低维不可分的数据,映射到高维是可分。可以想想,给你一堆物品,人脑是如何对这些物品进行分类,依然是找出这些物品的一些特征,例如:颜色,形状,大小,触感等等,然后根据这些特征对物品做以归类,这其实就是一个先升维,后划分的过程。比如我们人脑识别香蕉。可能首先我们发现香蕉是黄色的。这是在颜色这个维度的一个切分。但是很多东西都是黄色的啊,例如哈密瓜。那么怎么区分香蕉和哈密瓜呢?我们发现香蕉形状是弯曲的。而哈密瓜是圆形的,那么我们就可以用形状来把香蕉和哈密瓜划分开了,即引入一个新维度:形状,来区分。这就是一个从“颜色”一维特征升维到二维特征的例子。

那问题来了,既然升维后模型能力能变强,那么是不是特征维度越高越好呢?为什么要进行特征降维&特征选择?主要是出于如下考虑:1. 特征维数越高,模型越容易过拟合,此时更复杂的模型就不好用。2. 相互独立的特征维数越高,在模型不变的情况下,在测试集上达到相同的效果表现所需要的训练样本的数目就越大。 3. 特征数量增加带来的训练、测试以及存储的开销都会增大。4.在某些模型中,例如基于距离计算的模型KMeans,KNN等模型,在进行距离计算时,维度过高会影响精度和性能。5.可视化分析的需要。在低维的情况下,例如二维,三维,我们可以把数据绘制出来,可视化地看到数据。当维度增高时,就难以绘制出来了。在机器学习中,有一个非常经典的维度灾难的概念。用来描述当空间维度增加时,分析和组织高维空间,因体积指数增加而遇到各种问题场景。例如,100个平均分布的点能把一个单位区间以每个点距离不超过0.01采样;而当维度增加到10后,如果以相邻点距离不超过0.01小方格采样单位超一单位超正方体,则需要10^20 个采样点。

正是由于高维特征有如上描述的各种各样的问题,所以我们需要进行特征降维和特征选择等工作。特征降维常用的算法有PCA,LDA等。特征降维的目标是将高维空间中的数据集映射到低维空间数据,同时尽可能少地丢失信息,或者降维后的数据点尽可能地容易被区分

  • PCA算法
    通过协方差矩阵的特征值分解能够得到数据的主成分,以二维特征为例,两个特征之间可能存在线性关系(例如运动的时速和秒速度),这样就造成了第二维信息是冗余的。PCA的目标是发现这种特征之间的线性关系,并去除。

  • LDA算法
    考虑label,降维后的数据点尽可能地容易被区分

特征选择

特征选择的目标是寻找最优特征子集。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的。另一方面,选取出真正相关的特征简化模型,协助理解数据产生的过程。
特征选择的一般过程如下图所示:
特征选择的过程 ( M. Dash and H. Liu 1997 )
主要分为产生过程,评估过程,停止条件和验证过程。

特征选择-产生过程和生成特征子集方法

  • 完全搜索(Complete)
    • 广度优先搜索( Breadth First Search )
      广度优先遍历特征子空间。枚举所有组合,穷举搜索,实用性不高。
    • 分支限界搜索( Branch and Bound )
      穷举基础上加入分支限界。例如:剪掉某些不可能搜索出比当前最优解更优的分支。
      其他,如定向搜索 (Beam Search ),最优优先搜索 ( Best First Search )等
  • 启发式搜索(Heuristic)
    • 序列前向选择( SFS , Sequential Forward Selection )
      从空集开始,每次加入一个选最优。
    • 序列后向选择( SBS , Sequential Backward Selection )
      从全集开始,每次减少一个选最优。
    • 增L去R选择算法 ( LRS , Plus-L Minus-R Selection )
      从空集开始,每次加入L个,减去R个,选最优(L>R)或者从全集开始,每次减去R个,增加L个,选最优(L<R)。

其他如双向搜索( BDS , Bidirectional Search ),序列浮动选择( Sequential Floating Selection )等

  • 随机搜索(Random)
    • 随机产生序列选择算法(RGSS, Random Generation plus Sequential Selection)
      随机产生一个特征子集,然后在该子集上执行SFS与SBS算法。
    • 模拟退火算法( SA, Simulated Annealing )
      以一定的概率来接受一个比当前解要差的解,而且这个概率随着时间推移逐渐降低
    • 遗传算法( GA, Genetic Algorithms )
      通过交叉、突变等操作繁殖出下一代特征子集,并且评分越高的特征子集被选中参加繁殖的概率越高。

随机算法共同缺点:依赖随机因素,有实验结果难重现。

特征选择-有效性分析

对特征的有效性进行分析,得到各个特征的特征权重,根据是否与模型有关可以分为1.与模型相关特征权重,使用所有的特征数据训练出来模型,看在模型中各个特征的权重,由于需要训练出模型,模型相关的权重与此次学习所用的模型比较相关。不同的模型有不同的模型权重衡量方法。例如线性模型中,特征的权重系数等。2.与模型无关特征权重。主要分析特征与label的相关性,这样的分析是与这次学习所使用的模型无关的。与模型无关特征权重分析方法包括(1)交叉熵,(2)Information Gain,(3)Odds ratio,(4)互信息,(5)KL散度等

特征监控

在机器学习任务中,特征非常重要。

  • 个人经验,80%的效果由特征带来。下图是随着特征数的增加,最终模型预测值与实际值的相关系数变化。
    特征重要性
  • 对于重要的特征进行监控与有效性分析,了解模型所用的特征是否存在问题,当某个特别重要的特征出问题时,需要做好备案,防止灾难性结果。需要建立特征有效性的长效监控机制
    我们对关键特征进行了监控,下面特征监控界面的一个截图。通过监控我们发现有一个特征的覆盖率每天都在下降,与特征数据提供方联系之后,发现特征数据提供方的数据源存在着问题,在修复问题之后,该特征恢复正常并且覆盖率有了较大提升。
    特征监控
    在发现特征出现异常时,我们会及时采取措施,对服务进行降级处理,并联系特征数据的提供方尽快修复。对于特征数据生成过程中缺乏监控的情况也会督促做好监控,在源头解决问题。

参考

《elements of statistical learning》
http://en.wikipedia.org/wiki/Supervised_learning
http://www.cnblogs.com/heaad/archive/2011/01/02/1924088.html
http://zh.wikipedia.org/zh-cn/维数灾难
http://www.cs.waikato.ac.nz/ml/weka/
http://blog.csdn.net/lihaifeng555/article/details/4543752
http://blog.csdn.net/abcjennifer/article/details/8002329
http://www.cnblogs.com/leftnoteasy/archive/2011/01/08/lda-and-pca-machine-learning.html



实例详解机器学习如何解决问题

前言

随着大数据时代的到来,机器学习成为解决问题的一种重要且关键的工具。不管是工业界还是学术界,机器学习都是一个炙手可热的方向,但是学术界和工业界对机器学习的研究各有侧重,学术界侧重于对机器学习理论的研究,工业界侧重于如何用机器学习来解决实际问题。我们结合美团在机器学习上的实践,进行一个实战(InAction)系列的介绍(带“机器学习InAction系列”标签的文章),介绍机器学习在解决工业界问题的实战中所需的基本技术、经验和技巧。本文主要结合实际问题,概要地介绍机器学习解决实际问题的整个流程,包括对问题建模、准备训练数据、抽取特征、训练模型和优化模型等关键环节;另外几篇则会对这些关键环节进行更深入地介绍。

下文分为1)机器学习的概述,2)对问题建模,3)准备训练数据,4)抽取特征,5)训练模型,6)优化模型,7)总结 共7个章节进行介绍。


机器学习的概述:

###什么是机器学习?
随着机器学习在实际工业领域中不断获得应用,这个词已经被赋予了各种不同含义。在本文中的“机器学习”含义与wikipedia上的解释比较契合,如下:
Machine learning is a scientific discipline that deals with the construction and study of algorithms that can learn from data.

机器学习可以分为无监督学习(unsupervised learning)和有监督学习(supervised learning),在工业界中,有监督学习是更常见和更有价值的方式,下文中主要以这种方式展开介绍。如下图中所示,有监督的机器学习在解决实际问题时,有两个流程,一个是离线训练流程(蓝色箭头),包含数据筛选和清洗、特征抽取、模型训练和优化模型等环节;另一个流程则是应用流程(绿色箭头),对需要预估的数据,抽取特征,应用离线训练得到的模型进行预估,获得预估值作用在实际产品中。在这两个流程中,离线训练是最有技术挑战的工作(在线预估流程很多工作可以复用离线训练流程的工作),所以下文主要介绍离线训练流程。

model

###什么是模型(model)?
模型,是机器学习中的一个重要概念,简单的讲,指特征空间到输出空间的映射;一般由模型的假设函数和参数w组成(下面公式就是Logistic Regression模型的一种表达,在训练模型的章节做稍详细的解释);一个模型的假设空间(hypothesis space),指给定模型所有可能w对应的输出空间组成的集合。工业界常用的模型有Logistic Regression(简称LR)、Gradient Boosting Decision Tree(简称GBDT)、Support Vector Machine(简称SVM)、Deep Neural Network(简称DNN)等。

模型训练就是基于训练数据,获得一组参数w,使得特定目标最优,即获得了特征空间到输出空间的最优映射,具体怎么实现,见训练模型章节。

###为什么要用机器学习解决问题?

  • 目前处于大数据时代,到处都有成T成P的数据,简单规则处理难以发挥这些数据的价值;
  • 廉价的高性能计算,使得基于大规模数据的学习时间和代价降低;
  • 廉价的大规模存储,使得能够更快地和代价更小地处理大规模数据;
  • 存在大量高价值的问题,使得花大量精力用机器学习解决问题后,能获得丰厚收益。

###机器学习应该用于解决什么问题?

  • 目标问题需要价值巨大,因为机器学习解决问题有一定的代价;
  • 目标问题有大量数据可用,有大量数据才能使机器学习比较好地解决问题(相对于简单规则或人工);
  • 目标问题由多种因素(特征)决定,机器学习解决问题的优势才能体现(相对于简单规则或人工);
  • 目标问题需要持续优化,因为机器学习可以基于数据自我学习和迭代,持续地发挥价值。

对问题建模

本文以DEAL(团购单)交易额预估问题为例(就是预估一个给定DEAL一段时间内卖了多少钱),介绍使用机器学习如何解决问题。首先需要:

  • 收集问题的资料,理解问题,成为这个问题的专家;
  • 拆解问题,简化问题,将问题转化机器可预估的问题。

深入理解和分析DEAL交易额后,可以将它分解为如下图的几个问题:

deal_problem

###单个模型?多个模型?如何来选择?
按照上图进行拆解后,预估DEAL交易额就有2种可能模式,一种是直接预估交易额;另一种是预估各子问题,如建立一个用户数模型和建立一个访购率模型(访问这个DEAL的用户会购买的单子数),再基于这些子问题的预估值计算交易额。

  • 不同方式有不同优缺点,具体如下:
模式 缺点 优点
单模型 1. 预估难度大
2. 风险比较高
1. 理论上可以获得最优预估(实际上很难)
2. 一次解决问题
多模型 1. 可能产生积累误差
2. 训练和应用成本高
1. 单个子模型更容易实现比较准地预估
2. 可以调整子模型的融合方式,以达到最佳效果
  • 选择哪种模式?
    1)问题可预估的难度,难度大,则考虑用多模型;
    2)问题本身的重要性,问题很重要,则考虑用多模型;
    3)多个模型的关系是否明确,关系明确,则可以用多模型。

  • 如果采用多模型,如何融合?
    可以根据问题的特点和要求进行线性融合,或进行复杂的融合。以本文问题为例,至少可以有如下两种:

model_merg

###模型选择
对于DEAL交易额这个问题,我们认为直接预估难度很大,希望拆成子问题进行预估,即多模型模式。那样就需要建立用户数模型和访购率模型,因为机器学习解决问题的方式类似,下文只以访购率模型为例。要解决访购率问题,首先要选择模型,我们有如下的一些考虑:

  • 主要考虑
    1)选择与业务目标一致的模型;
    2)选择与训练数据和特征相符的模型。

    训练数据少,High Level特征多,则使用“复杂”的非线性模型(流行的GBDT、Random Forest等);
    训练数据很大量,Low Level特征多,则使用“简单”的线性模型(流行的LR、Linear-SVM等)。
    
  • 补充考虑
    1)当前模型是否被工业界广泛使用;
    2)当前模型是否有比较成熟的开源工具包(公司内或公司外);
    3)当前工具包能够的处理数据量能否满足要求;
    4)自己对当前模型理论是否了解,是否之前用过该模型解决问题。

为实际问题选择模型,需要转化问题的业务目标为模型评价目标,转化模型评价目标为模型优化目标;根据业务的不同目标,选择合适的模型,具体关系如下:

select_model

通常来讲,预估真实数值(回归)、大小顺序(排序)、目标所在的正确区间(分类)的难度从大到小,根据应用所需,尽可能选择难度小的目标进行。对于访购率预估的应用目标来说,我们至少需要知道大小顺序或真实数值,所以我们可以选择Area Under Curve(AUC)或Mean Absolute Error(MAE)作为评估目标,以Maximum likelihood为模型损失函数(即优化目标)。综上所述,我们选择spark版本 GBDT或LR,主要基于如下考虑:
1)可以解决排序或回归问题;
2)我们自己实现了算法,经常使用,效果很好;
3)支持海量数据;
4)工业界广泛使用。


准备训练数据

深入理解问题,针对问题选择了相应的模型后,接下来则需要准备数据;数据是机器学习解决问题的根本,数据选择不对,则问题不可能被解决,所以准备训练数据需要格外的小心和注意:

###注意点:

  • 待解决问题的数据本身的分布尽量一致;
  • 训练集/测试集分布与线上预测环境的数据分布尽可能一致,这里的分布是指(x,y)的分布,不仅仅是y的分布;
  • y数据噪音尽可能小,尽量剔除y有噪音的数据;
  • 非必要不做采样,采样常常可能使实际数据分布发生变化,但是如果数据太大无法训练或者正负比例严重失调(如超过100:1),则需要采样解决。

###常见问题及解决办法

  • 待解决问题的数据分布不一致:
    1)访购率问题中DEAL数据可能差异很大,如美食DEAL和酒店DEAL的影响因素或表现很不一致,需要做特别处理;要么对数据提前归一化,要么将分布不一致因素作为特征,要么对各类别DEAL单独训练模型。
  • 数据分布变化了:
    1)用半年前的数据训练模型,用来预测当前数据,因为数据分布随着时间可能变化了,效果可能很差。尽量用近期的数据训练,来预测当前数据,历史的数据可以做降权用到模型,或做transfer learning。
  • y数据有噪音:
    1)在建立CTR模型时,将用户没有看到的Item作为负例,这些Item是因为用户没有看到才没有被点击,不一定是用户不喜欢而没有被点击,所以这些Item是有噪音的。可以采用一些简单规则,剔除这些噪音负例,如采用skip-above思想,即用户点过的Item之上,没有点过的Item作为负例(假设用户是从上往下浏览Item)。
  • 采样方法有偏,没有覆盖整个集合:
    1)访购率问题中,如果只取只有一个门店的DEAL进行预估,则对于多门店的DEAL无法很好预估。应该保证一个门店的和多个门店的DEAL数据都有;
    2)无客观数据的二分类问题,用规则来获得正/负例,规则对正/负例的覆盖不全面。应该随机抽样数据,进行人工标注,以确保抽样数据和实际数据分布一致。

###访购率问题的训练数据

  • 收集N个月的DEAL数据(x)及相应访购率(y);
  • 收集最近N个月,剔除节假日等非常规时间 (保持分布一致);
  • 只收集在线时长>T 且 访问用户数 > U的DEAL (减少y的噪音);
  • 考虑DEAL销量生命周期 (保持分布一致);
  • 考虑不同城市、不同商圈、不同品类的差别 (保持分布一致)。

抽取特征

完成数据筛选和清洗后,就需要对数据抽取特征,就是完成输入空间到特征空间的转换(见下图)。针对线性模型或非线性模型需要进行不同特征抽取,线性模型需要更多特征抽取工作和技巧,而非线性模型对特征抽取要求相对较低。

extract_fea

通常,特征可以分为High Level与Low Level,High Level指含义比较泛的特征,Low Level指含义比较特定的特征,举例来说:

    DEAL A1属于POIA,人均50以下,访购率高;
    DEAL A2属于POIA,人均50以上,访购率高;
    DEAL B1属于POIB,人均50以下,访购率高;
    DEAL B2属于POIB,人均50以上,访购率底;

基于上面的数据,可以抽到两种特征,POI(门店)或人均消费;POI特征则是Low Level特征,人均消费则是High Level特征;假设模型通过学习,获得如下预估:

如果DEALx 属于POIA(Low Level feature),访购率高;
如果DEALx 人均50以下(High Level feature),访购率高。

所以,总体上,Low Level 比较有针对性,单个特征覆盖面小(含有这个特征的数据不多),特征数量(维度)很大。High Level比较泛化,单个特征覆盖面大(含有这个特征的数据很多),特征数量(维度)不大。长尾样本的预测值主要受High Level特征影响。高频样本的预测值主要受Low Level特征影响。

对于访购率问题,有大量的High Level或Low Level的特征,其中一些展示在下图:

fea_list

  • 非线性模型的特征
    1)可以主要使用High Level特征,因为计算复杂度大,所以特征维度不宜太高;
    2)通过High Level非线性映射可以比较好地拟合目标。

  • 线性模型的特征
    1)特征体系要尽可能全面,High Level和Low Level都要有;
    2)可以将High Level转换Low Level,以提升模型的拟合能力。

###特征归一化
特征抽取后,如果不同特征的取值范围相差很大,最好对特征进行归一化,以取得更好的效果,常见的归一化方式如下:

  • Rescaling:
    归一化到[0,1] 或 [-1,1],用类似方式:
  • Standardization:
    为x分布的均值,为x分布的标准差;

  • Scaling to unit length:
    归一化到单位长度向量

###特征选择
特征抽取和归一化之后,如果发现特征太多,导致模型无法训练,或很容易导致模型过拟合,则需要对特征进行选择,挑选有价值的特征。

  • Filter:
    假设特征子集对模型预估的影响互相独立,选择一个特征子集,分析该子集和数据Label的关系,如果存在某种正相关,则认为该特征子集有效。衡量特征子集和数据Label关系的算法有很多,如Chi-square,Information Gain。

  • Wrapper:
    选择一个特征子集加入原有特征集合,用模型进行训练,比较子集加入前后的效果,如果效果变好,则认为该特征子集有效,否则认为无效。

  • Embedded:
    将特征选择和模型训练结合起来,如在损失函数中加入L1 Norm ,L2 Norm。


训练模型

完成特征抽取和处理后,就可以开始模型训练了,下文以简单且常用的Logistic Regression模型(下称LR模型)为例,进行简单介绍。
设有m个(x,y)训练数据,其中x为特征向量,y为label,;w为模型中参数向量,即模型训练中需要学习的对象。
所谓训练模型,就是选定假说函数和损失函数,基于已有训练数据(x,y),不断调整w,使得损失函数最优,相应的w就是最终学习结果,也就得到相应的模型。

###模型函数
1)假说函数,即假设x和y存在一种函数关系:

2)损失函数,基于上述假设函数,构建模型损失函数(优化目标),在LR中通常以(x,y)的最大似然估计为目标:

###优化算法

  • 梯度下降(Gradient Descent)
    即w沿着损失函数的负梯度方向进行调整,示意图见下图,的梯度即一阶导数(见下式),梯度下降有多种类型,如随机梯度下降或批量梯度下降。

    随机梯度下降(Stochastic Gradient Descent),每一步随机选择一个样本,计算相应的梯度,并完成w的更新,如下式,

    批量梯度下降(Batch Gradient Descent),每一步都计算训练数据中的所有样本对应的梯度,w沿着这个梯度方向迭代,即

gradient_descent

  • 牛顿法(Newton’s Method)
    牛顿法的基本思想是在极小点附近通过对目标函数做二阶Taylor展开,进而找到L(w)的极小点的估计值。形象地讲,在wk处做切线,该切线与L(w)=0的交点即为下一个迭代点wk+1(示意图如下)。w的更新公式如下,其中目标函数的二阶偏导数,即为大名鼎鼎的Hessian矩阵。

    拟牛顿法(Quasi-Newton Methods):计算目标函数的二阶偏导数,难度较大,更为复杂的是目标函数的Hessian矩阵无法保持正定;不用二阶偏导数而构造出可以近似Hessian矩阵的逆的正定对称阵,从而在"拟牛顿"的条件下优化目标函数。
    BFGS: 使用BFGS公式对H(w)进行近似,内存中需要放H(w),内存需要O(m2)级别;
    L-BFGS:存储有限次数(如k次)的更新矩阵,用这些更新矩阵生成新的H(w),内存降至O(m)级别;
    OWLQN: 如果在目标函数中引入L1正则化,需要引入虚梯度来解决目标函数不可导问题,OWLQN就是用来解决这个问题。
    newton
  • Coordinate Descent
    对于w,每次迭代,固定其他维度不变,只对其一个维度进行搜索,确定最优下降方向(示意图如下),公式表达如下:

coordinate_descent


优化模型

经过上文提到的数据筛选和清洗、特征设计和选择、模型训练,就得到了一个模型,但是如果发现效果不好?怎么办?
【首先】
反思目标是否可预估,数据和特征是否存在bug。
【然后】
分析一下模型是Overfitting还是Underfitting,从数据、特征和模型等环节做针对性优化。

###Underfitting & Overfitting
所谓Underfitting,即模型没有学到数据内在关系,如下图左一所示,产生分类面不能很好的区分X和O两类数据;产生的深层原因,就是模型假设空间太小或者模型假设空间偏离。
所谓Overfitting,即模型过渡拟合了训练数据的内在关系,如下图右一所示,产生分类面过好地区分X和O两类数据,而真实分类面可能并不是这样,以至于在非训练数据上表现不好;产生的深层原因,是巨大的模型假设空间与稀疏的数据之间的矛盾。

underfitting_overfitting

在实战中,可以基于模型在训练集和测试集上的表现来确定当前模型到底是Underfitting还是Overfitting,判断方式如下表:

训练集表现 测试集表现 问题
< 期望目标值 < 期望目标值 Underfitting
> 期望目标值 接近或略逊于训练集 合适
> 期望目标值 远差于训练集 Overfitting

###怎么解决Underfitting和Overfitting问题?

问题 数据 特征 模型
Underfitting 清洗数据 1. 增加特征
2. 删除噪音特征
1. 调低正则项的惩罚参数
2. 换更“复杂”的模型(如把线性模型换为非线性模型)
3. 多个模型级联或组合
Overfitting 增加数据 1. 进行特征选择
2. 降维(如对特征进行聚类、主题模型进行处理等)
1. 提高正则项的惩罚参数
2. 减少训练迭代次数
3. 换更“简单”的模型(如把非线性模型换为线性模型)

总结

综上所述,机器学习解决问题涉及到问题建模、准备训练数据、抽取特征、训练模型和优化模型等关键环节,有如下要点:

  1. 理解业务,分解业务目标,规划模型可预估的路线图。
  2. 数据:
    y数据尽可能真实客观;
    训练集/测试集分布与线上应用环境的数据分布尽可能一致。
  3. 特征:
    利用Domain Knowledge进行特征抽取和选择;
    针对不同类型的模型设计不同的特征。
  4. 模型:
    针对不同业务目标、不同数据和特征,选择不同的模型;
    如果模型不符合预期,一定检查一下数据、特征、模型等处理环节是否有bug;
    考虑模型Underfitting和Qverfitting,针对性地优化。

原文链接:https://tech.meituan.com/tag/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0InAction%E7%B3%BB%E5%88%97

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:286423次
    • 积分:4578
    • 等级:
    • 排名:第7399名
    • 原创:163篇
    • 转载:42篇
    • 译文:0篇
    • 评论:61条
    最新评论