首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 ML Pipeline 构建机器学习工作流(1)

使用 ML Pipeline 构建机器学习工作流(1)

引言使用机器学习 (Machine Learning) 技术和方法来解决实际问题,已经被成功应用到多个领域,我们经常能够看到的实例有个性推荐系统,金融反欺诈,自然语言处理和机器翻译,模式识别,智能控制等。一个典型的机器学习机器学习过程通常会包含:源数据 ETL,数据预处理,指标提取,模型训练与交叉验证,新数据预测等。我们可以看到这是一个包含多个步骤的流水线式工作,也就是说数据从收集开始,要经历多个步骤,才能得到我们需要的输出。在已经向大家介绍了 Spark MLlib 机器学习库, 虽然 MLlib 已经足够简单易用,但是如果目标数据集结构复杂需要多次处理,或者是对新数据进行预测的时候需要结合多个已经训练好的单个模型进行综合预测 (集成学习的思想),那么使用 MLlib 将会让程序结构复杂,难于理解和实现。值得庆幸的是,在 Spark 的生态系统里,一个可以用于构建复杂机器学习工作流应用的新库已经出现了,它就是 Spark 1.2 版本之后引入的 ML Pipeline,经过几个版本的发展,截止目前的 1.5.1 版本已经变得足够稳定易用了。本文将向读者详细地介绍 Spark ML Pipeline 的设计思想和基本概念,以及如何使用 ML Pipeline 提供的 API 库编写一个解决分类预测问题的 Pipeline 式应用程序。相信通过本文的学习,读者可以较为深入的理解 ML Pipeline,进而将它推广和应用到更多复杂问题的解决方案上去。
关于 ML PipelineSpark ML Pipeline 的出现,是受到了  项目的启发,并且总结了 MLlib 在处理复杂机器学习问题上的弊端,旨在向用户提供基于 DataFrame 之上的更加高层次的 API 库,以更加方便的构建复杂的机器学习工作流式应用。一个 Pipeline 在结构上会包含一个或多个 PipelineStage,每一个 PipelineStage 都会完成一个任务,如数据集处理转化,模型训练,参数设置或数据预测等,这样的 PipelineStage 在 ML 里按照处理问题类型的不同都有相应的定义和实现。接下来,我们先来了解几个重要概念。
  • DataFrame
关于 DataFrame 其实我们已经在介绍过了,它较之 RDD,包含了 schema 信息,更类似传统数据库中的二维表格。它被 ML Pipeline 用来存储源数据。
DataFrame 可以被用来保存各种类型的数据,如我们可以把特征向量存储在 DataFrame 的一列中,这样用起来是非常方便的。
  • Transformer
Transformer 中文可以被翻译成转换器,是一个 PipelineStage,实现上也是继承自 PipelineStage 类,主要是用来把 一个 DataFrame 转换成另一个 DataFrame,比如一个模型就是一个 Transformer,因为它可以把 一个不包含预测标签的测试数据集 DataFrame 打上标签转化成另一个包含预测标签的 DataFrame,显然这样的结果集可以被用来做分析结果的可视化。
  • Estimator
Estimator 中文可以被翻译成评估器或适配器,在 Pipeline 里通常是被用来操作 DataFrame 数据并生产一个 Transformer,如一个随机森林算法就是一个 Estimator,因为它可以通过训练特征数据而得到一个随机森林模型。实现上 Estimator 也是继承自 PipelineStage 类。
  • Parameter
Parameter 被用来设置 Transformer 或者 Estimator 的参数。
要构建一个 Pipeline,首先我们需要定义 Pipeline 中的各个 PipelineStage,如指标提取和转换模型训练等。有了这些处理特定问题的 Transformer 和 Estimator,我们就可以按照具体的处理逻辑来有序的组织 PipelineStages 并创建一个 Pipeline,如 val pipeline = new Pipeline().setStages(Array(stage1,stage2,stage3,…))。然后就可以把训练数据集作为入参并调用 Pipelin 实例的 fit 方法来开始以流的方式来处理源训练数据,这个调用会返回一个 PipelineModel 类实例,进而被用来预测测试数据的标签,它是一个 Transformer。
随机森林及 ML 的实现随机森林构建于决策树之上,顾名思义,就是随机的构建一个包含多个决策树的森林。随机森林里的决策树之间是独立的,在随机森林模型构建好以后,对于新来的测试样本数据,随机森林模型会让其中的每个决策树分别做一次预测,然后统计出现此处最多的预测标签,并将它作为最终的预测标签。随机森林算法运用的就是集成学习的思想,在实践中,随机森林往往都有很好表现,并且多次预测结果稳定并且精度非常高,也不容易出现过拟合的问题。也是笔者最喜欢并且最常用的一种机器学习算法。
本文并不会重点介绍随机森林的基本理论,因为网上这样的文章已经很多了,本文将把重点放在对 Spark ML 中随机森林的实现以及可调参数的介绍。关于随机森林算法的详细介绍大家可以参考维基百科上的。
Spark ML 中随机森林实现是在 RandomForestClassifier 类中,位于 org.apache.spark.ml. classification 包中,该实现中支持设置的主要参数如下:
  • featuresCol
训练数据集 DataFrame 中存储特征数据的列名。
  • labelCol
标签列的名称。
  • impurity
树节点选择的不纯度的衡量指标,取值可以是”entroy”或“gini”, 默认是”gini”。
  • maxBins
离散连续性变量时最大的分箱数,默认是 32。理论上箱数越大粒度就越细,但是针对特定的数据集总有一个合理的箱数。
  • maxDepth
树的最大深度,默认值是 5。
  • numTrees
随机森林需要训练的树的个数,默认值是 20。
  • predictionCol
算法预测结果的存储列的名称, 默认是”prediction”。
  • rawPredictionCol
原始的算法预测结果的存储列的名称, 默认是”rawPrediction”
  • probabilityCol
类别预测结果的条件概率值存储列的名称, 默认值是”probability”
在后文中大家可以看到如何在程序中设置这些参数。可以调用 RandomForestClassifier.setXXX 方法或者在 ParamMap 里设定参数,然后再调用 RandomForestClassifier.fit 方法时传入 ParamMap 实例,如:


RandomForestClassifier 的 fit 方法从源头上来讲,是来自 Predictor 类 (Estimator 的子类),Predictor 类的 fit 方法设计和实现上实际上是采用了模板方法的设计模式,具体会调用实现类的 train 方法
图 1. Predictor 类的 fit 方法实现预览 所以对于 RandomForestClassifier 类我们最需要关注的就是 train 方法,其中包含具体从源数据 DataFrame 训练一个随机森林模型的过程。train 方法在提取出 DataFrame 数据集中的 label 和 features 数据之后,进一步调用 RandomForest.run 方法去真正的开始训练随机森林模型,训练结束后会返回一个 RandomForestClassificationModel 类实例,这是一个 Transformer,会被用来预测测试数据集。
图 2. RandomForestClassifier 类的 train 方法实现预览对于 RandomForest 类的 run 方法的具体实现逻辑,已经在 developerWorks 的 一文中有详细介绍,为了避免内容冲突,本文的内容将重点放在 ML Pipeline 的实现层次关系上,在这里不做赘述。
返回列表