机器学习库(MLlib)开发指南(1)
本文是翻译自官方文档,如有错误,欢迎指正。
原文 https://spark.apache.org/docs/latest/ml-guide.html
MLlib是spark的机器学习库,它的目标是使得实战机器学习变得易于扩展。在较高层次上,它提供了如下的工具
- 机器学习算法:通常的学习型算法,例如分类 ,回归,聚类以及协同过滤
- 特征处理:特征提取,转换,降维以及特征选择
- pipeline:用于构建,评估及调整ML pipeline的工具
- 持久化:保存及加载算法,模型及pipeline
- 工具类:线性代数,统计,数据绑定等等
声明:DataFrame-based api是主要api
MLlib RDD-based API 现在处于维护状态
在 Spark 2.0,在 spark.MLlib这个包下的 RDD-based APIs 已经进入维护状态。现在主要的 api 是位于 spark.ml 这从此包下面的 DataFrame-based API
这个声明的说明
- MLlib将仍然支持位于 spark.MLlib 下面的 RDD-based API,并提供错误修复
- MLlib将不再添加新的功能为RDD-based API
- 在Spark 2.x版本中,MLlib 将添加功能到 DataFrames-based API ,为了达到RDD-based API相同的功能
- 在达到相同的功能后(粗略估计到Spark 2.3),RDD-based API 将被废弃
- RDD-based API 预计在Spark 3.0时移除
为什么 MLlib要切换到DataFrame-based API
- DataFrames 提供了比RDD更加用户友好的API,DataFrames的许多好处包括Spark Datasources,SQL / DataFrame查询,Tungsten和Catalyst优化以及跨语言的统一API
- 基于DataFrame的ML API为ML算法和跨多种语言提供了统一的API。
- DataFrames有助于实际的ML Pipelines,特别是特征转换。
有关详细信息,请参阅Pipelines指南
什么是Spark ML
- Spark ML 不是一个官方的名称,但偶尔用于引用基于MLlib DataFrame的API。这主要是由于基于DataFrame的API使用的org.apache.spark.ml Scala软件包名称以及我们最初用于强调管道概念的“Spark ML Pipelines”术语。
MLlib被弃用
- 不,MLlib 包含 RDD-based API 和 DataFrame-based API。 RDD-based API 现在进入维护状态,但是MLlib是一个整体,API不会弃用。
依赖
MLlib使用线性代数包Breeze,它依赖数值处理优化包netlib-java。如果在运行时本地库不可用,你将看到一个警告消息,一个纯JVM实现将作为替换使用。
由于运行时专有二进制文件的许可问题,我们默认不包括netlib-java的代理。
要将netlib-java / Breeze配置为使用系统优化的二进制文件,请将com.github.fommil.netlib:all:1.1.2(或构建Spark with -Pnetlib-lgpl)作为项目的依赖项,并读取netlib-java文档
为您的平台的额外的安装说明。
要在Python中使用MLlib,您将需要NumPy 1.4或更高版本。
2.2版本中的亮点
下面的列表突出显示了在2.2版本的Spark中添加到MLlib的一些新功能和增强功能:
- 对用户或者物品进行topk推荐的ALS方法,与MLlib(SPARK-19535)中的功能相匹配。
ml和MLlib(SPARK-11968和SPARK-20587)的性能也得到改善 - Correlation and ChiSquareTest为DataFrames增加统计函数
- FPGrowth 算法 或者 frequent pattern mining (SPARK-14503)
- GLM现在支持完整的Tweedie系列(SPARK-18929)
- 在dataset中估计缺失值 通过特征变换
- LinearSVC 实现 svm(SPARK-14709)
- 逻辑回归现在支持训练过程中系数的约束
迁移指导
MLlib正在积极发展。标记为Experimental / DeveloperApi的API可能会在将来的版本中更改,下面的迁移指南将解释发行版之间的所有更改。
行为变化
- SPARK-19787:对于ALS.train方法(标记为DeveloperApi),regParam的默认值从1.0变为0.1。请注意,这不影响ALS估算器或模型,也不影响MLlib的ALS类。
- SPARK-14772:修复了Param.copy方法的Python和Scala API之间的不一致。
- SPARK-11569:StringIndexer现在处理NULL值的方式与未看到的值相同。以前,无论handleInvalid参数的设置如何,都会抛出异常。