This website requires JavaScript.

Apache Spark 大数据机器学习场景[译](未完待续)

你想建立机器学习模型,发现你电脑的配置不够的时候,你通常会在群集中使用Apache Spark这样的分布式计算工具处理处理。然而Apache Spark是有本地(standalone mode)模式可以来处理超过你计算机内存的数据。本文会为你展示二元分类器(binary classification model)处理34.6GB的数据。该场景需要你的笔记本拥有4-8G内存,以及50G+的磁盘容量。

原文**[Beginners Guide: Apache Spark Machine Learning Scenario With A Large Input Dataset](https://fullstackml.com/2015/10/29/beginners-guide-apache-spark-machine-learning-scenario-with-a-large-input-dataset/)**

Input data and expected results

前一篇博文中,我们讨论了“如何找到简单有趣的大数据(GB级)" 。本文会使用其中的Posts.xml文件。该文件的体积为34.6GB。该xml文件包含stackoverflow.com的帖子属性:

1.Title – post title 2.Body – post text 3.Tags – list of tags for post 4.10+ more xml-attributes that we won’t use.

全量数据可以在https://archive.org/details/stackexchange下载。另外我创建了一个小集合(每个post就10项数据)。 数据的授权为 Creative Commons license (cc-by-sa)。

正如你想的那样,这个小文件不适合做模型训练。这个文件只适合验证代码。不过本文的内容小文件也是可以用的,请点此下载。

我们将建立一个预测模型(predictive model) ,根据帖子内容级标题预测帖子的标签。为了简化任务及代码量,我们打算连接标题和内容,把它们当一个文本列。

我们很容易想到这个模型在stackoverflow.com的应用场景--用户输入一个问题,然后站点自动给出标签建议。

Binary and multi-label classification

stackoverflow的问题是标签分类,因为模型要预测多个类别,并不排他。 比如同样的文本可能被归类为“Java”或者“Multithreading”。 注意多标记分类是不同的问题的概括——多分类问题,从一组类中只能预测一个类。

多标签分类是stackoverflow标签预测的一个问题,因为模型应该预测许多类,不排斥。相同的文本会被归类为“Java”和“多线程”。注意多类分类问题从一组类预测只有一个类。

为了简化我们第一个Apache Spark的问题和代码量,让我们简化我们的问题。我们为标签进行简单的二元分类器(binary classifier)训练来代替多标签分类器(multi-label classifier)训练。比如,标签“Java” 会创建一个分类器,预测帖子是关于Java语言的。

通过这个简单的方法,许多分类器覆盖大多频繁的标签 (Java, C++, Python, multi-threading 等…). 这种方法很简单,有利于学习。然而,它在实践中并不完美,因为拆分不同的分类器你会忽略不同类别之间的相关性。 另一个原因——训练多分类器可能需要大量的计算。

Setup and Run Apache Spark in a standalone mode

如果你的机器上没有Spark可以从Spark官方下载。 请使用1.5.1版本。预编译之间连接为http://d3kbcqa49mib13.cloudfront.net/spark-1.5.1-bin-hadoop2.6.tgz

如果你电脑有Java环境,那么就可以使用Spark的Standalone模式了。

如果你使用的是类Unix系统或者Macs,解压文件然后拷贝到任何目录就可以了。

Run spark master:

sbin/start-master.sh

Run spark slave:

sbin/start-slaves.sh

Run Spark shell:

bin/spark-shell

Spark shell 以交互式来运行你的Scala命令。

Windows 用户可以参考这篇文章来运行Spark http://nishutayaltech.blogspot.in/2015/04/how-to-run-apache-spark-on-windows7-in.html

Importing libraries

本文环境将使用Scala语言

// General purpose library
import scala.xml._

// Spark data manipulation libraries
import org.apache.spark.sql.catalyst.plans._
import org.apache.spark.sql._
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._

// Spark machine learning libraries
import org.apache.spark.ml.feature.{HashingTF, Tokenizer}
import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import org.apache.spark.ml.Pipeline

Parsing XML

我们需要从输入的xml文件中提取主题,文本,和标签。 然后为这些列创建一个data-frame。 首先让我们移除xml header 和 footer。

val fileName = "Posts.small.xml"
val textFile = sc.textFile(fileName)
val postsXml = textFile.map(_.trim).
                    filter(!_.startsWith("<?xml version=")).
                    filter(_ != "<posts>").
                    filter(_ != "</posts>")
0条评论
avatar