前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Apache Spark 1.1中的统计功能

Apache Spark 1.1中的统计功能

作者头像
发布2018-02-09 09:50:48
2.1K0
发布2018-02-09 09:50:48

Apache Spark中的理念之一就是提供丰富友好的内置库,以便用户可以轻松组织数据管道。随着 Spark,尤其是 MLlib 在数据科学家和机器学习从业者中迅速风靡,我们窥见了模型拟合之外对数据分析支持的需求。为了满足这种需求,我们开始添加通用统计函数的可扩展实现来升级数据管道的各个组件。现在我们很高兴地宣布Apache Spark 1.1 内置了对探索性数据管道中常见的几种统计算法的支持:

  • 相关性:数据相关性分析
  • 假设检验:拟合优度; 独立检验
  • 分层抽样:控制标签分布的可拓展训练集
  • 随机数据生成:随机算法; 性能测试

由于易用性是 Spark 的主要使命之一,我们投入大量精力设计统计功能的 API。Spark 的统计 API 从广泛采用的统计软件包(如 R 和 SciPy.stats)中汲取灵感,O'Reilly 最近的一项调查显示,它们是数据科学家中最受欢迎的工具。

相关性

相关性提供了两个随机变量之间统计相关性的定量测量。相关性的实现在 mllib.stat.Statistics 下提供。

MLlib

corr(x,y = None,method =“pearson”|“spearman”)

R

cor(x,y = NULL,method = c(“pearson”,“kendall”,“spearman”))

SciPy

pearsonr(x, y) spearmanr(a, b = None)

如表所示,R 和 SciPy.stats 向我们展示了 MLlib 中相关性 API 的两个完全不同的方向。我们最终选用了具有单个函数的 R 风格,该函数将“相关性分析方法”作为字符串参数,而不考虑扩展性以及 API 列表的简洁性。初始方法集包含两个最常用的相关性分析方法:“pearson”和“spearman”。

假设检验

假设检验对于数据驱动型应用来说是必不可少的。检验结果说明了一个几乎不可能发生的事件的显著性差异。例如,我们可以通过独立性检验来测试两个样本之间是否存在显著关联。在 Apache Spark 1.1 中,我们对拟合优度和独立性进行了卡方检验:

MLlib

chiSqTest(observed: Vector, expected: Vector) chiSqTest(observed: Matrix) chiSqTest(data: RDDLabeledPoint)

R

chisq.test(x,y = NULL,correct = TRUE,p = rep(1 / length(x),length(x)),rescale.p = FALSE,simulate.p.value = FALSE)

SciPy

chisquare(f_obs,f_exp = None,ddof = 0,axis = 0)

设计卡方检验 API 时,我们采用了 R 和 SciPy API 中参数的最大公约部分,出于简化 API 的目的去掉了一些不常用的参数。请注意,与 R 和 SciPy 一样,输入数据的类型决定了能否进行拟合优度或独立性检验。我们增加了对输入类型 RDD[LabeledPoint] (向量标签)的特殊情况支持,以通过卡方独立性检验启用特征选择。

分层抽样

一个总体常由不同容量的子总体(层)组成,例如一个积极情况远多于消极情况的训练集。对这样的总体进行抽样,独立地对每个层抽样有利于减少总方差或突出小而重要的层。这种抽样设计被称为分层抽样。与存在于 MLlib 中的其他统计函数不同,我们将分层抽样方法置于 Spark Core 中,因为抽样在数据分析中被广泛使用。我们提供了两种版本的分层采样,sampleByKeysampleByKeyExact。两者都适用于RDD键值对(其中键表示层),且都根据用户指定每个层的抽样概率来进行映射。R 和 SciPy 均未内置对分层抽样的支持。

MLlib

sampleByKey(withReplacement,fractions,seed) sampleByKeyExact(withReplacement,fractions,seed)

类似于RDD.samplesampleByKey对每个项目独立地应用伯努利抽样或泊松抽样,这很简便但不能保证每个层的实际样本容量(层的容量乘以对应的抽样概率)。sampleByKeyExact使用可扩展的采样算法,高概率地保证每个层的实际样本容量,但是这需要多次遍历数据。因此我们对这个方法单独命名以强调它的成本更高。

随机数据生成

随机数据生成对于测试现有算法和实现随机算法(如随机映射)非常有用。我们在 mllib.random.RandomRDDs下提供了用于生成弹性分布式数据集(RDDs)的方法,这些数据集包含服从某种分布(如均匀分布、标准正态分布或泊松分布)的独立同分布值。

MLlib

normalRDD(sc,size,numPartitions,seed) normalVectorRDD(sc,numRows,numCols,numPartitions,seed)

R

rnorm(n,mean = 0,sd = 1)

SciPy

randn(d0, d1, …, dn) normal(loc, scale, size) standard_normal(size)

随机数据生成 API 说明了我们将 Spark 独有的自定义功能添加到广泛支持的 API 的情况。上表中显示了 MLlib 的正态分布数据生成 API 与 R 和 SciPy 的比较。我们提供一维RDD[Double]和二维RDD[Vector]支持,因为这两者在 MLlib 函数中都很普遍,而 R 中只有一维, NumPy 中只有随机维数。除 Spark 独有的参数(如 SparkContext 和分区数量)外,我们还允许用户设置种子的再现性。除了内置的分布类型,用户可以通过RandomDataGenerator插入自己所需的分布类型。

SparkR 怎么样呢?

在这一点上,你可能会问:为什么明明存在 SparkR 项目的,我们还要在 Spark 内提供统计功能的本地支持呢?作为一个 R 语言的包,SparkR 是一个强大的轻量级解决方案,可以为 R API 的熟悉者提供分布式计算支持。我们的目标是通过这些内置的 Spark 统计 API 提供跨语言支持,以及与 Spark 的其他组件(如 Spark SQL 和 Streaming)的无缝集成,以实现统一的数据产品开发平台。我们希望在将来这些特性能够被 SparkR 调用。

总结要点

除了一套熟悉的 API 以外,Spark 中的统计功能还给 R 和 SciPy 用户带来巨大收益,如可扩展性、容错性以及与现有大数据管道的无缝集成。R 和 SciPy 在一台机器上运行,而 Spark 可以轻松扩展到数百台机器并分配计算。我们对比了在具有 32 个节点集群上 MLlib 及在 R 上进行 Pearson 相关性分析所需时间(不计将数据移动到安装有 R 的节点所需的时间)。下图显示的结果表明了 Spark 相较 R 在性能和可伸缩性的明显优势。

进行 Pearson 相关性分析的运行时间( 列数 = 1000)
进行 Pearson 相关性分析的运行时间( 列数 = 1000)

由于统计数据 API 是实验性的,所以我们期待社区对这些设计的可用性的反馈。我们也欢迎来自社区的贡献,以增强 Spark 的统计功能。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 相关性
  • 假设检验
  • 分层抽样
  • 随机数据生成
  • SparkR 怎么样呢?
  • 总结要点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档