我们推荐您使用spark.ml,因为基于DataFrames的API更加的通用而且灵活。不过我们也会继续支持spark.mllib包。用户可以放心使用,spark.mllib还会持续地增加新的功能。不过开发者需要注意,如果新的算法能够适用于机器学习管道的概念,就应该将其放到spark.ml包中,如:特征提取器和转换器。
下面的列表列出了两个包的主要功能。
spark.mllib: 数据类型,算法以及工具
- Data types (数据类型)
- Basic statistics (基础统计)
- summary statistics (摘要统计)
- correlations (相关性)
- stratified sampling (分层抽样)
- hypothesis testing (假设检验)
- streaming significance testing
- random data generation (随机数据生成)
- Classification and regression (分类和回归)
- linear models (SVMs, logistic regression, linear regression) (线性模型(SVM,逻辑回归,线性回归))
- naive Bayes (朴素贝叶斯)
- decision trees (决策树)
- ensembles of trees (Random Forests and Gradient-Boosted Trees) (树套装(随机森林和梯度提升决策树))
- isotonic regression (保序回归)
- Collaborative filtering (协同过滤)
- alternating least squares (ALS) (交替最小二乘(ALS))
- Clustering (聚类)
- k-means (K-均值)
- Gaussian mixture (高斯混合)
- power iteration clustering (PIC) (幂迭代聚类(PIC))
- latent Dirichlet allocation (LDA) (隐含狄利克雷分配)
- bisecting k-means (平分K-均值)
- streaming k-means (流式K-均值)
- Dimensionality reduction (降维)
- singular value decomposition (SVD) (奇异值分解(SVD))
- principal component analysis (PCA) (主成分分析(PCA))
- Feature extraction and transformation (特征抽取和转换)
- Frequent pattern mining (频繁模式挖掘)
- FP-growth (FP-增长)
- association rules (关联规则)
- PrefixSpan (PrefixSpan)
- Evaluation metrics (评价指标)
- PMML model export (PMML模型导出)
- Optimization (developer) (优化(开发者))
- stochastic gradient descent (随机梯度下降)
- limited-memory BFGS (L-BFGS) (有限的记忆BFGS(L-BFGS))
spark.ml: 机器学习管道高级API
- Overview: estimators, transformers and pipelines (概览:评估器,转换器和管道)
- Extracting, transforming and selecting features (抽取,转换和选取特征)
- Classification and regression (分类和回归)
- Clustering (聚类)
- Advanced topics (高级主题)
虽然还有些降维技术在spark.ml中尚不可用,不过用户可以将spark.mllib中的的相关实现和spark.ml中的算法无缝地结合起来。
依赖项
MLlib使用的线性代数代码包是 Breeze ,而 Breeze 又依赖于 netlib-java 优化的数值处理。如果在运行时环境中这些原生库不可用,你将会收到一条警告,而后spark会使用纯JVM实现来替代之。
由于许可限制的原因,spark在默认情况下不会包含netlib-java的原生代理库。如果需要配置netlib-java/Breeze使用其系统优化库,你需要添加依赖项:com.github.fommil.netlib:all:1.1.2(或者在编译时加上参数:-Pnetlib-lgpl),然后再看一看 netlib-java相应的安装文档。
要使用MLlib的Python接口,你需要安装 NumPy 1.4以上的版本。
迁移指南
MLlib目前还在积极的开发当中。所以标记为 Experimental / DeveloperApi 的接口可能在未来发生变化,下面的迁移指南说明了版本升级后的变化。
从1.5升级到1.6
从1.5到1.6,spark.mllib 和 spark.ml 包中并没有重大的API变化,不过有一些行为不再支持或者发生变化。
已经废弃:
- SPARK-11358 : spark.mllib.clustering.KMeans 的runs参数已经废弃
- SPARK-10592 : spark.ml.classification.LogisticRegressionModel和spark.ml.regresion.LinearRegressionModel 中,weights字段改名为coefficients。这一变动有助于消除歧义,可以和输入给算法的实例(行)权重(weights)区分开来。
行为有变:
- SPARK-7770 :
spark.mllib.tree.GradientBoostedTrees
:validationTol
的语义在1.6中有变。原先其代表误差变化绝对值的一个阈值,而现在它类似于GradientDescent中的convergenceTol:对于较大的误差,使用相对误差(相对于上一次);而对于较小的误差(<0.01),使用绝对误差。
- SPARK-11069 : spark.ml.feature.RegexTokenizer:以前,在分词之前不会讲字符串转小写。现在的实现是,默认会将字符串转小写,不过有选项可以设为不转。这中实现和
Tokenizer
transformer的行为相匹配。
Spark老版本
以前版本的迁移指南归档在这里: on this page
- 要了解更多有关系统优化的好处和背景资料,可以看看Sam Halliday关于ScalaX的演讲: High Performance Linear Algebra in Scala