Spark MLlib
简介
MapReduce
对机器学习的算法编写的缺点:
- 反复读写磁盘
- 磁盘
IO
开销大
机器学习算法中具有大量的迭代计算,导致了MapReduce不太适合。
Spark
是基于内存的计算框架,使得数据尽量不存放在磁盘上,直接在内存上进行数据的操作。MLlib只包含能够在集群上运行良好的并行算法。
特征化工具
- 特征提取
- 转化
- 降维
- 选择工具
实现算法
MLlib
实现的算法包含:
- 分类
- 回归
- 聚类
- 协同过滤
流水线
使用Spark SQL
中的DF
作为数据集,可以容纳各种数据类型。DF
被ML Pinline
用来存储源数据。DF中的列可以是:
- 文本
- 特征向量
- 真实和预测标签等
转换器transformer
能将一个DF转换成另一个DF,增加一个标签列。
评估器estimator
指的是学习算法或在训练数据上的训练方法的抽象概念,本质上就是一个算法。
参数parameter
用来进行参数的设置。
流水线构建
- 定义pipeline中的各个流水线阶段
PipelineStage
,包含转换器和评估器 - 转换器和评估器有序的组织起来构建
PipeLine
- 流水线本身也是估计器。在流水线的
.fit()
方法运行之后,产生一个PipelineModel
,变成了一个Transformer
1 | # pyspark.ml依赖numpy:sudo pip3 install numpy |
特征提取和转换
特征提取
TF-IDF;词频-逆向文件频率
- TF:
HashingTF
是一个转换器;统计各个词条的词频 - IDF:是一个评估器,在数据集上应用
IDF
的fit
方法,会产生一个IDFmodel
1 | from pyspark.ml.feature import HashingTF,IDF,Tokenizer |
转换
将字符串转换成整数索引,或者在完成计算之后将证书索引还原成字符串标签。相关的转换器
-
StringIndexer
- 将类别型的标签进行数值化,索引从0开始
- 索引构建的频率是标签的频率,悠闲编码频率大的标签,即出现频率最高的标签为0号
- 如果输入的是数值型的,会先转成字符型,再对其进行编码。
1
2
3
4
5
6
7
8from pyspark.ml.feature import StringIndexer
df = spark.createDataFrame([(0,"a"),(1,"b"),(2,"c"),(3,"a"),(4,"a"),(5,"c")], ["id","category"])
indexer = StringIndexer(inputCol="catefory",outputCol="categoryIndex")
model = indexer.fit(df)
indexed = model.transform(df)
indexed.show() -
IndexToString
- 将标签索引重新映射成原有的字符型标签
- 通常是和
StringIndexer
配合使用
-
VectorIndexer
- 所有的特征被组织到一个向量中,想对其中的某个分量进行处理
- 使用的
maxCategories
超参数。它是基于不同特征的数量来识别哪些特征需要被类别化。