Spark大数据商业实战三部曲:内核解密、商业案例、性能调优(第2版)
上QQ阅读APP看书,第一时间看更新

2.5 Spark 2.4 MLlib

Spark 2.2版本中新增了基于DataFrame的机器学习;Spark 2.2对R语言的机器学习新增了更多算法的支持,如Random Forest(随机森林)、Gaussian Mixture Model(高斯混合模型)、Naive Bayes(朴素贝叶斯)、Survival Regression(生存回归分析)以及K-Means(K-均值)等算法。

在Apache Spark 2.2.X版本的基础上,Apache Spark 2.3.X版本、Apache Spark 2.4.X版本中MLlib的主要更新如下。

1.新API及更新

 SPARK-21866:内置的支持将图像读入DataFrame(Scala/Java/Python)。

 SPARK-19634:用于向量列的描述汇总DataFrame的函数(Scala/Java)。

 SPARK-14516:聚类优化算法的聚类评估,用于支持聚类余弦轮廓和平方欧几里得轮廓度量(Scala/Java/Python)。

 SPARK-3181:具有Huber损失的健壮线性回归(Scala/Java/Python)。

 SPARK-13969:FeatureHasher转换器(Scala/Java/Python)。

 SPARK-13030:独热编码评估器(Scala/Java/Python)。

 SPARK-22397:定量分解器(Scala/Java)。

 SPARK-20542:Bucketizer(Scala/Java/Python)。

 SPARK-21633、SPARK-21542:改进了对Python中自定义管道组件的支持。

 SPARK-26559:ML图像不能与1.9之前的Numpy版本一起使用。

 SPARK-22666:图像格式的Spark数据源。

 SPARK-22119:KMeans/BisectingKMeans/Clustering evaluator添加余弦距离度量。

 SPARK-10697:关联规则挖掘中的提升计算。

 SPARK-14682:提供spark.ml GBTs的evaluateEachIteration方法或等效方法。

 SPARK-7132:将fit和validation set添加到spark.ml GBT。

 SPARK-15784:将Power迭代集群添加到spark.ml。

 SPARK-15064:StopWordsRemover中的本地支持。

 SPARK-21741:用于基于数据帧的多变量摘要的Python API。

 SPARK-21898:MLLIB中KolmogorovSmirnovTest的特征奇偶性。

 SPARK-10884:支持回归和分类相关模型的单实例预测。

 SPARK-23783:为ML管道添加新的通用出口特性。

 SPARK-11239:PMML导出用于ML线性回归。

2.新特点

 SPARK-21087:交叉验证器和TrainValidationSplit可以在拟合时收集所有模型(Scala/Java),允许检查或保存所有已拟合的模型。

 SPARK-19357:Meta-algorithms CrossValidator, TrainValidationSplit, OneVsRest支持并行参数,用于在并行Spark作业中拟合多个子模型。

 SPARK-17139:多项式逻辑回归模型(Scala/Java/Python)模型综述。

 SPARK-18710:在一般线性模型中添加偏移量。

 SPARK-20199:向GBTClassifier和GBTRegressor添加了featureSubsetStrategy参数。使用此功能进行子样本分析可以显著提高训练速度;此选项是XGBoost的一个关键优势。

3.其他显著变化

 SPARK-22156:修复了Word2Vec学习率缩放与num迭代。新的学习率被设置为与原来的Word2Vec c代码相匹配,并且从训练中获得更好的结果。

 SPARK-22289:添加对矩阵参数的JSON支持,修复了使用系数边界时使用LogisticRegressionModel进行ML持久性的错误。

 SPARK-22700:Bucketizer.transform错误地删除了包含NaN的行。当参数handleinvalid设置为skip时,如果另一个(不相关的)列具有NaN值,则Bucketizer将在输入列中删除具有有效值的行。

 SPARK-22446:当handleInvalid设置为error时,Catalyst优化器有时会导致StringIndexerModel引发错误的Unsen Label异常。由于谓词下推,筛选后的数据可能会发生这种情况,即使已从输入数据中筛选出无效行,也会导致错误。

 SPARK-21681:修正了多项式逻辑回归中的一个边缘情况错误,当某些特征方差为0时,会导致系数不正确。

 SPARK-22707:减少了交叉验证程序的内存消耗。

 SPARK-22949:减少了训练验证拆分的内存消耗。

 SPARK-21690:输入器应使用单次数据传递进行训练。

 SPARK-14371:OnlineLDAOptimizer避免为每个小批量向driver收集统计信息。

 SPARK-17139:打破API的变化,逻辑回归模型摘要的类和特征层次被修改为更清晰,更好地适应多类摘要的添加。这是一个用户代码的突破性更改,它将LogisticRegulationTrainingSummary强制转换为BinaryLogisticRegulationTrainingSummary。用户应改为使用model.binarysummary方法。

 SPARK-21806:BinaryClassificationMetrics.pr():第一个点(0.0,1.0)具有误导性,已被(0.0,p)替换,其中精度p与最低召回点匹配。

 SPARK-16957:决策树在选择分割值时使用加权中点,可能会改变模型训练的结果。

 SPARK-14657:没有截获的RFormula在编码字符串项时输出引用类别,以便与本机R行为匹配,可能会改变模型训练的结果。

 SPARK-21027:OneVsRest中使用的默认并行性设置为1(即串行)。在2.2和早期版本中,并行度级别在Scala中设置为默认的threadpool大小,这可能会改变性能。

 SPARK-21523:Breeze升级到0.13.2,包括一个重要的错误修复——L-BFGS算法中的线搜索line-search和强Wolfe条件。

 SPARK-15526:JPMML依赖性被遮蔽了。

4.弃用

 SPARK-23122:为SQLContext中的UDFs和PySpark中的Catalog弃用register。

 SPARK-13030:OneHotEncoder已被弃用,将在3.0中删除。它已被新的OneHotEncodeRestimator取代。请注意,OneHotEncodeRestimator将在3.0中重命名为OneHotEncoder(但OneHotEncodeRestimator将保留为别名)。

 SPARK-23451:弃用KMeans computeCost。

 SPARK-25345:从ImageSchema中弃用readImages API。

2.5.1 基于DataFrame的Machine Learning API

我们可以从下载的Spark源码中看到加入了spark.ml包(原来的spark.mllib仍然存在),这是在新版本中加入的基于DataFrame的机器学习代码包,存储在DataFrames中的向量和矩阵现在使用更高效的序列化,减少了调用MLlib算法的开销。现在spark.ml包代替基于RDD的ML成为主要的SparkMLAPI。有一个很重要的功能是,现在可以保存和加载Spark支持的所有语言的Machine Learning pipeline和model了。

2.5.2 R的分布式算法

在Apache Spark 2.2.X版本的基础上,Apache Spark 2.3.X版本、Apache Spark 2.4.X版本中SparkR的更新如下。

 SPARK-22933:用于WithWatermark、Trigger、PartitionBy和stream-stream连接的结构化流式API。

 SPARK-21266:支持DDL格式架构的SparkR UDF。

 SPARK-20726、SPARK-22924、SPARK-22843:几个新的DataFrame API包装器。

 SPARK-15767、SPARK-21622、SPARK-20917、SPARK-20307、SPARK-20906:几个新的SparkML API包装器。

 SPARK-26010:SparkR在CRAN的Java 11上标记失败。

 SPARK-26422:不支持Hadoop版本时,无法禁用SparkR中的配置单元支持。

 SPARK-26910:SparkR发布到CRAN。

 SPARK-25393:从_csv()添加新函数。

 SPARK-21291:在数据框中添加R partitionBy API。

 SPARK-25007:添加array_intersect/array_except/array_union/shuffle到SparkR。

 SPARK-25234:避免并行中整数溢出。

 SPARK-25117:在R中添加EXCEPT ALL及INTERSECT ALL的支持。

 SPARK-24537:增加array_remove / array_zip / map_from_arrays / array_distinct。

 SPARK-24187:在SparkR中添加array_join函数。

 SPARK-24331:在SparkR中添加arrays_overlap, array_repeat, map_entries。

 SPARK-24198:在SparkR中添加slice函数。

 SPARK-24197:在SparkR中添加array_sort函数。

 SPARK-24185:在SparkR中添加flatten函数。

 SPARK-24069:增加array_min / array_max函数。

 SPARK-24054:增加array_position / element_at函数。

 SPARK-23770:在SparkR中增加repartitionByRange API。

Spark 2.X版本对SparkR的最大改进是用户自定义函数,包括dapply、gapply和lapply,前两者可以用于执行基于分区的用户自定义函数(如分区域模型学习),而后者可用于超参数整定。

Spark 2.X对R语言的机器学习增加了几种算法:Random Forest(随机森林)、Gaussian Mixture Model(高斯混合模型)、Naive Bayes(朴素贝叶斯)、Survival Regression(生存回归分析)以及K-Means(K-均值)等。支持多项逻辑回归,来提供与glmnet R相似的功能。

同时对Python的机器学习也增加了一些算法,如LDA(线性判别式分析Linear Discriminant Analysis)、高斯混合模型、广义线性回归等。