您的位置:首页 > 其它

机器学习模型应用以及模型优化的一些思路

2017-03-09 19:55 387 查看

机器学习模型应用以及模型优化的一些思路

1 概述

本文会介绍如何应用机器学习模型来构建一个智能化应用的通用的过程以及过程中每个环节一些实践性的思路。

2 搭建基于机器学习模型的智能化应用的通用流程

下面介绍一些通用流程

1) 问题界定和定义

将一个业务中待解决问题转化为一个机器学习模型应用问题

2) label标注的定义

label的定义和问题的界定直接相关。 Label我们要尽量选择用户在产品中做出的明确清晰的标注。

3) 数据样本的筛选和构造

4) 选择机器学习算法

5) 确定模型性能的度量方式

6) 模型优化

包括数据分析可视化、特征工程、算法调参、bad case 分析等,这是一个反复迭代优化的过程。

7) 设计模型应用的策略

这个和问题界定有一定相关,但在实际应用中,有很多细节的考量,这些细节对于业务效果非常重要。 同样模型、不同策略得到业务效果可能会差异很大。

8) 设计实验以及确定评估指标

9) 模型线上应用

这里包括线上以及离线特征导入以及线上特征提取、模型线上化、离线和线上模型性能确认、策略研发等。

10)业务效果评估

机器学习模型应用是一个反复迭代实验过程,根据实验效果进行很多次的分析调整,以上环节会反复循环进行。

 

3 机器学习模型应用的环节详解

3.1  问题界定和定义

这个步骤非常重要,如何将一个业务中待解决问题转化为一个机器学习模型应用问题,是机器学习应用的第一步,也确定后面所有流程的工作方向。如果这个部分界定或拆分的不好,那就很难产出好的业务效果。

在一些成熟的机器学习应用领域,问题界定已经比较清楚,例如搜索广告中如何最大化收入问题映射为CTR(点击率)预估机器学习问题。

非成熟的问题,就需要我们自己进行定义和界定。在充分理解业务运行的方式以及业务的目标的情况下,我们要提炼出希望优化的目标(最大化xx),同时要确定我们约束是什么,然后抽象为机器学习模型(分类问题、回归问题)以及模型应用的策略。

3.2  label标注的定义

label的定义和问题的界定直接相关。

Label 我们尽量选择有用户明确清晰在产品中标注定义的,例如是否点击了广告、是否发单、是否取消、是否投诉等这些在产品交互中用户明确作出的判断。而在特定一些问题场景中,可能无法直接找到这样label,例如判断用户是否流失、用户是否对产品有负面的倾向等,在这种情况下,需要尽量和产品等业务方一起来做label,确定这label定义方式是符合业务本质的。总体上讲,明确清晰无歧义的label标注更利于机器应用学习应用取的成功。

3.3  数据样本的筛选和构造

在这个阶段,会确定我们可用的数据样本的规模,确定训练样本、测试样本的拆分方式。有几点思路:

1) 尽量多的数据样本

可以通过扩大数据提取的时间范围、重复采样、时间窗口滑动等方式增大样本规模。当模型性能不够时,有时增加数据也是很好的优化思路。

2) 针对预测目标做一些倾斜采样处理

例如如果正样本少,而我们应用主要需要预测正样本,这时候,可以针对已有正样本进行重复采样,扩大正样本在总体样本中的比例。

3) 去掉不合适的样本

通过业务理解、数据分析、可视化等手段,去掉一些样本数据中不合适的样本。例如部分样本属于以前某个实验样本、某些样本存在作弊行为、部分用户群和本次业务优化目标不符等。对于错误样本,我们会结合特征工程中数据分析,根据特征数据错误或缺失的情况,进行删除。针对出现不合适样本的场景,在线上处理以及实验设计和评估等环节我们也要加以考虑。

3.4  机器学习算法的选择

       机器学习算法很多,sklearn官网中就提供一个算法选择的一个图谱,具体如下:

图谱的官网链接: http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html
从应用角度,如果有质量还可以的特征以及样本,且数据规模大不是特别特别大、数据领域不是太特殊情况下,个人认为成熟算法的结果差异不会太大。开始的时候,我们应该尽量选择一些简单、工业界常用的算法,例如线性回归、逻辑回归、gdbt等。从个人角度,推荐使用xgboost库,回归以及分类问题都可以用,支持python、C++、java、Scala等主流语言、性能很好(线上实战验证)。

如果用成熟简单的算法,模型的效果还可以接受,在资源有限的情况下,个人建议先集中精力搭建起来形成闭环运转的机器学习模型应用系统,并优化迭代策略以取得一定显著的业务效果。有了业务效果后,这时候模型效果一点点提升可能都会直接提升业务效果,而常规的特征方面优化可能有了一定瓶颈,这时可以再进一步尝试更多类型的复杂度更高时效性更强算法,例如深度学习、gbdt+lr的模型融合、分布式模型、增量更新算法等。

3.5  模型的度量评估方式

分类问题auc是比较通用的度量方式,同时根据业务需要,观察不同概率阈值情况下的准确率、召回率等指标。回归问题我们需要根据我们自己业务特点以及优化目标,选择MAP、MAPE、MSE等适合自己的指标。有的时候,我们还可以考虑根据自己业务特点,将样本分层,观察在不同样本群下模型的准确度,甚至针对不同群体构建不同的模型来度量,例如高频用户模型、中频用户模型、低频用户模型等。

3.6  特征工程

特征工程应该提升模型性能的主要方式,做模型优化的大部分的时间应该都在想特征、提特征上。下面介绍一些特征工程的思路。

1)  加好的特征

好的特征以及数据样本决定我们模型优化的上限,所以找到好的特征非常重要。好的特征来源于对业务的深入理解。首先自己要深入理解业务的运作方式,了解影响模型label目标的主要业务因素;其次多和业务的专家沟通,获取到从他们角度认为重要的因素;拉入更多人员进行头脑风暴,找到尽可能多的影响因素。

不同特征当前可用性也不一样。 初期我们要更多关注那些已有数据、线上易获取的特征;然后对于一些我们排序出来重要因素,如果当前没有数据以及线上无法获取,我们要尽快准备;

具体特征都是业务相关的,宏观上讲一些可能的方向供参考,例如用户使用上下文中可以感知的因素的属性、用户历史的业务数据因素、时间因素、地域因素、用户的个性化因素(年龄、爱好等)、用户使用场景中各种历史沉淀的评分因素(好评、差评等数量)、场景各种对象的属性特征(例如长度、颜色、形状等)。

2)  特征可视化

将特征数据通过散点图、分布图等方式观察下特征数据的特点,一方面可以观察特征对于分类等数据区分度,更重要的是可以根据数据分布,确认特征是否存在异常情况,例如由于线上bug导致部分数据是错误的。这一块建议重视关注,可能比较费时,但是可以避免后面模型优化 或bad case排查的工作量。

3)  统计特征

有了原始的特征因素后,可以让这个特征具备更强的表达性。统计化是一个常用的方式,主要有最大值、最小值、平均值、标准差、方差、中位数、分布区间统计数等。例如周一的平均订单数、最大订单数等。

4)  特征组合

组合多个相关特征提取出其相关的规律,例如多个特征加和、求差、乘除、求斜率、变化比率、增长倍数等。

将多个维度特征相互交叉,产生更多具体场景化的特征,例如和不同时段端、和不同的地理位置范围组合

5)  特征拆解

将一个特征拆为多个更易理解的特征。 例如日期,可以拆为年、月、日、小时、分、秒、星期几、是否为周末。

6)  数字型特征重构

通过调整数字单位等方式,可以调整数字大小。 例如6500 克 可以表达6.5千克; 也可以进一步拆解表达为6千克、0.5千克等。

7)  Onehot encoding

将类型特征映射多个是否特征,例如颜色可映射是否为为红色、是否为绿色、是否为蓝色。详细可参考链接

8)  统计性特征映射为解释型特征

将一个数字型或统计性特征,映射为多个范围区间,然后为每个区间为一个类别,接桌借助于onehot encoding 就变为一系列是否的解释型特征。例如历史月订单0~5 为低频、6~15 为中频、 大于16为高频, 订单量10数字就可以变为[0,1,0] 这三维特征。

9)  挖掘特征

对于有些特征我们的数据没有明确的标注,但是我们认为也很有重要。 这是可以用机器学习以及部分样本标注或人工标注的方式挖掘一些特征。 例如假设大部分用户的性别我们不知道,但是部分用户可以通过这种其他途径知道。那可以基于这个样本训练处一个性别分类预测的模型,然后给预测所有用户的性别,将这个预测结果做为特征。

10)        特征自学习

在深度学习中,在构造出得到好的原始特征和适用于特征的网络结构后,特征组合和抽象会交给深度学习自行学习。 典型可以参考CNN算法,通过网络的卷积、池化等操作将原始图片特征,通过网络层学习抽象出了高层次的边缘、轮廓等特征。

11)        特征筛选

当有很多特征时,有部分特征是强相关的,属于冗余特征;有部分特征可能贡献小甚至负面贡献。 这时候需要做一些特征筛选。例如特征两两组合确认特征之间的相关性系数,对于相关性非常高的特征只保留一个;特征和label标注做相关性判断,去掉一些相关性差的特征;当然也可以通过控制特征增长的过程,从基础特征集合开始,逐渐加入新特征或新特征集实验,如果新特征效果不好,则丢弃。

有些模型自带特征筛选的能力,例如gbdt( xgboost)、回归中正则化等。通过这些模型一定程度也能达到特征筛选的目标。不过如果特征量特别多,建议在上线前,去掉无效特征,这样既可以避免特征维护的工作量,同时也能提高线上性能。

更多细节可以参考特征工程系统性的好文章

3.7  算法调参

       算法调参需要因算法而定,这一块算法达人们自行研究。附xgboost 调参博客

3.8  bad case 分析

在模型优化过程中,经常分析bad case,可能会发现一些我们忽视的特征 或者特征问题。 例如实际标注为正样本,但是预测出来的确实负样本,且概率特别低的负样本,都是可以作为分析的对象,一般拿一批类似样本分析,就可能会找到问题规律所在。这个也是在模型优化阶段,发现潜在问题的有效手段。

3.9  实验的设计和评估

       对于机器学习应用,实验非常重要。因为机器学习应用相对于普通简单易懂规则,有一定不透明性,所以必须要有良好设计的实验来证明策略应用有效性。最常规有效的方式就是按一定规则随机分组,进行A/B实验,进行A/B实验前,建议评估下分组规则是否有偏,可以通过实验时附带一个分组,进行A A测试。 做分组尽量引入随机算法,避免使用固有id取模的方式分组,这样分组方式可能存在天然的组别偏差。

       一定确定业务相关方达成一致的业务评估指标,只有充分一致的业务评估指标,才能在后续论证有效果后顺利推广。

3.10    策略设计

       有一个性能尚可的模型后,这时候好的策略就非常关键了。策略和产品强相关,建议和业务相关方一起集思广益。多并行做一些实验来找出好策略。需要关注的是策略和模型优化是一样重要,性能再好机器学习模型,如果没有合适应用策略,也难以取得好的业务效果。

      由于策略线上实现以及实验需要一定周期,建议最好能设计出较好离线模拟评估策略好坏以及收益预估的方案,这样很多策略想法在离线阶段就能较快做一个初步判断,加速好策略的产出以及迭代速度。

3.11    线上服务

       包括线上以及离线特征导入以及线上特征提取、模型线上化、离线和线上模型性能确认、策略研发等策。策略服务设计要多关注多策略多模型并行实验的支持、线上和离线数据流的正确性保障、快速的自动化模型上线策略等问题。详细可以参考策略类服务的设计实践

3.12    实际应用中的一些注意事项

1、 模型和策略优化都会尽量多轮反复迭代的煎熬过程,在这个过程中,我们一定要耐心、细心,关注细节,对一个策略、一个优化方向都要在细节要研究透彻,避免浅尝辄止。这可能会错过一个有效的方向。在这个过程中,最好有丰富实操的经验人士指导,避免走一些弯路。

2、 在模型有一定性能准确定后,一定把更多投入精力设计策略、设计实验,要用迭代的心理,先将整个应用的框架搭建起来,先取的一定业务效果。这样才有更多信心以及资源来进一步做深入的模型优化。

3、 线上是复杂的,对于从离线模型到线上应用过程中,一定关注数据流等地方的细节,做好测试以及实验论证。

4、 要分析好要解决的问题是否是一个适合应用机器学习的问题。要确认一个成功的人工智能应用需要必备条件是否满足,例如问题边界是否清晰、是否有外部反馈、是否有充足的数据。具体可以参考人工智能商业应用成功的六大必要条件

5、 尽量用成本小的简化的实验来做初步问题可行性论证。因为线上的开发成本大以及复杂性高,避免在论证思路的可行性阶段,就引入较大的产品开发工作。

4 结语

       本文介绍我理解的搭建机器学习应用的通用流程以及流程中一些实践思路。由于机器学习模型在不同领域或方向应用,也有很多其自有领域知识,例如语音、图像、推荐等领域,本文没有涉及这些具体领域方向,仅仅介绍相对通用的机器学习应用的过程。

文中介绍有可能局限个人的实践以及理解水平,存在不正确或不合理的地方,欢迎讨论。我的邮箱: wgongzheng@qq.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习 优化 应用
相关文章推荐