机器学习库Spark MLlib简介与教程


Spark MLlib是 Apache Spark 的机器学习组件。 Spark 的主要吸引力之一是能够大规模扩展计算,而这正是机器学习算法所需要的。但局限性是所有机器学习算法都无法有效并行化。每个算法都有自己的并行化挑战,无论是任务并行还是数据并行。

话虽如此,Spark 正在成为构建机器学习算法和应用程序的事实上的平台。 好吧,在继续阅读博客之前,您可以查看由行业专家策划的Spark 课程。 在 Spark MLlib 上工作的开发人员正在 Spark 框架中以可扩展和简洁的方式实现越来越多的机器算法。通过这个博客,我们将学习机器学习的概念、Spark MLlib、它的实用程序、算法和电影推荐系统的完整用例。 
 
Spark MLlib 概述
Spark MLlib 用于在 Apache Spark 中执行机器学习。MLlib 包含流行的算法和实用程序。
MLlib 概述:

  • spark.mllib 包含构建在RDD 之上的原始 API。它目前处于维护模式。
  • spark.ml提供了构建在 DataFrames 之上的更高级别的 API,用于构建机器学习管道。spark.ml 是目前 Spark 的主要机器学习 API。

 
Spark MLlib 工具
Spark MLlib 提供以下工具:
  • ML 算法:  ML 算法构成了 MLlib 的核心。其中包括常见的学习算法,例如分类、回归、聚类和协同过滤。
  •  特征化:特征化包括特征提取、变换、降维和选择。
  • 管道: 管道提供用于构建、评估和调整 ML 管道的工具。
  • 持久性: 持久性有助于保存和加载算法、模型和流水线。
  • 公用事业: 公用事业用于线性代数、统计和数据处理。

  
MLlib 算法
Spark MLlib 中流行的算法和实用程序是:
  1. 基本统计
  2. 回归
  3. 分类
  4. 推荐系统
  5. 聚类
  6. 降维
  7. 特征提取
  8. 优化

 
基本统计
基本统计包括最基本的机器学习技术。这些包括:
  1. 汇总统计:示例包括均值、方差、计数、最大值、最小值和 numNonZeros。
  2. 相关性:Spearman 和 Pearson 是找到相关性的一些方法。
  3. 分层抽样:包括 sampleBykey 和 sampleByKeyExact。
  4. 假设检验:Pearson 的卡方检验是假设检验的一个例子。
  5. 随机数据生成:RandomRDDs、Normal 和 Poisson 用于生成随机数据。

  
回归
回归分析是估计变量之间关系的统计过程。当重点是因变量与一个或多个自变量之间的关系时,它包括许多建模和分析多个变量的技术。更具体地说,回归分析有助于理解当任何一个自变量发生变化而其他自变量保持固定时,因变量的典型值如何变化。
回归分析广泛用于预测和预测,其使用与机器学习领域有很大的重叠。回归分析还用于了解自变量中哪些与因变量相关,并探索这些关系的形式。在有限的情况下,回归分析可用于推断自变量和因变量之间的因果关系。
 
分类
分类 是根据包含类别成员已知的观察(或实例)的训练数据集来识别新观察属于一组类别(子种群)中的哪一个的问题。这是模式识别的一个例子。
在这里,一个例子是将给定的电子邮件分配到“垃圾邮件”或“非垃圾邮件”类别中,或者根据观察到的患者特征(性别、血压、是否存在某些症状、等等。)。 
 
推荐系统
一个推荐系统 是信息过滤系统,试图预测的“评级”或“偏爱”,用户将给予项目的一个子类。近年来,推荐系统变得越来越流行,并被广泛应用于电影、音乐、新闻、书籍、研究文章、搜索查询、社交标签和一般产品等各个领域。
推荐系统通常以两种方式之一生成推荐列表——通过协作和基于内容的过滤或基于个性的方法。 
  1. 协同过滤方法根据用户过去的行为(之前购买或选择的项目和/或给这些项目的数字评级)以及其他用户做出的类似决定来构建模型。然后使用该模型来预测用户可能感兴趣的项目(或项目的评分)。
  2. 基于内容的过滤方法利用项目的一系列离散特征来推荐具有相似属性的其他项目。 

此外,这些方法通常组合为混合推荐系统。 
 
聚类
聚类是将一组对象以这样的方式分组的任务,即同一组(称为集群)中的对象彼此之间比其他组(集群)中的对象更相似(在某种意义上或另一种意义上)。因此,它是探索性数据挖掘的主要任务,也是统计数据分析的常用技术,用于许多领域,包括机器学习、模式识别、图像分析、信息检索、生物信息学、数据压缩和计算机图形学。
 
降维
降维 是通过获得一组主要变量来减少所考虑的随机变量数量的过程。可分为特征选择和特征提取。
  1. 特征选择:特征选择找到原始变量(也称为特征或属性)的子集。 
  2. 特征提取:将高维空间中的数据转换为维数较少的空间。数据变换可能是线性的,如主成分分析 (PCA),但也存在许多非线性降维技术。

 
特征提取
特征提取从一组初始测量数据开始,并构建旨在提供信息和非冗余的派生值(特征),促进后续的学习和泛化步骤,并在某些情况下导致更好的人类解释。这与降维有关。
 
优化
优化 是 从一组可用的备选方案中选择最佳元素(关于某些标准)。 
在最简单的情况下,优化问题包括通过系统地从允许的集合中选择输入值并计算函数值来最大化或最小化实际函数。优化理论和技术对其他公式的推广包含了大量的应用数学领域。更一般地说,优化包括在给定定义的域(或输入)的情况下找到某些目标函数的“最佳可用”值, 包括各种不同类型的目标函数和不同类型的域。
 
用例 - 电影推荐系统
问题陈述: 构建一个电影推荐系统,使用Apache Spark根据用户的喜好推荐电影。
我们的要求:
因此,让我们评估构建电影推荐系统的要求:
  1. 处理海量数据
  2. 来自多个来源的输入
  3. 使用方便
  4. 快速处理

由于我们可以评估我们的需求,因此我们需要最好的大数据工具来在短时间内处理大数据。因此,Apache Spark是实现我们的电影推荐系统的完美工具。
使用来自 Spark Streaming 的 Streaming。我们可以实时流式传输或从 Hadoop HDFS 读取数据。
  • 获取数据集:

对于我们的电影推荐系统,我们可以从 IMDB、Rotten Tomatoes 和 Times Movie Ratings 等许多流行网站获取用户评分。该数据集有多种格式,例如 CSV 文件、文本文件和数据库。我们可以从网站实时流式传输数据,也可以下载并将它们存储在我们的本地文件系统或 HDFS 中。
  • 机器学习:

整个推荐系统基于机器学习算法交替最小二乘法。在这里,ALS 是一种回归分析,其中回归用于在数据点之间画一条线,以使与每个数据点的距离的平方和最小化。因此,这条线随后用于预测函数在满足自变量值的情况下的值。
Spark MLlib 实现:
  1. 我们将使用协同过滤 (CF) 根据用户对其他电影的评分来预测用户对特定电影的评分。
  2. 然后我们将其与其他用户对该特定电影的评分进行协作。
  3. 为了从我们的机器学习中获得以下结果,我们需要使用 Spark SQL 的 DataFrame、Dataset 和 SQL Service。

这是我们程序的伪代码:
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating
import org.apache.spark.SparkConf
//Import other necessary packages
 
object Movie {
def main(args: Array[String]) {
 
val conf = new SparkConf().setAppName(
"Movie").setMaster("local[2]")
val sc = new SparkContext(conf)
val rawData = sc.textFile(
" *Read Data from Movie CSV file* ")
 
//rawData.first()
val rawRatings = rawData.map( *Split rawData on tab delimiter* )
val ratings = rawRatings.map { *Map case array of User, Movie and Rating* }
 
//Training the data
val model = ALS.train(ratings, 50, 5, 0.01)
model.userFeatures
model.userFeatures.count
model.productFeatures.count
val predictedRating = *Predict for User 789 for movie 123*
val userId = *User 789*
val K = 10
val topKRecs = model.recommendProducts( *Recommend for User for the particular value of K* )
println(topKRecs.mkString(
"
"))
val movies = sc.textFile(
" *Read Movie List Data* ")
val titles = movies.map(line => line.split(
"|").take(2)).map(array => (array(0).toInt,array(1))).collectAsMap()
val titlesRDD = movies.map(line => line.split(
"|").take(2)).map(array => (array(0).toInt,array(1))).cache()
titles(123)
val moviesForUser = ratings.*Search for User 789*
val sqlContext= *Create SQL Context*
val moviesRecommended = sqlContext.*Make a DataFrame of recommended movies*
moviesRecommended.registerTempTable(
"moviesRecommendedTable")
sqlContext.sql(
"Select count(*) from moviesRecommendedTable").foreach(println)
moviesForUser. *Sort the ratings for User 789* .map( *Map the rating to movie title* ). *Print the rating*
val results = moviesForUser.sortBy(-_.rating).take(30).map(rating => (titles(rating.product), rating.rating))
 }
}

生成预测后,我们可以使用 Spark SQL 将结果存储到 RDBMS 系统中。此外,这可以显示在 Web 应用程序上。