人工智能模型非常强大,但在使用中也会面临诸多问题,例如模型规模太大,训练数据太多,因此我们可以将数据分配到多个工作节点进行训练,亦或将模型分配到多个节点进行运算然后合并。但要从底层同时控制多台机器并非易事,而Spark是一种大规模、快速计算的集群平台,运用Spark中的MLlib库就可以轻松的构建分布式机器学习算法。
一、ML管道
MLlib对用于机器学习算法的API进行了标准化,从而使将多种算法组合到单个管道或工作流中变得更加容易。Spark中的管道概念主要受scikit-learn项目的启发,包含以下几块:
DataFrame:此ML API使用DataFrameSpark SQL作为ML数据集,可以保存各种数据类型。例如,DataFrame可能有不同的列,用于存储文本,特征向量,真实标签和预测值。
Transformer:是一种算法,其可以将一个DataFrame到另一个DataFrame。例如,Transformer可以将具有特征的DataFrame转换为具有预测的DataFrame。
Estimator:是一种算法,可以适合DataFrame来产生Transformer。例如,学习算法是在上Estimator进行训练DataFrame并生成模型的算法。
Parameter:所有Transformer和Estimator现在共享一个用于指定参数的通用API。
Pipeline被指定为一个阶段序列,每个阶段是一个Transformer或一个Estimator。这些阶段按顺序运行,并且输入DataFrame在通过每个阶段时都会进行转换。对于Transformer阶段,该transform()方法在上调用DataFrame。对于Estimator阶段,将fit()调用方法来生成Transformer(成为PipelineModel或一部分Pipeline)Transformer的transform()方法,并且在上调用的方法DataFrame(如下图)。
二、提取转换和特征选择
1.特征提取
在Spark中特征提取主要有四种方案:
TF-IDF:术语频率逆文档频率(TF-IDF) 是一种特征向量化方法,广泛用于文本挖掘中,以反映术语对语料库中文档的重要性。
Word2Vec:Word2Vec是一个Estimator包含代表文档的单词序列并训练一个的 Word2VecModel。该模型将每个单词映射到唯一的固定大小的向量。
CountVectorizer:CountVectorizer和CountVectorizerModel旨在帮助转换文本文档的集合令牌计数的载体。当先验词典不可用时,CountVectorizer可以用作Estimator提取词汇表并生成CountVectorizerModel。
FeatureHasher:特征哈希将一组分类或数字特征投影到指定维度的特征向量中(通常大大小于原始特征空间的特征向量)。这是通过使用哈希技巧 将特征映射到特征向量中的索引来完成的。
2.特征转换
Spark中的特征转换支持方法非常多,有Tokenizer、去除停用词、n-gram、二值化、多项式展开、余弦变换、字符串索引、OneHot编码、向量索引、特征交叉、归一化、标准化、SQL转换、离散化处理等等,在此用PCA方法举例,其余方法在此不做赘述。
3.特征选择
VectorSlicer:是一个采用特征向量并输出带有原始特征子数组的新特征向量的转换器。这对于从向量列中提取特征很有用。VectorSlicer接受具有指定索引的向量列,然后输出一个新的向量列,其值通过这些索引选择。
RFormula:由R模型公式指定的列。当前,我们支持R运算符的有限子集,包括“〜”,“。”,“:”,“ +”和“-”。
ChiSqSelector:代表Chi-Squared特征选择。它对具有分类特征的标记数据进行操作。ChiSqSelector使用 卡方独立性检验来决定选择哪些功能。
三、分布式机器学习算法
1.分类
分类是一种重要的机器学习和数据挖掘技术。分类的目的是根据数据集的特点构造一个分类函数或分类模型(也常常称作分类器),该模型能把未知类别的样本映射到给定类别中的一种技术。Spark MLlib库中支持的分类算法有限,大致如下:
逻辑回归
决策树分类器
随机森林分类器
梯度提升树分类器
多层感知器分类器
线性支持向量机
朴素贝叶斯
2.回归
Spark回归分析与分类相似,大致支持如下算法:
线性回归
决策树回归
随机森林回归
梯度提升树回归
保序回归
3.聚类
聚类是一个无监督的学习问题,我们的目标是基于某种相似性概念将实体子集彼此分组。 聚类通常用于探索性分析和/或作为分层监督学习管道的组成部分(在该学习管道中,针对每个聚类训练不同的分类器或回归模型)。spark.mllib软件包支持以下模型:
K均值
高斯混合(GM)
功率迭代聚类(PIC)
潜在狄利克雷分配(LDA)
4.协同过滤
在许多实际使用案例中,通常只能访问隐式反馈(例如,视图,点击,购买,喜欢,分享等)。用于spark.ml处理此类数据的方法来自隐式反馈数据集的协同过滤。
5.关联规则挖掘
挖掘关联项、项集、子序列或其他子结构通常是分析大规模数据集的第一步,而这是多年来数据挖掘中的活跃研究主题。我们向用户推荐Wikipedia的关联规则学习, 以获取更多信息。
四、模型选择和交叉验证
1.模型选择
ML中的一项重要任务是模型选择,或使用数据为给定任务找到最佳模型或参数。可以针对单个Estimator例如LogisticRegression或针对整个Pipeline进行调整,包括多个算法,功能化和其他步骤。用户可以Pipeline一次调整一个整体,而不必分别调整每个元素Pipeline。
2.交叉验证
交叉验证(CrossValidator)是在给定的建模样本中,拿出大部分样本进行建模型,留小部分样本用刚建立的模型进行预测,并求这小部分样本的预报误差,记录它们的平方加和。确定ParamMap最佳值后,CrossValidator最后使用Estimator的最佳值ParamMap和整个数据集重新拟合。