阅读字数:4809 |6分钟阅读
嘉宾演讲视频地址:suo.im/4Nm9F3
摘要
Apache MADlib是Pivotal与UCBerkeley合作的一个开源机器学习库,提供了精确的数据并行实现、统计和机器学习方法对结构化和非结构化数据进行分析。MADlib提供了丰富的分析模型,包括回归分析,决策树,随机森林,贝叶斯分类,向量机,风险模型,KMEAN聚集,文本挖掘,数据校验等。MADlib支持Greenplum,PostgreSQL 以及 Apache HAWQ, In-Database Analytics的特性使其大大扩展了数据库的分析功能,充分利用MPP架构使其能够快速处理海量数据集。本主题将为大家介绍MADlib的基本架构,工作原理及特性,分享MADlib在互联网,金融,零售等行业的用户案例,展望In-Database Machine Learning的广阔前景。
MADlib简介
MADlib是一个基于SQL的数据库内置的可扩展机的器学习库。让我们来逐一解释这个定义。说起机器学习库,同行的朋友应该比较熟悉python上的scikit-learn。我们的库实现了类似的功能,但是我们的语法是基于SQL的,也就是说,你可以用select + function name的方式来调用这个库。这就意味着,所有的数据调用和计算都在Database内完成而不需要数据的导入导出。由于应用在大规模并行处理的数据库内,它的可扩展性也非常好,能够处理较大量级的数据。
我们的整个项目和代码是在Apache上开源的,到目前为止,我们已经有6个release, 并且于今年从阿帕奇孵化器毕业,成为apache的顶级项目。
我们是一个在大规模并行处理系统上的可扩展应用,目前支持PostgreSQL和Pivotal Greenplum。
MADlib具有强大的数据分析能力。我们支持大量的机器学习,图形分析和统计分析算法。
历史回顾
MADlib创始于2011年,当时属于EMC/Greenplum,后来Greenplum变成了pivotal的Greenplum。主要由UC Berkeley的一位学者,Joe Hellerstein发起,Stanford, University of Wisconsin-MADISON和University of Florida也有参与。
MAD这个名字来源于三个词。
M代表Magnetic,有吸引力的,意味着这个系统能够吸引很多的用户和数据。传统的数据仓库对新数据不够友好,导入的数据往往需要非常干净和完整。然而MADlib可以做到即使在数据不够整齐的情况下,也能帮助数据科学家进行一些有意义的计算和推断。
A代表Agile,敏捷,意味着这个系统能够帮助数据科学家快速有效地处理数据。这有赖于在MADlib在数据库内的集成。
D代表Deep,深入。在大规模并行集成系统上的应用使得数据科学家能够使用完整的大数据,而不是在单核的内存内对数据集的子集进行分析,从而提高了分析的精准性。
三个字母连在一起,mad这个词在英语中除了我们所熟知的疯狂这个意思,还有一个意思是“极好的”。我们希望MADlib能给数据科学家们提供一个极好的机器学习和数据分析平台。
MADlib用户
MADlib有非常广泛的用户群体。
目前,我们的用户涉及金融,保险,互联网,医疗,媒体,娱乐,汽车,制造等等行业。可以说我们提供的机器学习方法能够覆盖大部分行业的需求。
MADlib功能
如上图所示,这个列表是目前MADlib所支持的算法。
监督学习,我们支持Neural Network, SVM, regression, decision tree;非监督学习,我们支持clustering,topic modeling等;图形处理,我们支持apsp, bfs等等。
另外还有时间序列处理,模型选择,基本统计和数据类型转换。到目前为止我们支持了超过50种算法,是一个复杂而成熟的数据科学学习库,能够支持各种复杂的机器学习场景。
MADlib特性
更好的并行度。我们在算法设计阶段就充分考虑了与大规模并行处理系统,基于不同的算法,设计不同的分布方式来保证更快的并行处理速度。
更好的可扩展性。随着数据量的增长,我们的扩展性非常稳定。
更高的预测精度。处理大数据使得更多有效数据被利用,从而实现更加精确的预测效果。
我们是Apache ASF上的顶级开源项目,我们的开发是在Pivotal的支持下基于Apache community的,与社区有非常好的互动。
MADlib的工作原理
相信很多Greenplum用户对这幅图很熟悉,这是Greenplum的架构,当一个query进来的时候,master server会对query进行处理,按一定规则把query分配到多个segment上并行处理,最后的结果再返回master server。
MADlib就是构建在Greenplum这个架构之上的。MADlib通过定义postgres上的UDA和UDF建立in-database function。当我们用sql, r调用MADlib的时候,MADlib会首先进行输入的有效性判断和数据的预处理,将处理后的query传给Greenplum, 之后所有的计算在Greenplum内执行。
执行流程
上图中是整个过程的执行流程。
在客户端,我们可以使用jupyter, zeppelin, psql等等工具连接数据库并调用MADlib function,MADlib处理后根据算法生成多个query传入database, 之后Greenplum执行query并返回String, String一般是一个或多个存放结果的表。
MADlib Architecture
这是MADlib的基本架构,我们的user interface就是sql, 代码的上层主要是python, 会做一些input validation和pre-processing. 我们调用plpy来执行查询。代码的中间层和底层主要是c++, 我们用c++来调用eigen libraray. Eigen是C++里处理代数和几何的包。C++也调用了c的API来和DB进行交流。
示例– PageRank
下面是一个MADlib使用示例,以pagerank这个算法为例。
PageRank是一种由搜索引擎根据网页直接相互的超链接来进行计算的技术,是网页排名的一个重要算法,以google创始人Larry Page的名字来命名。
在MADlib中,计算一个图的pagerank,需要两个表格作为输入数据,第一个表格是vertex(节点),用来保存节点的信息,第二个表是edge(边),用来保存节点指向节点的情况。使用MADlib调用pagerank的步骤如下:select MADlib.pagerank(),这里需要几个输入。第一个输入就是vertex表,第二个输入是vertex id这一栏在该表中的名称,在示例中的这个vertex表里,这就是id这一栏。第三个输入是edge table这张表的名称,第四个输入,指出边的起点和终点所对应的栏在表里的名称,最后一个输入是用户定义的输出表格,计算结果将返回这个表格。上图是计算结果,查看pagerank_out这张表格,可以看到每个节点的pagerank分数。另外,我们有一个表格,pagerank_out_summary,存放了收敛迭代的次数,在这个例子中,计算迭代了16次之后收敛并返回结果。
可扩展性
MADlib具有良好的可扩展性,能够处理较大量级的数据。以pagerank为例,这张图显了随着边数的增加,完成计算所需要的时间。我们可以看到,1亿个顶点,从6亿条边到50亿条边,运行时间几乎保持了线性增长。
这是SVM的Performance
我们可以看到在一亿条记录范围内,运行时间也是接近线性的增长。对一亿条记录的处理可以在10分钟内完成。
以上就是对MADlib的初步介绍,相信大家已经对MADlib有了一个初步的了解。接下来是两个用户案例。
用户案例1 -Greenplum + MADlib助力邮件营销
首先介绍一个下案例的背景。我们的客户是某大型跨国多元化传媒和娱乐公司,是Greenplum的用户。
在这个案例中,他们想要提高邮件营销的精准度。他们面临的主要问题有:邮件广告点击预测模型不够精准,需要更好的模型和营销策略。其次,他们现有的数据分析流程比较繁琐,速度较慢并且有很多手工的步骤,容易出错。在与Pivotal Data Science Team合作之后,我们为他们提供了一套解决方案。首先,我们充分利用了MADlib的多种功能,简化了整个data pipeline,用MADlib重新建模和预测,并且实现了流程的全自动化。
这次合作的影响非常显著,首先,对于邮件点击率,我们有了更快,更高效和更精准的建模和预测,其次,该客户一直是Greenplum的用户,但对Greenplum內建的各种资源并没有充分利用,这次合作让他们看到了in-database analytics的高效和快捷,使得他们实现了in-Greenplum analytics一体化。
客户的数据源包含了以下信息:user 在mobile 端的购买,预订,注册,邮件营销历史,网页浏览历史,地理信息等等,数据量是TB级别,总共的特征超过1000项。整个过程都在Greenplum这个平台上进行。建模工具主要是MADlib,以及一些PL/pgSQL。
以下是该客户当时的数据分析工作流程。原始的数据都导入并存在Greenplum中。之后,数据被导入SAS中,进行了数据清洗和准备。再之后数据又从SAS中导入了EXCEL,在EXCEL中建模计算Information Value 和Weight of Evidence, 即信息量和证据权重。之后,数据被导回SAS,计算Pairwise Correlation,一种变量相关性。根据计算的结果,在EXCEL中去除高度相关的变量。以上步骤都是为了减少变量的数量,因为SAS上并不能很好地处理超过1000个的变量。这之后,数据被再次导回SAS,在上面进行逻辑回归,最后把分析结果导回Greenplum。由于SAS能够处理的数据量有限,客户只能用Sample进行建模,所以在最后,数据又导回Excel进行KS-Score Test, 进行Model Validation。KS-Score Test验证的是样本分布是否能有效代表总体分布,从而验证模型的有效性。经过Validation之后结果最终被导回Greenplum,手动用该模型对新数据进行预测。
从这个流程中我们能看到一些问题:
首先,很明显的,数据在Greenplum, SAS和Excel之间多次导入导出,比较繁琐,这期间也会存在数据格式转换,数据丢失等等问题。
其次,我们可以看到,在SAS和Excel之间来回的好几个步骤其实都是为了降低维度,减少SAS上的变量数,由于许多变量没有得到利用,这从一定程度上降低了模型预测的准确度。
最后,由于SAS和EXCEL能处理的数据有限,客户只能用样本数据来进行建模,没有充分利用Greenplum里的大数据,这也影响了建模的精确度。
在与Pivotal Data Science合作之后,我们建立了一个新的工作流程。
可以看到,所有SAS和EXCEL内的步骤都被移除了,整个流程都在Greenplum内完成。在存放好数据之后,首先,用MADlib的feature generation来提取特征,之后运调用不同的MADlib函数,计算Information Value, pairwise correlation,完成特征选择。建模阶段,直接调用相关的逻辑回归函数和elastic net,(用elastic net进行变量选择,然后建立逻辑回归)。验证阶段,MADlib提供了很多validation的函数,最后,MADlib函数可以对新的data进行预测。
从数据准备到特征选择,再到建模,验证和预测,MADlib提供了所有的相关函数。对比之前的步骤数量,也从8步变为了6步。另一个明显的优势是,这个模型用到了Greenplum里的所有数据,并且可以使用更多的feature来建模。
此次优化使得数据分析的整个环节效率都大大提高。在生成数据阶段。原来的时间是75分钟,优化后只需要8分钟,整个过程速度提高了9倍。Attribute compilation阶段,速度是之前的3倍,并且运用了更多的495个attribute。在计算Information Value阶段,平均每个变量的计算速度是之前的13.7倍。建模阶段,之前一次迭代需要大约30分钟,并且只能运用小于50个变量,而在优化之后,平均一次迭代只需要1.86分钟,并且可以用376个变量进行回归分析,平均每次迭代速度是原来的16倍。可以看到,整个数据分析流程得到了非常显著的提速。
这是建模的结果。
原始模型的准确率是99.7%,但是true positive rate是0%。也就是说,原始的模型只能很好地预测不会点击邮件的用户,而没有把握预测会点击邮件的用户。改良后的模型,准确率是62.8%,看上去好像降低了,但true positive rate是66%,这意味着,该模型有66%的把握预测出会点击邮件的用户,而这些用户正是给公司带来核心价值的用户群体。
用户案例2-基于API日志的金融产品用户分析
这个案例的用户是某大型跨国金融服务公司。他们的case主要是手机mobile app API的分析。
他们主要面临以下问题:1.如何利用API日志更好地理解不同种类的用户,2.如何更好地理解用户与APP的交互 3. 如何对实时API请求进行分类和安全检测 3. 现有API日志数据量很大,现有数据分析团队缺乏大数据分析技能。
在与Pivotal合作后,我们为他们提供了以下解决方案:使用MADlib进行聚类分析,建立一个sessionization模型。建立一个scoring pipeline,对新的访问进行评估,使用visualization tool更好地呈现结果。
这次合作的商业影响也是非常显著的。首先,我们针对不同的分析师建立了多个用户类型分类,能够及时把某种特定类型的用户信息传到相应的分析师手上。其次建立了实时访问安全评分系统,对可疑访问进行及时处理,最后使用Greenplum + MADlib的形式,使得大数据的得到了更加充分的挖掘。
这个项目的数据源主要包括用户的api 访问日志和customer profile,涉及45天的访问情况,50亿行数据,百万级别的用户信息。平台依然是Greenplum,建模主要用到了MADlib, PLR, PL/PYTHON和PDLTools。PDLTools是Pivotal data science 的另一套数据科学包。可视化主要在Tableau上进行。
如图所示是整个建模的过程。由于篇幅关系在此不做详述。
案例总结
首先,在改良之前,用户虽然使用了Greenplum,但依然在R上对data sample进行分析,DCA闲置。改良后,用户使用Greenplum+MADlib对大数据集进行了更充分的分析。
第二,在改良前,用户没有建立起良好的用户分类体系,合作完成后,他们建立了两套模型对典型用户进行聚类分析,对用户群体和用户习惯有了更深入的了解,制定相应的营销策略。
第三,之前的model不能高效检测可疑的session,改良后,客户建立起了对可疑session实时评分体系。
最后,在合作之前,客户在评估是否转换到Teradata上,但是改良后,他们决定放弃Teradata,增加GREENPLUM cluster的数量,充分证明了Greenplum在数据分析方面的优秀表现。
总结与展望
通过使用MADlib,我们能够进行graph, clustering, regression, classification等统计和机器学习分析,此外,我们还有GPText进行文本分析,Geospatial进行地理空间分析。Greenplum也能很好地支持BI reporting tool,实现快速的数据可视化。我们的理念就是ALLIN ONE DATABASE,让分析变得更便捷和更高效。
我们很快将要发布版本1.13,在这个版本中,将会加入一些新的图形方面的算法,包括HITS和Graph cut,我们会支持mini-batching,加快计算的速度,同时,随着新版postgres 10的发布,我们也会加入对新版本的支持。
下一个版本发布是2.0,我们会有一些Interface方面的改动,算法方面,在图形方面会加入特征向量中心性,中间中心性等。SVM,我们会加入Multiclass,另外,我们会加入gradient boosted machines(GBM)做boosting。最后,我们会加入更多的utility function来预处理数据。
2018年,我们的开发重心会放在deep learning上,相信我们能为大家提供更多深度方面的支持。
上图是MADlib相关的resource,我们是全开源的,欢迎大家浏览或者和我们一起contribute,让MADlib越做越好。