实践篇:使用Spark和Scala来训练您的第一个分类器!
点击上方关注,All in AI中国
许多人使用Python和Sklearn开始了他们的机器学习之旅。如果您想使用大数据,则必须使用Apache Spark。可以使用Pyspark在Python中使用Spark。但是,由于Spark是用Scala编写的,因此使用Scala可以看到更好的性能。市面上有很多关于如何在计算机上启动和运行Spark的教程,所以我这里就不详细介绍了。我这里只建议快速入门的两种方法是使用docker镜像或Databricks的社区版本。让我们开始吧!
我更喜欢使用spark-shell,并启用颜色选项启动它:
这些导入将有助于在spark-shell内部进行文件导航:
接下来是我们所有的进口产品。看起来有些重复;这是因为Spark RDD-API中的一些功能尚未移植到较新的Spark Dataframe-API:
如果您不使用spark-shell,则可能需要以下额外的导入。 spark-shell自动创建一个spark上下文为“sc”,spark会话为“spark”。
现在我们可以加载数据了。我使用哈佛EdX数据集作为例子。
(https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/26147)注意:我不会做很多特征工程,因为我想专注于在Spark中训练模型的机制。最后,我将有一个分类器,用于预测学生是否通过基于整个课程积累的数据的课程。它最好有一个好成绩!创建一个有用的模型需要对数据进行特征化,以便根据您想要进行预测时所知道的内容来训练模型。我们开始:
Spark模型只需要两列:“label”和“features”。要做到这一点,首先,我们将使用select方法识别我们的标签,同时仅保留相关列(请参阅上面关于特征工程的警告):
将整个方法调用放在一组括号中可以让你任意分解行,而不会引发异常的情况。
接下来,我们将对我们的分类功能进行一些热门编码。这需要几个步骤。首先,我们必须使用StringIndexer将字符串转换为整数。然后我们必须使用OneHotEncoderEstimator来进行编码。
接下来我们检查空值。在这个数据集中,我能够通过一些相对简单的代码找到空值的数量,但是根据数据,它可能更复杂:
检查完列后,我决定使用该列的中值来估算以下列的空值:nevents、ndays_act、nplay_video、nchapters。我是这样做的:
然后我们使用VectorAssembler对象来构造我们的“特征”列。请记住,Spark模型只需要两列:“标签”和“功能”。
现在我们将数据分成训练和测试集。
数据已设置好!现在我们可以创建一个模型对象(我使用的是随机森林分类器),定义一个参数网格(我保持它的简单性,只改变树的数量),创建一个Cross Validator对象(这里是我们设置评分指标的地方)用于训练模型)并适合模型。
警告:此代码需要一些时间才能运行!如果你有一台特别老旧/动力不足的电脑,那么就要注意了。
现在我们有一个经过训练,交叉验证的模型!您可以通过键入“model。”然后按键盘上的tab键来查看模型的属性和方法(请注意单词model后的句点)。我鼓励你花一些时间来了解这个模型对象是什么以及它能做些什么。
现在是一些模型评估的时候了。这有点困难,因为评估功能仍主要存在于Spark的RDD-API中,需要一些不同的语法。让我们首先对测试数据进行预测并存储它们。
然后我们将这些结果转换为RDD。
然后我们可以创建度量对象并输出混淆矩阵。
现在我们有了一些结果!您可以使用混淆矩阵中的数字来计算各种指标。 Spark会为我们这样做并输出,但语法略显庞大:
我们还可以计算更复杂的指标,如AUC和AUPRC:
我们已经训练和评估了我们的分类器!我希望你看到使用Apache Spark进行机器学习比使用Sklearn或H2O这样的库要复杂一点。通过允许处理大数据,这种额外的努力会得到回报。我鼓励您使用Spark ML 库中提供的不同型号。