欢迎关注Hadoop、Spark、Flink、Hive、Hbase、Flume等大数据资料分享微信公共账号:iteblog_hadoop
  1. 文章总数:961
  2. 浏览总数:11,487,995
  3. 评论:3873
  4. 分类目录:103 个
  5. 注册用户数:5844
  6. 最后更新:2018年10月17日
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
iteblog_hadoop
大数据技术博客公众号bigdata_ai
大数据猿:
bigdata_ai

Apache Spark 2.0预览: 机器学习模型持久化

  在即将发布的Apache Spark 2.0中将会提供机器学习模型持久化能力。机器学习模型持久化(机器学习模型的保存和加载)使得以下三类机器学习场景变得容易:

  1、数据科学家开发ML模型并移交给工程师团队在生产环境中发布;
  2、数据工程师把一个Python语言开发的机器学习模型训练工作流集成到一个Java语言开发的机器学习服务工作流;
  3、数据科学家创建多个训练ML模型的作业,稍后需要保存和评估。

  Spark MLlib将提供基于DataFrame的API来支持ML持久化。后面将分三部分介绍:概要、代码实例和MLlib持久化API一些小细节。

概要

  ML持久化关键特色:

  1、支持Spark原有的多种开发语言:Scala、Java和Python & R;
  2、基于DataFrame的API几乎支持所有的ML算法;
  3、支持单个ML模型和多管道ML模型;
  4、使用可转换格式分布式保存机器学习模型

学学API

  在Apache Spark 2.0中,机器学习组件MLlib提供基于DataFrame的API,可实现类似于Spark数据源API的保存和载入功能,见以前的文章。

  作者使用经典的机器学习例子(手写数字识别,使用MNIST数据库,MNIST数据库包含0到9的手写数字和标注标记数据)来证实ML模型保存和加载功能。作者取其它手写数字并鉴别数字是几,完整例子代码见notebook:加载数据、训练模型和保存以及加载模型。

保存和加载单模型

  首先展示如何使用不同编程语言保存和加载同一单模型。作者使用Python训练和保存随机森林分类器模型,然后使用Scala来加载同一个ML模型回来。

training = sqlContext.read...  # data: features, label
rf = RandomForestClassifier(numTrees=20)
model = rf.fit(training)

可以简单的调用save方法来保存上面训练好的ML模型,然后使用load方法再加载回来。

model.save("myModelPath")
sameModel = RandomForestClassificationModel.load("myModelPath")

这里也可以加载刚才同一个ML模型(使用Python保存)进入Scala或者Java应用。

// Load the model in Scala
val sameModel = RandomForestClassificationModel.load("myModelPath")

这个工作既可以对小数据量、局部模型(比如,常见的分类模型K-Means)适用,也可以对海量数据、分布式模型(比如,常见的推荐模型ALS)。刚加载的模型都包含有相同的参数设置和训练数据,所以即使在不同的Spark部署加载同一个模型也会得到相同的预测结果。

保存和加载多管道模型

  前面仅仅描述来保存和加载单个ML模型,而实际应用中,ML工作流包含多阶段:从特征提取和转化到模型拟合和优化。MLlib会提供Pipeline来辅助使用者来构建这些工作流。

  MLlib提供使用者保存和加载整个Pipeline。下面来看下如何来实现:

  1、特征提取:图像数据二值化为0和1(黑和白);
  2、模型拟合:随即森林分类器读取图像数据并预测数字0到9;
  3、优化结果:交叉验证来优化树的深度。
看下代码:

// Construct the Pipeline: Binarizer + Random Forest
val pipeline = new Pipeline().setStages(Array(binarizer, rf))
 
// Wrap the Pipeline in CrossValidator to do model tuning.
val cv = new CrossValidator().setEstimator(pipeline) ...

在这个管道拟合模型前先来展示我们如何保存整个ML工作流。这个工作流将在其它Spark集群后续被加载。

cv.save("myCVPath")
val sameCV = CrossValidator.load("myCVPath")

最后,我们拟合模型管道,保存管道,并在以后进行加载。下面保存了特征抽取、随机森林模型交叉验证的优化以及模型优化对应的统计数据。

val cvModel = cv.fit(training)
cvModel.save("myCVModelPath")
val sameCVModel = CrossValidatorModel.load("myCVModelPath")

细节知识点

Python优化

  在Spark 2.0中并没有提供Python优化功能,Python不支持保存和加载CrossValidator和TrainValidationSplit来做模型超参数优化,这个功能将在Spark 2.1中实现(SPARK-13786)。但是Python还是可以保存CrossValidator和TrainValidationSplit的结果。例如,我们可以使用Cross-Validation优化随机森林模型并保存调试好的优化模型。

# Define the workflow
rf = RandomForestClassifier()
cv = CrossValidator(estimator=rf, ...)
# Fit the model, running Cross-Validation
cvModel = cv.fit(trainingData)
# Extract the results, i.e., the best Random Forest model
bestModel = cvModel.bestModel
# Save the RandomForest model
bestModel.save("rfModelPath")

可转换的存储格式

  本质上,我们把模型元数据和参数存储为JSON,数据集存储成Parquet。这些存储格式是可转换的,并且也能被其它开发库读取。Parquet文件允许使用者存储小模型(比如,贝叶斯分类)和分布式模型(比如,ALS)。存储路径可以是任意Dataset/DataFrame支持的URI,比如S3、本地存储等。

跨语言兼容性

  机器学习模型可以在Scala、Java和Python & R间任意存储和加载。但R语言有两个局限性:第一,不是所有MLlib模型都支持R语言,所以不是所有的使用其它语言训练的模型能被R语言加载;第二,使用R独有的方式的R模型格式存储不易被其它语言使用。

结论

  随着Spark 2.0的即将发布,基于DataFrame的MLlib API将会提供几乎完善的模型和机器学习管道持久化。机器学习模型持久化在团队间合作、多编程语言ML工作流以及迁移模型到生产环境方面相当重要。基于DataFrame的MLlib API也将最终会成为Spark在机器学习方面主要的API。

本博客文章除特别声明,全部都是原创!
转载本文请加上:转载自过往记忆(https://www.iteblog.com/)
本文链接: 【Apache Spark 2.0预览: 机器学习模型持久化】(https://www.iteblog.com/archives/1685.html)
喜欢 (3)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!
(3)个小伙伴在吐槽
  1. 你好,我想请问下spark1.6支持hive2的plsql吗?
    Aaron2016-06-22 15:56 回复
  2. 希望早点出来正式版
    ChisenZhang2016-06-17 11:12 回复
    • 有的等了
      w3970907702016-06-17 11:34 回复