问题向导: (1)Spark机器学习库是什么,目标是什么? (2)MLlib具体提供哪些功能? (3)MLlib为什么要改用基于DataFrame的API? 1.Spark机器学习库(MLlib)指南 MLlib是Spark机器学习库,它的目标是使机器学习算法可扩展和易于使用。它提供如下工具:
1.1.声明:基于DataFrame的API为首选API 基于RDD的API目前处于维护模式. spark2.0开始,基于RDD的API已经进入的维护模式.目前spark首选的机器学习API为DataFrame的API. 具体含义是什么?
为什么MLlib转向DataFrame API?
Spark ML是什么?
哪种方式API更好?
1.2.依赖 MLlib使用线性代数包Breeze,Breeze使用etlib-java来优化数值问题。如果运行时本地包不可用,你将看到一个警告提示信息,然后使用纯虚拟机进行处理。 考虑到运行二进制问题时的证书许可问题,我们默认不使用netlib-java的本地代理。安装netlib-java/Breeze来使用系统二进优化,请阅读netlib-java官方文档来获得安装说明。 基于Python语言使用MLlib,需要安装NumPy1.4及以上版本。 1.3.Spark2.2版本亮点 下面着重介绍spark2.2版本中MLlib库的一些新功能和优化
1.4.迁移指南 MLlib目前处于频繁开发中,目前试验性的API可以会在将来的版本发生变化。迁移指南会详细说明版本间的变化。 1.4.1.从2.1版本到2.2版本 不兼容性更改 没有不兼容性更改 不推荐内容 没有不推荐内容 更改内容:
1.4.2 spark之前版本 较早的迁移指南已归档到这里. 想学习更多性能优化知识,可以观看Sam Halliday的"High Performance Linear Algebra".
2.基础统计 2.1.相关系数 计算两组数据之间的相关性是统计学中的一个常见操作。spark.ml灵活提供了计算数据两两相关性的方法。目前相关性方法有Pearson和Spearman。
Pearson和Spearman区别: 1.连续数据,正态数据,线性数据用person相关系数是最恰当的,当然也可以用spearman相关系数。效率没前者高 2.上述任一条件不满足,就用spearman相关系数,不能用pearson相关系数。 3.两个定序测量数据之间也用spearman相关系数,不能用pearson相关系数。
相关性计算是:输入向量数据、输出相关性矩阵.
[Scala] 纯文本查看 复制代码
?
import org.apache.spark.ml.linalg.{Matrix, Vectors}
import org.apache.spark.ml.stat.Correlation
import org.apache.spark.sql.Row
/*
一个向量(1.0,0.0,3.0)它有2中表示的方法
密集:[1.0,0.0,3.0] 其和一般的数组无异
稀疏:(3,[0,2],[1.0,3.0]) 其表示的含义(向量大小,序号,值) 序号从0开始
*/
val data = Seq(
Vectors.sparse(4, Seq((0, 1.0), (3, -2.0))), /*稀疏*/
Vectors.dense(4.0, 5.0, 0.0, 3.0), /*密集*/
Vectors.dense(6.0, 7.0, 0.0, 8.0), /*密集*/
Vectors.sparse(4, Seq((0, 9.0), (3, 1.0))) /*稀疏*/
)
val df = data.map(Tuple1.apply).toDF("features")
val Row(coeff1: Matrix) = Correlation.corr(df, "features").head
println("Pearson correlation matrix:\n" + coeff1.toString)
val Row(coeff2: Matrix) = Correlation.corr(df, "features", "spearman").head
println("Spearman correlation matrix:\n" + coeff2.toString)
完整代码路径:"examples/src/main/scala/org/apache/spark/examples/ml/CorrelationExample.scala" 注:可以在git(git clone git://github.com/apache/spark.git)中获取,或者直接下载的spark包中也可以找到. 2.2.假设检验 假设检验是判断统计结果是否有意义的一个强有力的工具。spark.ml目前提供了Pearson卡方测试来验证独立性。 卡方检验是对每个特征和标签进行Pearson独立测试,对于每个特征值,都会通过(特征、标签)“数据对”进行卡方计算形成结果矩阵。所以标签和特征值必须明确.
详细API请参考文档: ChiSquareTest Scala docs
[Scala] 纯文本查看 复制代码
?
import org.apache.spark.ml.linalg.{Vector, Vectors}
import org.apache.spark.ml.stat.ChiSquareTest
val data = Seq(
(0.0, Vectors.dense(0.5, 10.0)),
(0.0, Vectors.dense(1.5, 20.0)),
(1.0, Vectors.dense(1.5, 30.0)),
(0.0, Vectors.dense(3.5, 30.0)),
(0.0, Vectors.dense(3.5, 40.0)),
(1.0, Vectors.dense(3.5, 40.0))
)
val df = data.toDF("label", "features")
val chi = ChiSquareTest.test(df, "features", "label").head
println("pValues = " + chi.getAs[Vector](0))
println("degreesOfFreedom = " + chi.getSeq[Int](1).mkString("[", ",", "]"))
println("statistics = " + chi.getAs[Vector](2))
完整代码路径:"examples/src/main/scala/org/apache/spark/examples/ml/ChiSquareTestExample.scala"