摘要
Spark机器学习的数据准备
机器学习从业者和数据科学家时常耗费70%或80%的时间为机器学习项目准备数据。数据准备可能是很艰辛的工作,但是它影响到接下来的各方面工作,因此是非常必要和极其重要的。所以,在本章中,我们将讨论机器学习中所有必要的数据准备方面的内容,通常包括数据获取、数据清洗、数据集连接,再到特征开发,从而让我们为基于Spark平台构建机器学习模型准备好数据集。具体而言,我们将讨论前面提到的以下6个数据准备任务,然后在针对复用性和自动化的讨论中结束本章:
访问和加载数据集
开放可用的机器学习数据集
将数据集加载到Spark
使用Spark进行数据探索和可视化
数据清洗
处理数据缺失与不完整
基于Spark的数据清洗
数据清洗变得容易
一致性匹配
处理一致性问题
基于Spark的数据匹配
获得更好的数据匹配效果
数据重组
数据重组任务
基于Spark的数据重组
数据重组变得容易
数据连接
Spark SQL数据集连接
使用Spark SQL进行数据连接
数据连接变得容易
特征提取
特征提取的挑战
基于Spark的特征提取
特征提取变得容易
复用性和自动化
数据集预处理工作流
Spark pipelines预处理
数据集预处理自动化
2.1 访问和加载数据集
在本节,我们将回顾一些公开可用的数据集,并且讨论加载这些数据集到Spark的方法。然后,我们将回顾九种Spark上探索和可视化数据集的方法。
学习完本节,我们能够获取一些可用的数据集,把它们加载到Spark,然后开始对数据进行探索和可视化。
2.1.1 访问公开可用的数据集
就像程序开源运动使软件免费一样,也有非常活跃的数据开放运动,使得每一个研究者和分析师都可以自由获取这些数据。在全世界范围内,大多数国家政府收集的数据集是向公众开放的。例如http://www.data.gov/,这个网站有超过14万的数据集可供免费使用,包括农业、金融和教育等领域。
除了来自各政府机构的开放数据,许多研究机构也收集了很多非常有用的数据集,并且可被公众所用。这本书中我们将使用的有如下几个数据集:
印第安纳大学提供一个非常丰富的数据集,包括535亿个HTTP地址。想获取这些数据,请访问:http://cnets.indiana.edu/groups/nan/webtraffic/click-dataset/。
广为人知的加州大学欧文分校机器学习库提供超过300个数据集可供探索。想获取他们的数据集,请访问:https://archive.ics.uci.edu/ml/datasets.html。
匹兹堡大学的Tycho?项目提供了自1888年以来美国境内所有须向卫生署报告的疾病报告,这些报告以周为单位。想获取他们的数据集,请访问:http://www.tycho.pitt.edu/。
ICPSR拥有许多体量并不是很大,但是质量非常好,并且可用于研究的数据集。想获取他们的数据集,请访问:http://www.icpsr.umich.edu/index.html。
另外一个众所周知的数据集是1987年~2008年的航线性能数据,它的体量巨大,拥有1.2亿条记录,已经被用在许多研究和少量比赛中。想获取这些的数据集,请访问:http://statcomputing.org/dataexpo/2009/the-data.html。
2.1.2 加载数据集到Spark
有许多方法可以将数据集加载到Spark平台,或者直接连接数据源到Spark平台。由于Apache Spark每三周更新一次,其功能在不断提升,更新、更方便的加载数据方法,以及展现数据的方法有望能够及时提供给用户。
举例来说,在Spark 1.3版本以前, JdbcRDD是连接关系型数据源和传输数据元素到RDD的最受欢迎的方式。但是,从Spark 1.4版本开始,它通过一个内置的数据源API连接到任意一个使用Dataframe的 JDBC数据源。
加载数据并不是一个简单的任务,因为它通常涉及转换或解析原始数据,以及处理数据格式转换。Spark数据源API允许用户使用基于DataSource API的库来读取和写入来自不同系统的不同格式的DataFrame。同时,由于使用了Spark SQL查询优化器技术,Spark数据源API的数据存取功能十分高效。
想要加载DataFrame的数据集,最好使用sqlContext.load。为此,我们需要说明以下内容:
数据源名称:这是我们加载的数据源。
选项:对于特定的数据源有一些参数,例如,数据路径。
举例来说,我们可以使用下面的代码:
要导出数据集,用户可以使用dataframe.save或df.write来保存处理过的DataFrame到一个数据源。具体说明如下:
数据源名称:这是我们要保存的数据源。
保存模式:这是当数据已经存在时,我们应该做的。
选项:对于特定的数据源有一些参数,例如,数据路径。
creatExternalTable和SaveAsTable命令也是非常有用的。
有关使用Spark DataSource API的更多信息,请访问:https://databricks.com/blog/2015/01/09/spark-sql-data-sources-api-unified-data-access-for-the-spark-platform.html。
2.1.3 数据集探索和可视化
在Apache Spark中,有很多方法来进行一些数据集的初步探索和可视化,这些数据集可以使用不同的工具加载。用户可以直接通过Spark Shell使用Scala语言或Python语言。或者,用户可以使用notebook方法,就是在Spark环境中使用R语言或Python语言的notebook,类似DataBricks Workspace。另一种方法是使用Spark的MLlib。
或者,用户可以直接使用Spark SQL及其相关库,如广受欢迎的Panda库,进行一些简单的数据探索。
如果数据集已经转化成Spark DataFrame,用户可以使用df.describe().show()获取一些简单的含样本总体特征的统计数据,例如所有列(变量)的均值、标准差、最小值和最大值。
如果DataFrame有很多列,用户应当使用df.describe(column1, column2, …).show()语句来指定列,以便于仅获取他们感兴趣的列的描述性统计数据。你也可以只使用这个命令选择你需要的统计数据:
除此之外,一些经常使用的协方差、相关运算、交叉列表命令如下:
如果使用DataBricks workspace,用户可以创建R notebook,那么他们将回到熟悉的R语言环境中,并且可以访问所有的R语言程序包,他们可以使用notebook方法进行数据集的交互探索和可视化研究。看一看下面的例子:
从现在开始,我们将会大量地使用DataBricks Workspace,建议用户在https://accounts.cloud.databricks.com/registration.html#signup注册一个试用账号。在网站主菜单栏的左上角设置一些群集,具体如下:
然后,用户可以到相同的主菜单中,单击“Workspace”右侧的向下箭头并导航到“Create | New Notebook”,创建一个notebook,如下图所示:
当出现Create Notebook对话框时,需要执行以下操作:
为你的notebook输入一个唯一的名字。
对于语言,单击下拉菜单,选择R语言。
对于集群,单击下拉菜单并选择你之前创建的集群。