魔镜—58可视化数据智能平台架构与实践

魔镜是数据产品研发部基于大数据平台开发的一套可视化数据智能平台。 传统机器学习建模流程对非数据科学专业人员来说,整体门槛较高,其中主要体现在几个方面:

1. 机器学习概念较为抽象

比如训练集、验证集、测试集、特征、维度、标签泄露、欠拟合、过拟合、学习曲线、验证曲线、ROC曲线、混淆矩阵等等,除了需要了解概念外,需要了解具体的使用场景、使用方法。

2. 机器学习建模流程复杂

数据准备、数据预处理、统计分析、特征工程、模型训练与建模、模型评估与对比等,尤其是统计分析以及特征工程,涉及大量的特征生成、特征变换、特征选择的过程,占用了数据挖掘的大部分时间。

3. 数学推导以及开发能力

除了需要熟悉Python、R,在大数据环境下Java和Scala用得也相对较多。 特别对于那些需要自己实现算法以匹配自己业务的场景,会涉及大量的公式推导、模型并行优化等相关高阶能力。

目标

对于那些了解业务需求、规则策略敏感、工程以及算法能力相对欠缺的人员,如: 业务、运营、数据产品等,我们定义为非专家用户; 对具有丰富建模经验、出众工程和算法能力、业务理解稍弱的人员我们定义为专家用户。

魔镜用户囊括了这两类用户,针对这两类用户我们设计了可视化的操作界面、丰富的算法组件、方便的调参方式、详细的评估对比报告。

魔镜目标旨在为非专家用户降低机器学习门槛,加速其使用数据挖掘手段进行业务探索; 同时辅助专家用户,加速其整体建模流程。

整体架构

1. 用户体系

集成公司的SSO以及BSP,以OA账号作为唯一登录账号,用户体系统一。

2. 安全体系

集成大数据平台的多租户体系,执行相关命令时根据OA账号获取所属部门的Hadoop账号,进而获取相应Hadoop账号下有权限的Hive表、HDFS路径以及相应的资源队列。

3. 资源层

目前的数据源以及结果数据基于Hive存储,模型文件存储于HDFS。 计算引擎基于Spark,基于Scala实现数据预处理、统计分析等逻辑,大部分模型算法来源于Spark MLLib,部分算法(XGBoost、LightGBM、FM等)集成第三方。

4. 逻辑层

目前逻辑层涵盖数据源/目标,、数据预处理、统计分析、特征工程、机器学习、工具六类,共70个组件。

5. 应用层

针对实验提供了项目管理以及实验管理,提供了完善的权限控制。 数据管理功能与DP集成,可以直接读取大数据平台中自己有权限的Hive表。 模型管理目前主要针对二分类模型,提供了完善的模型对比、模型发布等功能。

同时魔镜提供了完善的调度功能,可以自动解析实验中多个组件的依赖关系,并提供多种灵活的调度策略。

6. 服务层

离线调度:线下训练好的模型集成调度可以形成离线调度服务,定期使用训练好的模型对新数据进行预测。下图为离线调度流程图:

在线预测:结合模型发布、模型关联可以将线下训练好的模型进行发布,提供给用户使用HTTP接口进行实时预测的能力。

调度依赖

调度针对如下组件之间的依赖关系,该以什么方式快速判断其执行的先后顺序呢?

传统思路为使用递归方式判断其依赖关系,在魔镜中我们采用类似拓扑排序的方式,将相互依赖关系转换成二维数组形态,只需简单判断横向坐标里边的元素全为0即可及时判断出下一个即将要执行的任务节点,减少计算量,提高计算速度:

特征生成

特征工程占据了整个数据挖掘的大部分时间,而特征工程里边的特征生成又占用了其中的大部分时间,如何减少特征生成的时间是魔镜关注的一个重点。

专家用户常使用Python的一些第三方库实现特征生成,其中一个比较好的是FeatureTools,进行实体关系设置、实体关联、选择聚合和转换方法后,可以自动生成具有良好解释性的特征。

基于单机版的Python或者Python的并行框架去执行,无法直接和DP进行集成,并且没有办法利用到公司的集群资源,基于这个背景,魔镜做了如下设计:

主旨思想为: 数据驱动计算。

1. 数据定义

需要定义好特征主表以及各特征子表,主表和子表之间需要通过关联字段进行关联。

2. 数据切分

按主表主键将主表数据以及关联的子表数据进行切分,按照规则生成在指定的HDFS目录中。

3. 分布执行

使用Spark定义序列,并将序列号作为Python函数参数,传入到特征生成函数中。 各路径中的数据由各自指定的Python进程进行运算并存储。

4. 汇总结果

由Spark的Driver进程汇总各Python进程的执行结果,进行最终输出。

总结: 利用集群的分布式计算能力加快了生成速度,同时利用了Python的第三方库能力进行了功能扩展。

自动建模(二分类)

目前业界对自动学习部分的支持力度越来越大,不仅国内的阿里PAI、第四范式,国外的H2O、TransmogrifAI 等也做得很深入。

更有甚者DataRobot完全针对非专家用户提供一键式运行,内部集成了数据预处理、特征生成、特征转换、特征选择等特征工程,内部更是集成了Spark、Python、R等等多种模型算法,算法并行执行、自动选择最优算法,并完成了模型一键部署以及模型部署后的效果跟踪。

魔镜也实现了类似的尝试,目标是针对非专家用户生成基线模型。

整体流程如下:

1. 数据预处理

对特征维度进行统计,删除缺失值大于90%的特征。 并对剩余特征按照60%、20%、20%的比例进行切分,分别作为训练集、验证机和测试集。

2. 特征工程

分别针对数值特征、非数值特征以及树形模型、非树形模型做了不同处理。

3. 模型训练

目前集成了4类算法(RF、GBDT、LR、XGBoost),分别针对每类算法提供了一组默认的参数组合,利用Spark的分布式能力,对各算法的各参数组合(网格式),在60%训练集以及20验证集上并行运行。

4. 评估报告

将各模型的结果按照评估指标进行排序,在评估报告中分别显示各算法的具体效果。 提取最优模型的训练参数在前80%的数据上进行训练,并在最终20%测试集上进行最终效果评估。

展望

后期会在集成云窗调度、高维特征支持、Python模型支持、模型在线预测上进一步展开。