Apache火花2.0预览版:机器学习模型持久性
介绍
考虑这些机器学习(ML)的用例:
- 数据科学家产生毫升模型和消息交给一个工程团队部署在生产环境中。
- 在Python中集成了一个工作流模型训练数据工程师与一个在Java服务工作流模型。
- 数据科学家创造就业机会训练许多毫升模型,保存和评估。
所有这些用例都容易与模型持久性、保存和加载模型的能力。即将发布的Apache 2.0火花火花的机器学习库MLlib将包括几乎完全支持毫升持久性DataFrame-based API。这篇文章给出了一个早期的概述,代码示例,一些细节MLlib的持久性API。
毫升持久性的关键特性包括:
- 支持所有语言api火花:Scala、Java、Python和R
- 支持几乎所有的ML算法DataFrame-based API
- 支持单一模型和完整的管道,都不适合(一个“配方”)和安装(结果)
- 分布式存储使用一个可交换的格式
感谢所有的社区贡献者帮助MLlib这个大的飞跃!看到jiraScala / Java,Python,R完整的列表的贡献者。
学习API
在Apache 2.0火花,DataFrame-based API为MLlib正在前排毫升火花。(见这之前的博文介绍这个API和“管道”的概念介绍)。这对于MLlib DataFrame-based API提供了保存和加载功能模型,模仿熟悉的火花数据源API。
我们将演示保存和加载模型在几种语言使用流行的手写数字识别MNIST数据集(勒存et al ., 1998;可以从LibSVM数据页面)。这个数据集包含手写数字0 - 9,加上地面实况标签。下面是一些例子:
我们的目标将是新的手写数字图像和识别数字。看到这个笔记本为完整的示例代码来加载这些数据,适合的模型,并保存和加载它们。
保存和加载模型
我们首先展示如何保存和加载单模型语言之间分享。我们将配合随机森林分类器使用Python,保存它,然后加载相同的模型使用Scala。
培训= sqlContext.read……#数据:功能,标签
射频= RandomForestClassifier (numTrees = 20)
模型= rf.fit(培训)
我们可以简单地调用保存
方法来拯救这个模型,负载
方法来加载它回来:
model.save (“myModelPath”)
sameModel = RandomForestClassificationModel.load (“myModelPath”)
我们还可以加载相同的模型(我们保存在Python)成一个Scala或Java应用程序:
/ /加载模型在Scala中
val sameModel = RandomForestClassificationModel.load (“myModelPath”)
这适用于小型本地模型如k - means模型(集群)和大型分布式模型如ALS模型(推荐)。加载模型具有相同的参数设置和数据,因此它将返回相同的预测即使加载到一个完全不同的火花部署。
保存和加载完整的管道
到目前为止,我们只看到了保存和加载一个毫升模型。毫升工作流包含许多阶段,在实践中,从特征提取和转换模型拟合和调优。MLlib提供管道来帮助用户构建这些工作流。
MLlib允许用户保存和加载整个管道。让我们来看看这是如何实现在一个管道与这些步骤:
- 特征提取:Binarizer将图像转换成黑白
- 模型拟合:随机森林分类器取图像和预测数字0 - 9
- 调优:交叉验证来优化森林中的树的深度
这里是我们的笔记本建立这个管道的一个片段:
/ /构建管道:Binarizer +随机森林
val管道=新管道()。setStages(数组(binarizer rf))
/ /包装管道CrossValidator模型调优。
val简历= new CrossValidator () .setEstimator(管道)…
符合这一管道之前,我们将展示我们可以拯救整个工作流(拟合前)。这个工作流可以加载后运行在另一个数据集,在另一个引发集群等。
cv.save (“myCVPath”)
val sameCV = CrossValidator.load (“myCVPath”)
最后,我们可以适应管道,再将其保存和加载它。这节省了特征提取步骤,通过交叉验证随机森林模型调整,统计数据模型调优。
val cvModel = cv.fit(培训)
cvModel.save (“myCVModelPath”)
val sameCVModel = CrossValidatorModel.load (“myCVModelPath”)
学习的细节
Python的调优
丢失物品的火花Python 2.0是调优。Python还不支持保存和加载CrossValidator TrainValidationSplit,用于优化模型hyperparameters;这个问题是针对火花2.1 (火星- 13786)。然而,它仍然有可能拯救CrossValidator和TrainValidationSplit Python的结果。例如,让我们使用交叉验证来调整一个随机森林然后保存最好的模型中发现调优。
定义工作流
射频= RandomForestClassifier ()
简历= CrossValidator(估计量=射频,…)
符合模型,交叉验证
cvModel = cv.fit (trainingData)
提取的结果,即。,the best Random Forest model
bestModel = cvModel.bestModel
保存RandomForest模型
bestModel.save (“rfModelPath”)
看到笔记本完整的代码。
可交换的存储格式
在内部,我们保存模型元数据和参数作为JSON数据作为镶木地板。这些存储格式是可交换的,可以使用其他图书馆阅读。拼花让我们存储小模型(如朴素贝叶斯分类)和大型分布式模型(肌萎缩性侧索硬化症等推荐)。数据集支持的存储路径可以是任何URI / DataFrame保存和加载,包括路径S3,本地存储等等。
语言的跨平台兼容性
模型可以很容易地保存和加载在Scala中,Java、Python。R有两个局限性。首先,并不是所有MLlib模型支持从R,所以不是所有的其他语言模型训练可以加载到R .其次,当前特定于R, R模型格式存储额外的数据使其有点出租汽车司机使用其他语言加载模型训练和保存在R(见附带的笔记本黑客。更好的跨语言支持R在不久的将来将被添加。
结论
随着即将到来的2.0版本,DataFrame-based MLlib API将提供几乎完全覆盖持久化模型和管道。坚持是至关重要的,团队之间共享模型,创建多语言毫升工作流和移动模型来生产。这个特性是准备的最后一块DataFrame-based MLlib API成为机器学习的主要API在Apache火花。
接下来是什么?
高优先级的项目包括完整的持久性覆盖,包括Python模型优化算法,以及改进的R和其他语言api之间的兼容性。
开始与本教程的笔记本在Scala中,Python。您也可以更新当前MLlib工作流使用保存和加载。
实验这个API使用Apache火花砖社区中的分支- 2.0预览版测试版。