当前位置: 首页 > 科技观察

利用现有的大数据技术,如何搭建机器学习平台

时间:2023-03-14 23:23:40 科技观察

机器是如何学习的?人的大脑有不断积累经验的能力,我们有能力根据经验进行分析和处理。比如我们要从市场上摘一个西瓜,别人或者我们自己的经验告诉我们,颜色翠绿、根部卷曲、线条清晰、敲击声响亮的西瓜更好吃。我们有这样的能力,那么机器呢?机器不只是接收和处理指令吗?与人脑类似,它们可以将历史数据输入机器,机器依靠建模算法生成模型。基于模型,可以处理新数据以获得未知数。属性。下面是机器学习和人脑归纳体验的类图:平台构思于同程内部。我们了解了一些应用机器学习的团队,发现他们常见的处理步骤如下:这个过程中存在一些痛点:线上将数据传输到线下非常耗时。很难平衡训练数据量。如果训练数据量很大,用R或者Python单机训练会非常耗时。如果训练数据量小,训练出来的模型容易过拟合。对分析师和挖矿人员的编码能力有一定的要求。因此,我们觉得可以搭建一套平台产品,直接对在线数据进行建模实验,节省机器学习的开发成本,降低机器学习的应用门槛。平台建设设计目标支持大数据量建模实验,通过并行计算缩短耗时抽象出最小执行单元,易于配置。通过拖动和连接构建建模过程。支持常用机器学习学习算法处理回归、分类、聚类等问题支持常用特征工程组件,如标准化、归一化、缺失值处理等支持算法评估结果可视化算法库算法方面库,我们选择了Spark。与R或Python相比,Spark具有分布式计算的能力,效率更高。ml和mllib都是Spark中的机器学习库,这两个库都可以满足常用的机器学习函数的需要。ml的主要操作是DataFrame。与mllib提供的对RDD的基本操作相比,ml对DataFrame的抽象程度更高,数据与操作的耦合度更低。ml提供了一个管道。像Python的sklearn,可以将很多操作(算法/特征提取/特征转换)以流水线的形式连接起来,非常方便任务组合,比如StringToIndexer、IndexerToString、VectorAssembler等。组件设计从架构设计的角度来看,无论是算法单元、特征工程单元、评估单元还是其他工具单元,我们认为都可以采用组件的形式进行设计。借助通用的接口行为和不同的实现,可以达到松散耦合和易于扩展的目的。上图是整个设计类图的一部分。事实上,我们做了更多的抽象层次和通用代码。再看核心类BaseTask:run方法的实现是一组模板,步骤如下:每个组件只需要实现自己的核心逻辑execute方法即可。平台迭代v1.0(平台核心架构)基于上述设计目标,第一版机器学习平台架构如下:用户通过界面拖拽组件构建建模流程,并保存组件配置和对数据库的依赖用户可以在界面上触发建模实验的运行。其实就是通过spark-submit提交一个spark任务MlEngine来负责这个任务的执行。在Driver端,会从DB中获取当前实验的依赖组件和进程关系。这些组件会顺序运行,当涉及到RDD相关操作时,会提交给SparkExecutor进行并行计算流程&评估视图。在第一个版本中,我们并没有提供太多的算法组件,只有线性回归和逻辑回归,但是基于组件化我们非常有信心在后期可以快速迭代。除了更少的算法,它结合了业务反馈和自我思考。我们认为机器学习平台可以做更多的事情:平台定位不仅是实验控制台,还有添加预测结果(离线计算)的功能随着历史数据的不断扩充,大多数情况下训练模型应该是周期性的事情.我们希望能够帮助用户在平台级别托管此过程。在v2.0的第二个版本(扩展组件&离线计算&周期调度)中,我们首先在原有设计框架的基础上,对相关的实用组件进行了扩展和完善:同时,在第二个版本中,我们在细节上做了一些改进:建模实验运行状态过程展示,用户可以观察各个组件的运行时间、状态、日志等。完整的组件可以部分运行。在更复杂的建模实验中,可以先进行部分运行。验证和参数调整建模实验支持克隆离线计算我们提供了'野外登陆'的工具组件,可以将预测结果以csv格式拖放到hdfs中:周期调度&宏变量支持我们的另一个产品:大数据开发套件(BDK),覆盖周期调度功能,机器学习平台的建模实验可以以子任务的形式嵌入,结合宏变量(语法替换某些规则,如'/%Y/%m/%d'即可以当天等表示)用户可以在我们的平台上托管自己的建模实验,从而达到周期性离线计算的目的。架构综上所述,丰富组件和完善功能,实现离线计算结果,结合BDK进行周期性离线计算,是我们平台二版的主要关注点。具体架构演变如下:v3.0(real-timeprediction&cross-validation)实时预测在我们的平台中,可以通过建模实验来训练模型。模型可以通过PMML等标准导出,也可以通过我们的模型导出功能将模型以parquet格式保存在Hdfs的相应目录中。用户可以获得这些模型标准并自行实现一些功能。但是我们觉得实时预测的功能也可以在我们的平台上抽象出来。因此,在3.0架构中,我们开发了提供实时预测服务的tcscoring系统:tcscoring系统的依赖介质是模型的PMML文件,用户可以直接将训练好的模型对应的PMML文件部署到机器学习平台,或者通过其他路径生成的PMML文件。部署成功后会返回预测的rest接口供业务使用:当然PMML的部署也可以结合BDK设置周期调度。结合模型的周期性训练,可以将整个训练+预测过程交给机器学习平台+BDK实现托管。交叉验证在机器学习平台的第三个版本中,我们也关注交叉验证。在以前的版本中,用户一次只能试验一组超参数。通过交叉验证,用户可以在一个实验中进行配置。多组超参数在训练集中按比例拆分,一部分训练一部分验证,从而得到最好的模型:PlatformOutlookPersonalization经过3次迭代,机器学习平台已经抽象出很多共通的东西,但是仍然有一些无法很好实现的个性化的东西。我们的想法是,对于用户来说,最好的个性化方式就是让用户自己写代码。我们将尝试开放自定义插件的接口,利用动态编译技术加载这些个性化组件,并将其集成到建模过程中。.集成其他算法包我们目前也在尝试集成sparkml以外的算法包,比如xgboost,应用比较广泛。另一方面,目前的算法仍然是基于传统的机器学习算法。对于深度学习,无论是嵌入tensorflow还是使用一些第三方的深度学习库,比如Deeplearning4j等,接下来我们会尝试在sparkml之外集成这些算法包。