云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

香港服务器_服务器linux_怎么样

小七 141 0

在PySpark中开发自定义机器学习算法

在PySpark中开发定制机器学习(ML)算法apachespark的pythonapi是一项挑战性的工作。在这篇博客文章中,我们描述了我们改进PySpark api以简化定制算法开发的工作。我们的关键改进将数百行用于持久性(保存和加载模型)的样板代码减少到一行代码。这些更改预计将在下一个apachespark版本中提供。背景:PySpark开发人员api近年来,Python已经成为全球数据科学家最流行的语言,有超过一百万的开发人员参与了数千个开源ML项目。尽管Python非常受欢迎,apachespark MLlib的开发人员api仍然以Scala为主,所有算法首先在Scala中实现,然后通过包装器在Python中提供。因此,数据科学家很难在不编写Scala代码的情况下用Python开发ML算法。这篇博客文章介绍了PySpark的一些改进,这些改进有助于使用Python开发定制ML算法和第三方ML包。在介绍了MLlib中的主要算法api之后,我们讨论了在PySpark之上构建自定义ML算法的当前挑战。然后,我们将描述我们对PySpark的关键改进,以简化这种定制。MLlib算法在讨论PySpark的具体更改之前,先了解一下Spark中ML算法的主要api。有两种主要的算法:变压器和估计器。Transformers是一种算法,它获取输入数据集并通过transform()函数对其进行修改以生成输出数据集。例如,Binarizer从数据集中读取要素值的输入列,然后根据对原始要素的阈值化,输出一个包含0/1要素的新列的数据集。估计器是ML算法,它获取训练数据集,使用fit()函数训练ML模型,然后输出该模型。该模型本身就是一个转换器;对于模型,调用transform()将通过添加新的预测列来"转换"数据集。常用的估计量例子是Logistic回归和随机森林。用户通常将多个转换器和估计器组合到一个数据分析工作流中。ML管道为链接算法提供了一个API,将每个算法的输出输入到以下算法中。有关这些类型算法的更多详细信息,请查看Databricks文档。下面,我们将展示一个简单的管道,其中包含2个特征变换器(Tokenizer,HashingTF)和1个估计器(logisticReturnation),它们来自MLlib管道指南。障碍:ML持续性假设一个数据科学家想要扩展PySpark以包含他们自己的自定义转换器或估计器。首先,数据科学家编写一个扩展Transformer或Estimator的类,然后在Python中实现相应的transform()或fit()方法。在简单的情况下,这个实现很简单。例如,许多特性转换器可以通过使用一个简单的用户定义函数来向输入数据帧添加一个新列来实现。然而,MLlib中的一个关键功能是ML持久性。持久性允许用户将模型和管道保存到稳定的存储中,以便以后加载和重用,或者传递给另一个团队。API很简单;下面的代码片段适合使用CrossValidator进行参数调整的模型,保存拟合的模型,然后将其加载回:val cvModel=等速配合(培训)cvModel.save("myCVModelPath")val sameCVModel=CrossValidatorModel.load("myCVModelPath")mlpersistence将模型和管道保存为JSON元数据+Parquet模型数据,它可以用于跨Spark集群、部署和团队传输模型和管道。有关持久性的信息,请参阅我们的博客文章和网络研讨会。传统上,添加对ML持久性的支持需要Scala实现。到目前为止,实现持久性的最简单方法需要数据科学家在Scala中实现该算法并编写Python包装器。在Scala中实现该算法需要同时掌握两种语言,理解javapython通信接口,并用这两种语言编写重复的api。解决方案:Python持久性mixin为了支持ML算法的Python实现,我们在pysparkapi中实现了一个类似于scalaapi的持久性框架。有了这个框架,在Python中实现定制的转换器或估计器时,就不再需要在Scala中实现底层算法了。相反,可以使用mixin类和定制的转换器或估计器来实现持久性。对于所有参数都是JSON可序列化的简单算法(简单类型如string、float),algorithm类可以扩展类DefaultParamsReadable和DefaultParamsWritable(SPARK-21542;Github上的代码)以启用自动持久性。(如果您不熟悉ML管道中的Params,它们是指定算法选项或属性的标准化方法。更多信息请参考MLlib指南的Param部分。)持久性的默认实现将允许在PySpark中保存和加载自定义算法。这些mixin极大地减少了在PySpark上创建自定义ML算法所需的开发工作量。过去需要许多行额外代码的持久性功能现在在许多情况下可以在一行中完成。下面的代码片段演示了使用Scala实现和Python包装器持久化算法的代码长度:这个代码片段演示了如何将这些mixin用于只使用Python实现持久性:类MyShiftTransformer(UnaryTransformer、DefaultParamsReadable、DefaultParamsWritable):将mixins DefaultParamsReadable和DefaultParamsWritable添加到MyShiftTransformer类中可以消除大量代码。对于参数或数据不可JSON序列化的复杂算法(复杂类型,如DataFrame),开发人员可以用Python编写自定义save()和load()方法。以前,即使实现了save()和load(),定制的Python实现也不能保存在ML管道中。我们的修复(SPARK-17025)纠正了这个问题,允许定制Python算法与MLlib的其余部分顺利集成。期待有了这些改进,开发人员很快就可以用Python编写定制的机器学习算法,在管道中使用它们,并且可以在不接触Scala的情况下保存和加载它们。我们相信这将解除许多开发人员的障碍,并鼓励进一步努力为机器学习开发以Python为中心的Spark包。免费试用Databricks。今天就开始吧