spark mllib和spark ml机器学习基础知识

本文详细介绍了Spark机器学习库SparkMLlib和SparkML的使用,涵盖从数据预处理到模型训练的全过程。讨论了分类算法如逻辑回归、决策树、SVM和协同过滤,以及无监督学习的聚类方法。此外,还涉及特征抽取、标准化、转换和评估,如TF-IDF、Word2Vec和PCA。文章深入浅出地展示了Spark在机器学习中的应用。

spark机器学习

Spark MLib完整基础入门教程 - y-z-f - 博客园 (cnblogs.com)

参考

spark 机器学习简介

机械学习是一门人工智能的科学,用于研究人工智能,强调算法,经验,性能

开发者任务:spark基础+了解机器学习原理+相关参数含义

millib:

分类 回归 聚类 协同过滤 降维

特征化:特则提取 转化 降维 选择公交

管道:构建评估调整机器学习管道

持久性:保存和加载 算法,模型和管道

实用工具:线代(Breeze,jblas库) 统计 数据处理 的工具

spark:millib:基于RDD原始算法api(从spark2.0维护模式 3.0移除)

spark.ml:基于DataFrame的高层次API

ML Pipeline API:数据处理 特征转换 正则化 多个机器学习算法联合==》单一完整的机器学习流水线

离散数据 连续数据
监督学习 Classificatio
LogisticRegression(withElastic-Net)
SVM
DecisionTree
RandomForest
GBT
NaiveBayes
MultilayerPerceptron
OneVsRest
Regression
LinearRegression(with Elastic-Net)
DecisionTree
RandomFores
GBT
AFTSurvivalRegression
IsoTonicRegression
无监督学习 Clustering
KMeans
GaussianMixture
LDA
PowerIterationClustering
BisectingKMeans
Dimensionality Reduction
matrix factorization
PCA
SVD
ALS
WLS

spark.mllib

RDD常见函数

来源

name 作用
map 遍历
filter 过滤
flatMap 返回不一样的元素数
mapPartitions 每个分区map
mapPartitionsWithIndex 以分区为单位处理并获取index
reduceByKey key相同的进行reduce
sortByKey 排序
sorted 排序
join 相同key的合并
cartesian 笛卡尔积
reduce 两两传递
collect 返回RDD数据
count 返回个数
first 第一个元素
take 前n个元素
takeORdered 升序后的前n个
saveAsTextFile 保存
countByKey 拥有相同key的个数
countByValue 拥有相同value的个数

数据类型

本地向量(单机模式存储本地向量和本地矩阵,一个或多个RDD分布式矩阵)

整形+索引值+浮点型元素

org.apache.spark.mllib.linalg.Vector

稠密向量DenseVector:双精度浮点型数组[1.0,0.0,3.0]

稀疏向量SparseVector:n个+整形索引数组+双精度浮点型元素(3,[0,1],[1.0,3.0])

//1. 导包org.apache.spark.mllib.linalg.{Vector,Vectors} 
import org.apache.spark.millib.linalg.Vectors
import org.apache.spark.sql.SparkSession
//2.创建变量Vectors.dense/sparse 参数为数组Array() 元组Seq()
object name{
   
   
    def main(args:Array[String]):Unit={
   
   
        val spark=SparkSession.builder().master("local[*]").appname("name").getOrCreate()
        val d1=Vectors.dense([1.3,2.0,3.0])
        val s1=Vectors.sparse(5,Array(1,4),(3.0,3.0))
        print(d1)
        print(s1)
    }
    
}

标注点(表示监督学习中的一个训练样本):带标签的本地向量

用于回归Regression和分类Classification(正1负0 BNM,./.,MBNVBCXQ1YTUJHGFNBVC X)问题上

双精度浮点型标签+本地向量

//1.导包 org.apache.spark.mllib.regression.LabeledPoint  org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
//2.创建变量LabeledPoint(1.0,Vectors.dense/sparse())
LabeledPoint(1.0,Vectors.dense(...))

mllib提供读取LIBSVM 格式数据 LIBSVM LIBLINEAR等机器学习库

//1.导包org.apache.spark.mllib.unil.MLUtils
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.millin.linalg.Vectors
//2.读loadLibSVMFile(sc,"*.txt") label index:value index:value index:value
val sc=SparkContext(new SparkConf().setMaster("").setAppName(""))
val svm1=MLUtils.loadLibSVMFile(sc,"*.txt")
svm1.collect().head()
svm1.collect().foreach(println)

本地矩阵(单机存储)

稠密矩阵DenseMatrix:列优先的双精度数组

稀疏矩阵Sparse Matrix:列优先的csc模式存储

//1.导包 org.apache.spark.mllib.linalg.Matricsx

//2.创建 Matrix.dense(行数,列数,元素)
Matrices.dense(3,2,Array(1.0,3.0,5.0,2.0,4.0,6.0))
/// Matrices.sparse(行数,列数,列索引,行索引,元素)
Matrices.sparse(3,2,Array(0,1,3),Array(0,2,1),Array(9,6,8))

分布式矩阵

长整型行索引+双精度浮点型元素

行矩阵RowMatrix

每一行输一个本地向量

numRows/numCols():获取行数/列数

rows:获取行 new RowMatrix(…).rows.foreach(println)

computeColumnSummaryStatistics():统计评价信息:QR分解 SVD分解 PCA分解

​ (得到每一列最大值)max/count/variance/mean/normL1

//1. 搭配包 org.apache.spark.linalg.distributed.RowMatrix
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.distributed.RowMatrix
//2.创建new RowMatriix(rows)
val dv1=Vectors.dense(1.0,2.0,3.0)
val dv2=Vectors.dense(2.0,3.0,4.0)
val mat=new RowMatrix(sc.parallelize(Array(dv1,dv2)))
mat.numRows()
mat.numCols()
mat.rows.foreach(println)
//3.评价
val summary=mat.computeColumnSummaryStatistics()
summary.count
summary.max/variance/mean/normL1

索引行矩阵IndexedRowMatrix

每一行一个有意义的行索引值存在IndexedRow组成(sc.parallelize())的RDD里

IndexedRow(索引,本地向量)

//1.导包 IndexedRow IndexedRowMatrix
import org.apache.spark.mllib.linalg.distrubuted.{
   
   IndexedRow,IndexedRowMatrix}
import org.apache.spark.{
   
   SparkConf,SparkContext}
import org.apache.spark.mllib.linalg.Vectors
//2.新建
val sc=new SparkContext(new SparkConf().setMaster("local[*]").setAppName("test"))
val id1=IndexedRow(1,Vectors.dense(1.0,2.0,3.0))
val id2=IndexedRow(2,Vectors.dense(2.0,3.0,4.0))
val idm=new IndexedRowMatrix(sc.parallelize(Array(id1,id2)))
idm.rows.foreach(println)
//3.获取

坐标矩阵CoordinateMatrix

基于矩阵项(MatrixEntry)构成的 (i行索引,j列索引,value元素)

new MatrixENtry(indexX,indexY,value)

transpose() 转置

toIndexedRowMatrix()转换成索引行矩阵IndexedRowMatrix

用于矩阵维度很大但稀疏的时候

//
import org.apache.spark.mllib.linalg.distrubuted.{
   
   CoordinateMatrix,MatrixEntry}
val en2=new MatrixEntry(0,1,0.5)
val en1=new MatrixEntry(2,2,1.8)
val ens=new CoordinateMatrix(sc.parallelize(Array(en1,en2)))
ens.entries.foreach(println)
val transens=ens.transpose().entries.foreach(println)
transens.toIndexedRowMatrix().rows.foreach(println)

分块矩阵 Block Matrix

基于矩阵块MatrixBlock((索引int,索引int),子矩阵Matrix)

validate:确认是否创建成功

索引行IndexedRowMatrix/坐标矩阵CoordinateMatrix.toBlockMatrix(尺寸) :分块转为分块矩阵

rowsPerBlock colPerBlock:大小/尺寸

import org.apache.spark.mllib.linalg.distributed.{
   
   BlockMatrix,CoordinateMatrix, MatrixEntry}

val ent1 = new MatrixEntry(0,0,1)
val ent2 = new MatrixEntry(1,1,1)
val ent3 = new MatrixEntry(2,0,-1)
val ent4 = new MatrixEntry(2,1,2)
val ent5 = new MatrixEntry(2,2,1)
val ent6 = new MatrixEntry(3,0,1)
val ent7 = new MatrixEntry(3,1,1)
val ent8 = new MatrixEntry(3,3,1)
val coordMat=new CoordinateMatrix(sc.parallelize(Array(ent1,ent2,ent3,ent4,ent5,ent6,ent7,ent8)))
val mat=coordMat.toBlockMatrix(2,2).cache()
mat.validate()
mat.toLocalMatrix
mat.numColBlocks
mat.numRowBLocks
val ata=mat.transpose.multiply(mat)  //转置相乘
ata.toLocalMatrix

数据统计工具

数据分析师先查看数据集的基本情况:汇总统计或概要性统计

一般的概要性统计用于概括一系列观测值,包括位置或集中趋势(比如算术平均值、中位数、众数和四分位均值),展型(比如四分位间距、绝对偏差和绝对距离偏差、各阶矩等),统计离差,分布的形状,依赖性等

spark.mllib库也提供了一些其他的基本的统计分析工具,包括相关性、分层抽样、假设检验,随机数生成等

  • 概括统计 summary statistics

    org.apache.spark.mllib.stat.Statistics

    Statistics.colStats(Rdddata).count/mean/variance/max/min/normL1/normL2/numNonzeros非零向量个数

    import org.apache.spark.millib.linalg.Vectors
    import org.apache.spark.millib.stat.Statistics
    val sdata=sc.textFile("iris.data").map(_.split(',')).map(
        p=>Vectors.dense(p(0).toDouble,p(1).toDouble,p(2).toDouble,p(3).toDouble))
    val summary=Statistics.colStats(sdata)
    summary.count/max/min/normL1/normL2/numNonzeros/variance/mean
    
  • 相关性 correlations

    Statistics.corr(x,y,“pearson”) : 输出一个RDD[Vector]

    ​ 相关矩阵第i行第j列的元素是原矩阵第i列和第j列的相关系数

    Statistics.corr(data,“pearson”) 输出一个RDD[double]

    pearson皮尔逊系数[-1,1] :[-1,0)负相关 (0,1]正相关

    Pearson

    Spearman斯皮尔曼等级相关系数:用于排序

    Spearman

    import org.apache.spark.mllib.stat.Statistics
    import org.apache.spark.mllib.linalg._
    import org.apache.spark.{
         
         SparkContext,SparkConf}
    data=sc.textFile("iris.data").map(_.split(","))
    x=data.map(p=>{
         
         
        p(0).toDouble
    })
    y=data.map(p=>{
         
         
        p(1).toDouble
    })
    sdata=data.map(p=>{
         
         
        Vectors.dense(p(0).toDouble,p(1).toDouble)
    })
    println(Statistics.corr(x,y,"pearson"))
    println(Statistics.corr(data,"perason")) 
    
  • 分层抽样 Stratified sampling

    sampleBykeyExact和sampleByKey 区别:

    ​ sampleBykey每次一定概率掷硬币

    ​ sampleBykeyExact:全量数据作采样计算 每个类别都有类count*类比例个

    rdddata.sampleByKey(withReplacement=false,fractions,1)

    fractions:Map(“name1”->0,“name2”->0.4) 不同key的概率

    seed:随机种子:1

    withReplacement:是否放回

    import org.apache.spark.mllib.linalg.Vectors
    import org.apache.spark.{
         
         SparkConf,SparkContext}
    val data=sc.makeRDD(Array(
              ("female","Lily"),
              ("female","Lucy"),
              ("female","Emily"),
              ("female","Kate"),
              ("female","Alice"),
              ("male","Tom"),
              ("male","Roy"),
              ("male","David"),
              ("male","Frank"),
              ("male","Jack")))
    val fractions=Map("female"->0.6,"male"->0.4) 
    //female占抽样总数的0.6 male占0.4所以demale是5*0.6 和5*0.4
    data.sampleByKey(data,fractions,seed=1).collect().foreach(println)
    data.sampleByKeyExact(data,fractions,seed=1).collect().foreach(println)
    
  • 假设检验 hypothesis testing

    皮尔森卡方检测(Pearson’s chisquaerd tests):适配度检定和独立性检定

    Statistics.chiSqTest(value1[,value2]):一个值是适合度检验,两个是独立性检验

    Statistics.kolmogorovSmirnovTest(test,“norm”,0,1)

name value mean
methos pearson 采用什么方法
degrees of freedom 3 自由度,可自由变动的样本观测值
statistic 5.5882… 检测统计量
pValue 0.133455… 统计学-显著性检验方法得到的P
P<0.05显著
P<0.01 非常显著
import org.apache.spark.SparkContext
import org.apache.spark.mllib.linalg._
import org.apche.spark.regression.LabeledPoint
import org.apache.spark.mllib.stat.Statistics._

val data=sc.textFile("iris.data")//原数据
val v1=data
	.map(_.split(",")) 
	.map(p=>Vectors.dense(p(0).toDouble,p(1).toDouble,p(2).toDouble,p(3).toDouble)).first //第一行数据
val v2=data
	.map(_.split(",")) .
	map(p=>Vectors.dense(p(0).toDouble,p(1).toDouble,p(2).toDouble,p(3).toDouble)).take(2).last //第二行数据
Statistics.chiSqTest(v1)  //得到均匀分配的假设,检测指标数据是否均匀分配 p=0.133
Statistics.chiSqTest(Matrices.dense(2,2,Array(v1(0),v1(1),v2(0),v2(1))))
Statistics.chiSqTest(v1,v2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厨 神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值