高级数据分析
监督学习:分类和回归
推荐系统
无监督学习:聚类、异常检测、主题建模
图分析任务:对图数据进行分析。
1.3 数据采集
- Spark支持多种数据源
与hdfs无缝连接使用,支持海量的数据读入
Spark Streaming支持高通量的实时流数据读入 - 使用适当的技术提取所需要的数据
使用规则模板(如:正则表达式)
OCR技术:一般指光学字符识别。电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。
语音识别技术
1.4数据清理
收集到数据之后需要清理和检查,也是探索性数据分析(EDA,Exploration Data Analysis)的必要步骤
- 在此过程中,需要:
- 提取和整合来自各个数据源的数据
- 删除空数据
- 数据类型转换
- 清理或转换非标数据
- 删除一些未标注数据或可能的错误标注数据
1.5 特征工程
- 收集和清理数据后,需要将它转换成为适合算法计算的数据格式,通常是特征空间。
- 在MLlib中,所有变量通常需要作为浮点型向量输入。
2 MLLIB
- MLLIB是Spark高级数据分析包
- MLLIB基于Spark,且是Spark项目的一个软件包,它提供各种API接口用于收集和清理数据、特征工程和特征选择、训练和微调大型机器学习模型。
2.1 MLLIB中的数据结构
- 转换器(transformer):用于预处理和特征工程
- 估计器(estimater):用于模型训练
- 评估器(evaluator):用于评估模型
- 流水线(pipeline)
2.2 基本数据类型——本地向量
- 本地向量类型(Vector)
特征向量空间中的一个坐标,由一组特征值构成 - 创建本地向量
稠密向量
//创建稠密向量(1.0,0.0,3.0)
val dv = Vectors.dense(1.0,0.0,3.0)
稀疏向量
// 创建1000维稀疏矩阵向量(1.0,0.0,3.0,0.0,0.0,...)
val sv = Vector.sparse(1000,Array(0,2),Array(1.0,3.0))
2.3 标注点
是一种带有标签的本地向量,通常用在需要标签的有监督学习中。
创建标注点语法
LabeledPoint(label:Double, features:Vector)
label:标签值,features:本地向量值。
稠密向量标注点
LabeledPoint(1.0,Vectors.dense(1.0,0.0,3.0))
稀疏向量标注点
LabeledPoint(1.0,Vectors.saprse(1000,Array(0,2),Array(1.0,3.0)))
2.4 评分
Rating:记录用户评分的一种数据类型,通常用于MLLIB中的推荐算法
- 推荐算法:根据用户的行为和特征推荐其可能偏好的项目
- 将用户行为和特征转换为标准的评分模型。
2.5 本地矩阵
本地矩阵类型(Matrix)
表示一个矩阵,其中所有元素均为Double,用以存储一个向量空间
支持稠密矩阵和稀疏矩阵。
- 本地稠密矩阵创建
Matrices.dense(numRows:Int, numCols:Int, values:Array[Double])
numberRows:矩阵行数,numberCols:矩阵列数,values:矩阵数据,装在Double数组中。
创建一个3行2列的矩阵
Matrices.dense(3,2,Array(2,5,3,4,1,6))
2 | 4 |
---|---|
5 | 1 |
3 | 6 |
本地系数矩阵创建
Matrices.sparse(numRows:Int, numCols:Int, colPtrs:Array[Int],rowIndices:Array[Int], values:Array[Double])
numberRows:矩阵行数,numberCols:矩阵列数,colPtrs:各列开始索引和所有元素总数。rowIndices:非0元素所在行索引
values:矩阵数据,装在Double数组中。:
创建一个3行2列的本地稀疏矩阵
Matrices.sparse(3,2,Array(0,1,4),Array(0,0,2,1),Array(9,1,6,8))
2.6 分布式矩阵
- 由本地向量RDD构造,每个本地向量代表矩阵的一行,该矩阵属于行矩阵;支持一切RDD的分布式存储和计算的特性。
创建分布式矩阵语法
//创建RDD[Int]
val rdd = sc.makeRDD(List((1,2),(2,3),(5,3)))
// 将RDD[(Int,Int)]转为本地稠密向量RDD[DenseVector]
val vd = rdd.map(x => Vectors.dense(x._1,x._2))
val rm1 = RowMatrix(vd)
//将RDD[(Int,Int)]转为本地稀疏矩阵向量RDD[SparseVector]
val vs = rdd.map(x => Vectors.sparse(2,Array(0,1),Array(x._1,x._2)))
val rm2 = RowMatrix(vs)
3 流水线
- Pipeline
可将高级数据分析从数据提取、特征转换到分析算法按顺序插入流水线,定义成一个流水线任务可执行或保存以供以后加载执行。
//将步骤以数组的方式插入流水线
//插入了三个步骤tokenizer, hashingTF, lr
val pipeline = new Pipeline().setStages(Array(tokenizer, hashingTF, lr))
//通过流水线执行训练,并返回模型
//流水线会自动按步骤从前往后执行,直到模型训练完毕
val model = pipeline.fit(training)
//执行模型测试
model.transform("测试数据集")
4 MLLIB支持算法
- 特征工程
- 分类和回归
- 决策树和随机森林
- 聚类
- 推荐算法
- 其他
特征工程算法——特征转换
-
Tokenizer
将字符串划分(如句子)为更小 -
n-gram
-
又称n元模型,是一种基于统计语言模型的算法,对文档中的文本按固定字节长度(字数)为窗口(window/mask)进行频度统计,形成一个描述文档的特征向量空间;广泛应用在NLP领域,用于文档评估
-
DCT
离散余弦变换(Discrete Cosine Transform),主要用于离散信号处理(一维信号如音频信号、压力变换和温度变换等,二维信号如图像信号和视频信号灯);将信号的空间域表达转换到频率域上。