Spark之MLlib

机器学习 spark  收藏
0 / 128

Spark 的 MLlib 机器学习库,它和 sklearn 有八九分相似,也是 Estimator,Transformer,Pipeline 那一套,各种 fit,transform 接口。sklearn 有多好学,MLlib 就有多好学,甚至 MLlib 还要更加简单一些,因为 MLlib 库中支持的功能相对更少一些,并且 MLlib 基于 DataFrame 数据比 sklearn 基于 numpy array 会更加直观一些。

那学了这个 MLlib 有啥子用呢?主要有以下三方面用处。

第一是对海量数据特征工程处理。如果有遇到需要对 50G 以上的数据进行 Tf-idf 特征提取,缺失值填充,特征筛选,最邻近查找等特征工程任务时,使用 Pandas 的同学可能要望洋兴叹了,这时候会使用 Spark MLlib 的同学就会露出迷之微笑。

第二是提供机器学习模型的候选 baseline。众所周知,目前工业界应用最主流的机器学习模型是 xgboost,lightgbm,以及深度学习那一套。遗憾的是,MLlib 原生并不带 xgboost 和 lightgbm,对深度学习的支持也不多。但 MLlib 提供非常丰富的基础模型诸如决策树,随机森林,梯度提升树,朴素贝叶斯等,这些简单易用的模型可以提供一个基本的 baseline。如果生产要求不是非常高的话,baseline 也是可以直接拿过来落地成产品的。

第三是为 xgboost,深度学习等模型提供超参优化模型评估等支持。

通过引入 XGBoost4J-Spark 库,Spark 上也是可以分布式跑 xgboost 的。通过引入 mmlspark 库,Spark 上也是可以分布式跑 lightgbm 的,通过引入 TensorflowOnSpark,Spark 上也是可以分布式跑 TensorFlow 的。而 MLlib 的超参调优和模型评估等功能无疑可以很好地和这些牛逼闪闪的框架很好地协作起来。

以上是一些 MLlib 常用的使用场景。

一,MLlib 基本介绍

MLlib 是 Spark 的机器学习库,包括以下主要功能。

  • 实用工具:线性代数,统计,数据处理等工具
  • 特征工程:特征提取,特征转换,特征选择
  • 常用算法:分类,回归,聚类,协同过滤,降维
  • 模型优化:模型评估,参数优化。

MLlib 库包括两个不同的部分。

spark.mllib 包含基于 rdd 的机器学习算法 API,目前不再更新,在 3.0 版本后将会丢弃,不建议使用。

spark.ml 包含基于 DataFrame 的机器学习算法 API,可以用来构建机器学习工作流 Pipeline,推荐使用。

二,MLlib 基本概念

  • DataFrame: MLlib 中数据的存储形式,其列可以存储特征向量,标签,以及原始的文本,图像。
  • Transformer:转换器。具有 transform 方法。通过附加一个或多个列将一个 DataFrame 转换成另外一个 DataFrame。
  • Estimator:估计器。具有 fit 方法。它接受一个 DataFrame 数据作为输入后经过训练,产生一个转换器 Transformer。
  • Pipeline:流水线。具有 setStages 方法。顺序将多个 Transformer 和 1 个 Estimator 串联起来,得到一个流水线模型。

三,Pipeline 流水线范例

任务描述:用逻辑回归模型预测句子中是否包括”spark“这个单词。

1,准备数据

2,构建模型

3,训练模型

4,使用模型

5,评估模型

6,保存模型

四,导入数据

可以使用 spark.read 导入 CSV,image,libsvm,txt 等格式数据。

五,特征工程

spark 的特征处理功能主要在 spark.ml.feature 模块中,包括以下一些功能。

  • 特征提取:Tf-idf, Word2Vec, CountVectorizer, FeatureHasher
  • 特征转换:OneHotEncoderEstimator, Normalizer, Imputer(缺失值填充), StandardScaler, MinMaxScaler, Tokenizer(构建词典),StopWordsRemover, SQLTransformer, Bucketizer, Interaction(交叉项), Binarizer(二值化), n-gram,……
  • 特征选择:VectorSlicer(向量切片), RFormula, ChiSqSelector(卡方检验)
  • LSH 转换:局部敏感哈希广泛用于海量数据中求最邻近,聚类等算法。

1,Word2Vec

Word2Vec 可以使用浅层神经网络提取文本中词的相似语义信息。

2,StandardScaler 正态标准化

3,Imputer 缺失值填充

4,SQLTransformer

可以使用 SQL 语法将 DataFrame 进行转换,等效于注册表的作用。

但它可以用于 Pipeline 中作为 Transformer。

5,ChiSqSelector

当 label 是离散值时,ChiSqSelector 选择器可以根据 Chi2 检验统计量筛选特征。

六,分类模型

Mllib 支持常见的机器学习分类模型:逻辑回归,SoftMax 回归,决策树,随机森林,梯度提升树,线性支持向量机,朴素贝叶斯,One-Vs-Rest,以及多层感知机模型。这些模型的接口使用方法基本大同小异,下面仅仅列举常用的决策树作为示范。更多范例参见官方文档。

此外,通过导入引入 XGBoost4J-Spark 库,也可以在 Spark 上运行 xgboost,此处也进行示范。

1,决策树

2,xgboost

spark 也可以使用 xgboost 模型,既可以进行分布式训练,也可以进行分布式预测,支持各种参数设置和 earlystopping。

支持模型保存,并且保存后的模型和 Python 等语言是可以相互调用的。

需要注意的是,输入 xgboost 的数据格式只能包含两列,features 和 label。

可以用 spark.ml.feature.VectorAssembler 将不同特征转换成一个 features 向量。

七,回归模型

Mllib 支持常见的回归模型,如线性回归,广义线性回归,决策树回归,随机森林回归,梯度提升树回归,生存回归,保序回归。

1,线性回归

2,决策树回归

八,聚类模型

Mllib 支持的聚类模型较少,主要有 K 均值聚类,高斯混合模型 GMM,以及二分的 K 均值,隐含狄利克雷分布 LDA 模型等。

1,K 均值聚类

2,高斯混合模型

九,降维模型

Mllib 中支持的降维模型只有主成分分析 PCA 算法。这个模型在 spark.ml.feature 中,通常作为特征预处理的一种技巧使用。

1,PCA 降维模型

十,模型优化

模型优化一般也称作模型选择(Model selection)或者超参调优(hyperparameter tuning)。

Mllib 支持网格搜索方法进行超参调优,相关函数在 spark.ml.tunning 模块中。

有两种使用网格搜索方法的模式,一种是通过交叉验证(cross-validation)方式进行使用,另外一种是通过留出法(hold-out)方法进行使用。

交叉验证模式使用的是 K-fold 交叉验证,将数据随机等分划分成 K 份,每次将一份作为验证集,其余作为训练集,根据 K 次验证集的平均结果来决定超参选取,计算成本较高,但是结果更加可靠。

而留出法只用将数据随机划分成训练集和验证集,仅根据验证集的单次结果决定超参选取,结果没有交叉验证可靠,但计算成本较低。

如果数据规模较大,一般选择留出法,如果数据规模较小,则应该选择交叉验证模式。

1,交叉验证模式

2,留出法模式