Apache Spark MLlib学习笔记(三)MLlib统计指标之关联/抽样/汇总

来源:互联网 发布:办公软件视频教程下载 编辑:程序博客网 时间:2024/05/05 12:44

决策树利用树形结构进行分类和回归,构建树的指标有多种,其中一种就是方差。在介绍决策树类算法前,首先介绍一下Spark MLlib中基本的统计。Spark官方提供了summary statistics、correlations、stratified sampling、hypothesis testing、random data generation。即汇总统计、关联、分层抽样、假设检验、随机数据生成。参考文档如下:
http://spark.apache.org/docs/latest/mllib-statistics.html
1、summary statistics(汇总统计)
Summary statistics提供了基于列的统计信息,包括6个统计量:均值、方差、非零统计量个数、总数、最小值、最大值。

import org.apache.spark.mllib.linalg.Vectorimport org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics}val observations: RDD[Vector] = ... //  Vectors RDD// 计算列统计量val summary: MultivariateStatisticalSummary = Statistics.colStats(observations)println(summary.mean) // 均值println(summary.variance) // 方差println(summary.numNonzeros) // 列非零值

2、Correlations(关联)
计算两个数据序列的相关度。相关系数是用以反映变量之间相关关系密切程度的统计指标。相关系数值越接近1或者-1,则表示数据越可进行线性拟合。目前Spark支持两种相关性系数:皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman)。

import org.apache.spark.SparkContextimport org.apache.spark.mllib.linalg._import org.apache.spark.mllib.stat.Statisticsval sc: SparkContext = ...val seriesX: RDD[Double] = ... // 序列1val seriesY: RDD[Double] = ... // 必须和序列1具有相同的分区和数量//  使用Pearson方法计算相关度, 若写 "spearman" 则使用 Spearman 方法。默认使用Pearson方法。val correlation: Double = Statistics.corr(seriesX, seriesY, "pearson")val data: RDD[Vector] = ... //  Vector 是行向量// 使用 Pearson方法计算相关度矩阵,默认使用Pearson方法。val correlMatrix: Matrix = Statistics.corr(data, "pearson")

3、Stratified sampling(分层抽样)
一个根据Key来抽样的功能,可以为每个key设置其被选中的概率。具体见代码以及注释
和其他统计方法不同,sampleByKey 和 sampleByKeyExact方法可以在RDD键值对上被执行。key可以被想象成一个标签和作为实体属性的值。例如,key可以是男女、文件编号,实体属性可以使人口中的年龄、文件中的单词。sampleByKey方法通过随机方式决定某个观测值是否被采样,因此需要提供一个预期采样数量。sampleByKeyExact 方法比使用简单随机抽样的sampleByKey方法需要更多的资源,但是它可以保证采样大小的置信区间为99.99%。

import org.apache.spark.SparkContextimport org.apache.spark.SparkContext._import org.apache.spark.rdd.PairRDDFunctionsval sc: SparkContext = ...val data = ... //  RDD[(K, V)] ,任意键值对val fractions: Map[K, Double] = ... // 制定每个键的比例// 进行采样val approxSample = data.sampleByKey(withReplacement = false, fractions)val exactSample = data.sampleByKeyExact(withReplacement = false, fractions)

4、Hypothesis testing(假设检验)
Spark目前支持皮尔森卡方检测(Pearson’s chi-squared tests),包括适配度检定和独立性检定。“适配度检定”验证一组观察值的次数分配是否异于理论上的分配。“独立性检定”验证从两个变数抽出的配对观察值组是否互相独立(例如:每次都从A国和B国各抽一个人,看他们的反应是否与国籍无关)。

import org.apache.spark.SparkContextimport org.apache.spark.mllib.linalg._import org.apache.spark.mllib.regression.LabeledPointimport org.apache.spark.mllib.stat.Statistics._val sc: SparkContext = ...val vec: Vector = ... //由事件发生概率组成// 计算适配度val goodnessOfFitTestResult = Statistics.chiSqTest(vec)println(goodnessOfFitTestResult) // 汇总结果,包括p值,自由度,检验统计量,所使用的方法,以及零假设。val mat: Matrix = ... // 应急矩阵// 根据输入矩阵计算 Pearson独立性检验val independenceTestResult = Statistics.chiSqTest(mat) println(independenceTestResult)val obs: RDD[LabeledPoint] = ... // (feature, label) 键值对 val featureTestResults: Array[ChiSqTestResult] = Statistics.chiSqTest(obs)var i = 1featureTestResults.foreach { result =>    println(s"Column $i:\n$result")    i += 1} // 输出结果

5、Random data generation(随机数据生成)
随机数据对于随机算法、原型设计和检验十分有用。Random data generation用于随机数的生成。Random RDDs包下现支持正态分布、泊松分布和均匀分布三种分布方式。
RandomRDDs提供随机double RDDS或vector RDDS。下面的例子中生成一个随机double RDD,其值是标准正态分布N(0,1),然后将其映射到N(1,4)。

import org.apache.spark.SparkContextimport org.apache.spark.mllib.random.RandomRDDs._val sc: SparkContext = ...// 生成一个随机的包含100w i.i.d值的double RDD,他们服从正态分布`N(0, 1)`, 并均匀的分布在 10 个分区。val u = normalRDD(sc, 1000000L, 10)// 将RDD映射到`N(1, 4)`.val v = u.map(x => 1.0 + 2.0 * x)
0 0