一、Alink介绍
(一)整体介绍
什么是Alink?
Alink是基于Flink的机器学习算法平台
1) 由阿里巴巴计算平台事业部PAI团队研发;
2) 同时支持批式/流式算法,提供丰富的算法库;
3) 帮助数据分析和应用开发人员能够从数据处理、特征工程、模型训练、预测,端到端地完成整个流程。
相关名称的公共部分
Alibaba,Algorithm,AI,Flink,Blink
(二)和SparkML对比
SparkML是目前市面上使用较为广泛的机器学习的库,下面从性能和功能两个方面对Alink与SparkML进行比较。
1、性能对比
Alink与SparkML性能对比图
上图为开源Alink与SparkML算法运行时间对比,纵坐标为各类算法,横坐标为运行同一算法时,SparkML相较开源Alink所花费的时间倍数。由上图可看出,在大多数情况下,开源Alink比SparkML效率更高。
2.功能对比
Alink与SparkML功能对比图
由上图可知,Alink拥有SparkML支持的大多数功能。在此基础上,Alink还支持流式算法、批流混跑、在线学习与中文分词等SparkML不具备的功能,Alink功能种类更丰富与齐全。
(三)算法调用方式
1.Link
Link是批式/流式算法通用的串联方式。
下方为三个Alink搭建的实验:批示实验,流式实验,批流混合实验。
批式实验(Batch Experiment)
流式实验(Stream Experiment)
流批混合实验(Batch-Stream Mixed Experiment)
2. Python 脚本调用Alink算法
除了用Web的方式,还可以用写脚本的方式调用Alink,用脚本完成机器学习的训练与预测,Demo如下:
二、Alink 推荐 Demo
(一)基于 Alink 推荐算法
线上服务流程图
在线上服务的时候,首先需要召回有用数据,例如真实用户关心的商品,或者相近的商品数据,然后针对商品做特征拼接,接着进行特征编码,最后通过排序算法得出结果,将排序比较靠前的推荐给用户。
针对线上服务流程,Alink能提供什么帮助?如下图所示:
针对线上服务,在离线模型中,Alink对召回、特征拼接、特征编码、排序等流程对应提供了多种算法。在线模型中,Alink支持在线学习,实时训练模型,不断将模型部署到线上,实现模型更高更快时效性。
(二)影片推荐Demo
接下来,以影片推荐Demo为例介绍一下算法的使用。
1.数据集介绍
我们在Moivelens网站上采集了不同时间段的电影观众的评分,做出了以下数据集:
如上图所示,这个数据集包括了User的ID,Movie的ID,还有观众的打分。下面针对这个数据集,我们来看Alink算法是如何实现对电影的推荐。
2.ALS训练模型(ALS model training)
ALS训练模型脚本Demo
上图为ALS训练模型的脚本Demo。得到一个数据集后,它会Link ALS的训练算法,在算法里面设置User、Item还有Rating列名,然后设置一些参数,包括Lambda,Rank,NumIter。
下面第二个Link是将它写到对应的目录中,这个目录可以是本地的环境目录,也可以是网络文件的目录,Alink都是支持的。然后加上执行代码后,脚本就可以直接执行。
训练完数据集Train_set对应的模型后,最后写到对应的目录中,以上就是ALS训练模型的一个简单脚本。
3. 使用ALS模型求TOPK的电影(topK movie with ALS model)
下面解析ALS模型如何实现对电影进行求TOPK。
使用ALS模型求TOPK的电影
通过上图脚本可以看到,首先通过创建一个Pipeline Model,然后ALS模型通过Source组件将它读取,设置到Pipeline对象中。接着设置User的列,设置Top的数量(如Top10),然后设置推荐的列名,最后通过Transform就可以得到推荐电影数据,推荐数据如下:
例如对43号电影,这边推荐了与它最相近的10部电影与相应的打分。
4. 使用ALS模型对电影打分(Rating movie with ALS model)
ALS实现电影打分Demo
如何得到每位观影的User对所看电影的打分数据。通过上图可以看到,这里使用的方法与之前类似,首先建一个Pipeline Model,然后设置打分组件,接着设置User、Item、Recomm的列,最后设置ALS模型,完成模型录入。
第二个组件KeyToValue,它将电影的ID对应到电影的名字。
通过上述两个组件,可以得到用户和用户对电影打分的结果。例如下图,是用户1对各个电影的打分情况Rating以及系统推荐的分数Recomm。
打分之后希望看到打分效果,于是接了评估组件EvalRegressionBatchOp,如下图所示:
EvalRegressionBatchOp组件相当于将打分结果跟真实结果做一个回归对比,下方是它的一个MSE和RNSE的结果,可以看到用ALS对数据进行打分的话,效果十分不错。
5.基于物品的协同过滤——模型训练
接下来介绍基于物品的协同过滤算法训练模型,调用方式与ALS类似,Demo如下:
首先在脚本中设置对应的模型与参数,然后linkFrom对应的打分数据,接着将它放到Pipeline Model,最终执行就完成了。这样数据对应的模型渲染出来,并将它存到对应的pipeline_model.ak中。
6. 基于物品的协同过滤——推荐预测
如果有这个模型,如何用它来做推荐预测?
如上图左边所示,首先用Pipeline_lodel可以Load函数,然后给出对应的文件路径。这样的话就将模型Load到内存中,然后Transform就可以将对应的数据集进行推理预测。右边为输出结果。
7.基于物品的协同过滤——Java/Python LocalPredictor预测
训练模型最终要部署到线上,这边提供了LocalPredictor机制,它支持Java与Python接口。在Java或Python环境下,直接通过LocalPredictor就加载模型,然后模型可以通过Map函数完成推理的操作。有了Python和Java这两个接口,我们可以在相应的环境下部署想要的一些服务。
(三)Click-Through Rate Prediction DEMO
在网络广告中,点击率(CTR)是衡量广告效果的一个非常重要的指标。因此,点击预测系统在赞助搜索和实时竞价中具有重要的应用价值。该Demo 使用 FTRL方法实时训练分类模型,并使用模型进行实时预测评估,展现了在线学习的能力。
上图为一个经典的数据集,有一些是字符串,有些特征是对应的数值性。
如何针对这个数据集去做在线学习呢?
在线学习流程图
该流程存在四个问题:
1)如何进行特征建模?
2)如何训练初始模型?
3)如何进行在线训练和预测?
4)如何对结果进行评估?
1.如何进行特征建模?
上图为脚本Demo,首先对原始数据做标准化操作,然后对这数据链做了一标准化操作,之后通过FeatureHash将它映射到数组中,生成一个Pipeline,Fit将整个数据相进行特征工程训练,训练出模型。
2.如何训练初始模型?
FTRL本质上是Online的逻辑回归,初始模型调了逻辑回归组件,通过设置参数,以LinkFrom方式对数据训练,最终完成初始模型的训练。
3.如何进行在线训练和预测?
在线训练和预测主要分为三步,第一是准备流数据,第二是FTRL算法实时更新模型,第三是对实时数据进行预测,对应Demo如下:
准备流数据
FTRL算法实时更新模型
对实时数据进行预测
4.如何对结果进行评估?
如上图所示,得到模型之后,希望对模型进行评估。
通过 EvalBinaryClassStreamOp组件,就可以完成对模型的评估操作。上图下方为得到的评估指标,可以根据相应的信息去考虑这个模型是否要部署到线上。
(四)Web Demo
上方为脚本的方式,这边用Web的方式也可以实现这样的操作,操作流程图如下:
Alink支持大屏显示,实时结果写一个数据库中,大屏会实时读取数据库的数据进行展示,如下图所示:
图上方为评估结果,下方为AUC曲线和准确率曲线。
我们也可以直接对模型进行评估,而不是预测,如下图所示:
当FTRL训练完模型,会有一个实时的评估组件,组件对模型进行评估。这里要注意的是,两个特征工程调用的是同一个特征模型。
FTRL模型过滤参数配置
(分享人:赵伟波)
欢迎加入机器学习PAI钉钉群交流!