sparkmllib算法之操作-第二篇

9 篇文章 0 订阅
7 篇文章 0 订阅

0、sparkmllib基础统计

  • 相关性
  • 假设检验
  • 总结器

1、相关性

计算两个系列数据之间的相关性是“统计”中的常见操作。在spark.ml 我们提供了很多系列中的灵活性,计算两两相关性。目前支持的相关方法是PearsonSpearman的相关。

Correlation 使用指定的方法为输入的矢量数据集计算相关矩阵。输出将是一个DataFrame,其中包含向量列的相关矩阵。

import org.apache.spark.ml.linalg.{Matrix, Vectors}
import org.apache.spark.ml.stat.Correlation
import org.apache.spark.sql.Row

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)))
)

//数据结构转换为DataFrame
val df = data.map(Tuple1.apply).toDF("features")

//计算相关性-默认为pearman系数
val Row(coeff1: Matrix) = Correlation.corr(df, "features").head
println(s"Pearson correlation matrix:\n $coeff1")

//计算相关性-设置为spearman系数
val Row(coeff2: Matrix) = Correlation.corr(df, "features", "spearman").head
println(s"Spearman correlation matrix:\n $coeff2")

2、假设检验

假设检验是一种强大的统计工具,可用来确定结果是否具有统计意义,以及该结果是否偶然发生。spark.ml目前支持Pearson的卡方(χ2χ2)测试独立性。

ChiSquareTest针对标签上的每个功能进行Pearson的独立性测试。对于每个特征,(特征,标签)对将转换为列矩阵,针对该列矩阵计算卡方统计量。所有标签和特征值必须是分类的。

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(s"pValues = ${chi.getAs[Vector](0)}")
println(s"degreesOfFreedom ${chi.getSeq[Int](1).mkString("[", ",", "]")}")
println(s"statistics ${chi.getAs[Vector](2)}")

3、总结器

我们为提供矢量列汇总统计DataframeSummarizer。可用的度量是按列的最大值,最小值,平均值,方差和非零数,以及总数。

下面的示例演示如何使用Summarizer 带有和不带有权重列的输入数据帧的矢量列计算均值和方差。

import org.apache.spark.ml.linalg.{Vector, Vectors}
import org.apache.spark.ml.stat.Summarizer

//加载数据
val data = Seq(
  (Vectors.dense(2.0, 3.0, 5.0), 1.0),
  (Vectors.dense(4.0, 6.0, 7.0), 2.0)
)

//结构转换
val df = data.toDF("features", "weight")

//选择数据
val (meanVal, varianceVal) = df.select(metrics("mean", "variance")
  .summary($"features", $"weight").as("summary"))
  .select("summary.mean", "summary.variance")
  .as[(Vector, Vector)].first()

println(s"with weight: mean = ${meanVal}, variance = ${varianceVal}")

//选择数据
val (meanVal2, varianceVal2) = df.select(mean($"features"), variance($"features"))
  .as[(Vector, Vector)].first()

println(s"without weight: mean = ${meanVal2}, sum = ${varianceVal2}")

4、示例-卡方验证选择特征

 def main(args: Array[String]): Unit = {
    //准备环境
    val spark: SparkSession = SparkSession.builder().master("local[*]").appName("test").getOrCreate()
    //导入数据
    val data = Seq(
      (7, Vectors.dense(0.0, 0.0, 18.0, 1.0), 1.0),
      (8, Vectors.dense(0.0, 1.0, 12.0, 0.0), 0.0),
      (9, Vectors.dense(1.0, 0.0, 15.0, 0.1), 0.0)
    )
    var df = spark.createDataFrame(data).toDF("id", "features", "label")
    //卡方验证选择特征
    val chisquare = new ChiSqSelector().setFeaturesCol("features").setLabelCol("label").setNumTopFeatures(1)
    chisquare.fit(df).transform(df).show(false)
  }

 

有问题请联系QQ:765120845

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值