人类经历了从农业革命到工业革命,再到信息革命。信息革命,起源于互联网的诞生,它将会经历三个阶段的跃迁。第一阶段,人与人的连接(网络的雏形),比如:Facebook;第二个阶段,让人们生活更便捷(移动互联网、物联网);第三个阶段,让人们生活更智能(机器人,无人汽车等)。机器学习作为人工智能的一个分支,它更注重解决实际问题,所以,得到工业界的大力推广,目前已经应用于多个领域,比如个性化推荐,金融反作弊等。
目前,spark提供两套算法库,分别是:mllib和ml。其中,Mllib是基于spark 原生RDD开发,从学习的角度来看,只要你有机器学习基础,熟悉api就可以很容易上手。但是,构建机器学习系统是一个复杂的过程,从原始数据的清洗、解析,再到特征的提取,模型的构建,模型的优化,是一个循环迭代的过程。尤其是,多模型的融合,基于mllib编写的代码不易维护,迭代速度减慢。所以,Spark开发者,受到目前优秀的python机器学习库—scikit-learn 的启发,从Spark 1.2版本以后,开始基于DataFrame,开发一套高级的api,将构建机器学习系统,做成一个流水线 Pipeline。一个Pipeline由多个PipelineStage构成,每个PipelineStage完成一个任务。
熟悉Spark SQL的都了解,sparkSQL的核心 DataFrame+Schema。那么为什么ML会采用DataFrame作为基础的存储结构,个人认为,有两个原因:1.数据处理的本质是,做数学集合操作,DataFrame是类似传统数据库的二维表格,操作方便。Spark SQL 已经可以支持多种数据类型的操作,这样可以很好的和机器学习融合。对于机器学习前期的准备工作,数据预处理、清洗、数据分析很方便。2.构建pipeline机器学习工作流,多工程师、多数据科学家可以更好的协作。DataFrame可以保存清洗完毕的数据、提取的特征数据、各个训练模型。协作更方便,更容易迭代、优化模型,尝试更多的模型算法。
它的字面意思,就是转换的意思,比如,可以把一个不含有预测标签的“测试数据集”(dataframe)转换为包含预测标签的数据集(dataframe)。一般,就是为DataFrame添加一列或者多列,它是一个PipelineStage。
它是一个抽象的概念,其实,就是一个机器学习算法在数据上fit或者train的过程。Estimator实现了一个fit函数,fit()函数接收 Dataframe 产生一个Model。比如:LR算法就是一个Estimator,它可以通过fit()函数产生一个LR模型。它是一个模型,因此也是一个Transformer。
Transformer和Estimator中的参数,是公用一套api。这个就是由Parameter共同提供。
构建一个机器学习工作流,首先要设计各个pipelineStage的处理逻辑,也就是任务的切分。比如,数据的清洗、特征的抽取等,然后,有序的组织各个pipelineStage,这样就创建了一个pipeline。
数据集来自stackoverflow公开的数据集,内容为stackoverflow网站上帖子的数据,格式为XML格式。
通过本例可以了解ML Pipeline的工作流程,对于刚接触spark 机器学习的读者,建议先从MLlib学起,MLlib是基于原生的RDD,相对好理解,也容易上手。对于已经熟悉MLlib的读者,构建复杂机器学习系统时,尝试ML Pipeline ,因为它集成了从数据清洗,到特征抽取,再到模型训练,模型保存的各个组件,结构和逻辑很清晰,也有利于算法模型工程师和ETL工程师的更好协作。