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]正相关

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

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

被折叠的 条评论
为什么被折叠?



