Apache Spark 1.1中的统计功能
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 中,因为抽样在数据分析中被广泛使用。我们提供了两种版本的分层采样,sampleByKey
和sampleByKeyExact
。两者都适用于RDD键值对(其中键表示层),且都根据用户指定每个层的抽样概率来进行映射。R 和 SciPy 均未内置对分层抽样的支持。
MLlib |
sampleByKey(withReplacement,fractions,seed) sampleByKeyExact(withReplacement,fractions,seed) |
---|
类似于RDD.sample
,sampleByKey
对每个项目独立地应用伯努利抽样或泊松抽样,这很简便但不能保证每个层的实际样本容量(层的容量乘以对应的抽样概率)。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 在性能和可伸缩性的明显优势。
由于统计数据 API 是实验性的,所以我们期待社区对这些设计的可用性的反馈。我们也欢迎来自社区的贡献,以增强 Spark 的统计功能。
- Python 里 and、or 的计算规则
- Python中赋值、浅拷贝与深拷贝
- git 简易使用说明
- 开发篇-MySQL分区(一)
- Establishing SSL connection without server's identity verification is not recommended. According to
- Django-认证系统
- javascript:双链表-插入排序
- javascript:二叉搜索树 实现
- 自然语言处理 语言模型介绍
- 口水先擦干!从大数据看外卖如何拯救“忙”与“宅”
- javascript:巧用eval函数组装表单输入项为json对象
- Django——model基础
- java学习:日期的运算
- ORACLE:写Function时,传入参数变量名的注意事项
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux常用命令速查表
- 机器学习中必须要会用的模块
- 【MathorCup】2020年 A题 无车承运人平台线路定价问题,特征间的相关性分析
- 决策树预测成本价 2020年 MathorCup数学建模 A题 无车承运人平台线路定价问题
- 2020年 MathorCup数学建模 A题 无车承运人平台线路定价问题,定价评价
- RabbitMQ 消费端限流、TTL、死信队列
- 全栈必备 Redis基础
- JSP的异常处理
- (二)Mybatis-Plus的安装配置
- 如何在JSP里自定义标签
- 如何在JSP里使用Java bean
- 获取指定时间内指定星期几的所有日期
- 使用JSP的标准标签库JSTL处理XML格式的数据
- (一)初识Mybatis-Plus
- org.apache.tomcat.util.scan.StandardJarScanner找不到serializer.jar的问题