0、sparkmllib基础统计
- 相关性
- 假设检验
- 总结器
1、相关性
计算两个系列数据之间的相关性是“统计”中的常见操作。在spark.ml
我们提供了很多系列中的灵活性,计算两两相关性。目前支持的相关方法是Pearson和Spearman的相关。
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、总结器
我们为提供矢量列汇总统计Dataframe
过Summarizer
。可用的度量是按列的最大值,最小值,平均值,方差和非零数,以及总数。
下面的示例演示如何使用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