spark1.0.0 mllib机器学习库使用初探

本文机器学习库使用的部分代码来源于spark1.0.0官方文档

mllib是spark对机器学习算法和应用的实现库,包括分类、回归、聚类、协同过滤、降维等,本文的主要内容为如何使用scala语言创建sbt工程实现机器学习算法,并进行本地和集群的运行。(初学者建议先在RDD交互式模式下按行输入代码,以熟悉scala架构)若想了解SBT等相关信息,可参见这里

1.SVM(linear support vector machine)

  • 新建SimpleSVM目录,在SimpleSVM目录下,创建如下的目录结构:

  • simple.sbt文件内容如下:
name := "SimpleSVM Project"
version := "1.0"
scalaVersion := "2.10.4"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.0.0"
libraryDependencies += "org.apache.spark" %% "spark-mllib" % "1.0.0"
resolvers += "Akka Repository" at "http://repo.akka.io/releases/"

PS:由于该应用需要调用mllib,因此要特别注意在libraryDependencies加入spark-mllib,否则会编译不通过的哦。

  • SimpleApp.scala文件内容如下:
import org.apache.spark.SparkContext
import org.apache.spark.mllib.classification.SVMWithSGD
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object SimpleApp{
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("SimpleSVM Application")
    val sc = new SparkContext(conf)
    val data = MLUtils.loadLibSVMFile(sc, "mllib/test50.txt")

    val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)
    val training = splits(0).cache()
    val test = splits(1)

    val numIterations = 100
    val model = SVMWithSGD.train(training, numIterations)

    model.clearThreshold()

    val scoreAndLabels = test.map { point =>
      val score = model.predict(point.features)
      (score, point.label)
    }

    val metrics = new BinaryClassificationMetrics(scoreAndLabels)
    val auROC = metrics.areaUnderROC()

    println("Area under ROC = " + auROC)
  }
}

PS:由于我们之前在spark配置过程中将hadoop路径配置好了,因此这里的输入路径mllib/test50.txt

实际上为HDFS文件系统中的文件,存储位置与hadoop配置文件core-site.xml中的<name>相关(具体可参见这里,这个地方很容易出错)。因此需要先将test50.txt文件puthdfs上面,另外test50.txt文件为libsvm文件的输入格式,实例如下:

  • 编译:

     cd ~/SimpleSVM

  sbt package     #打包过程,时间可能会比较长,最后会出现[success]XXX

  PS:成功后会生成许多文件 target/scala-2.10/simplesvm-project_2.10-1.0.jar

  • 本地运行:

  spark-submit --class "SimpleApp" --master local target/scala-2.10/simplesvm-project_2.10-1.0.jar

  • 集群运行:

      spark-submit --class "SimpleApp" --master spark://master:7077 target/scala-2.10/simplesvm-project_2.10-1.0.jar

  • 结果:

PS:若希望在算法中添加正则项因子,可将SimpleApp.scala文件修改如下:

import org.apache.spark.mllib.optimization.L1Updater

val svmAlg = new SVMWithSGD()
svmAlg.optimizer.
  setNumIterations(200).
  setRegParam(0.1).
  setUpdater(new L1Updater)
val modelL1 = svmAlg.run(training)

2.逻辑回归(Logistic Regression)

同理,若要实现逻辑回归算法则只需将SimpleApp.scala文件中的SVMWithSGD替换为 LogisticRegressionWithSGD

3. 协同过滤(Collaborative filtering)

文件系统如上所示,协同过滤算法可以将只需将SimpleApp.scala文件进行如下修改:

import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object SimpleApp{
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("SimpleCF Application")
    val sc = new SparkContext(conf)
    val data = sc.textFile("mllib/test.data")

    val ratings = data.map(_.split(‘,‘) match { case Array(user, item, rate) =>
        Rating(user.toInt, item.toInt, rate.toDouble)
       })

    val rank = 10
    val numIterations = 5
    val model = ALS.train(ratings, rank, numIterations, 0.01)

    val usersProducts = ratings.map { case Rating(user, product, rate) =>
       (user, product)
    }
    val predictions =
       model.predict(usersProducts).map { case Rating(user, product, rate) =>
          ((user, product), rate)
     }
    val ratesAndPreds = ratings.map { case Rating(user, product, rate) =>
       ((user, product), rate)
    }.join(predictions)
    val MSE = ratesAndPreds.map { case ((user, product), (r1, r2)) =>
       val err = (r1 - r2)
       err * err
    }.mean()
    println("Mean Squared Error = " + MSE)
  }
}

PS:同理,mllib/test.data存储于HDFS文件系统,为示例数据:

  • 本地运行:

  spark-submit --class "SimpleApp" --master local target/scala-2.10/simplecf-project_2.10-1.0.jar

  • 集群运行:

      spark-submit --class "SimpleApp" --master spark://master:7077 target/scala-2.10/simplecf-project_2.10-1.0.jar

  • 结果:

PS:可以加入alpha参数控制:

val alpha = 0.01
val model = ALS.trainImplicit(ratings, rank, numIterations, alpha)
同理聚类算法、降维方法代码可参见这里

本文为原创博客,若转载请注明出处。

spark1.0.0 mllib机器学习库使用初探

时间: 2024-10-07 13:37:23

spark1.0.0 mllib机器学习库使用初探的相关文章

Spark1.0.0 生态圈一览

Spark生态圈,也就是BDAS(伯克利数据分析栈),是伯克利APMLab实验室精心打造的,力图在算法(Algorithms).机器(Machines).人(People)之间通过大规模集成,来展现大数据应用的一个平台,其核心引擎就是Spark,其计算基础是弹性分布式数据集,也就是RDD. 通过Spark生态圈,AMPLab运用大数据.云计算.通信等各种资源,以及各种灵活的技术方案,对海量不透明的数据进行甄别并转化为实用的信息.以供人们更好的理解世界.Spark生态圈已经涉及到机器学习.数据挖掘

Spark1.0.0新特性

Spark1.0.0 release于2014-05-30日正式公布,标志Spark正式进入1.X的时代.Spark1.0.0带来了各种新的特性,并提供了更好的API支持:Spark1.0.0添加了Spark SQL这一个新的重要组件,用于载入和操作Spark的结构化数据:Spark1.0.0增强了现有的标准库(ML,streaming,GraphX),同一时候还增强了Java和Python语言的支持:最后,Spark1.0.0在运维上做了非常大的改进,包含支持Hadoop/YARN安全机制.使

Spark MLlib(下)--机器学习库SparkMLlib实战

1.MLlib实例 1.1 聚类实例 1.1.1 算法说明 聚类(Cluster analysis)有时也被翻译为簇类,其核心任务是:将一组目标object划分为若干个簇,每个簇之间的object尽可能相似,簇与簇之间的object尽可能相异.聚类算法是机器学习(或者说是数据挖掘更合适)中重要的一部分,除了最为简单的K-Means聚类算法外,比较常见的还有层次法(CURE.CHAMELEON等).网格算法(STING.WaveCluster等),等等. 较权威的聚类问题定义:所谓聚类问题,就是给

Spark入门实战系列--8.Spark MLlib(下)--机器学习库SparkMLlib实战

[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.MLlib实例 1.1 聚类实例 1.1.1 算法说明 聚类(Cluster analysis)有时也被翻译为簇类,其核心任务是:将一组目标object划分为若干个簇,每个簇之间的object尽可能相似,簇与簇之间的object尽可能相异.聚类算法是机器学习(或者说是数据挖掘更合适)中重要的一部分,除了最为简单的K-Means聚类算法外,比较常见的还有层次法(CURE.CHAMELEON等).网

Spark-1.4.0单机部署(Hadoop-2.6.0采用伪分布式)【已测】

??目前手上只有一个机器,就先拿来练下手(事先服务器上没有安装软件)尝试一下Spark的单机部署. ??几个参数: ??JDK-1.7+ ??Hadoop-2.6.0(伪分布式): ??Scala-2.10.5: ??Spark-1.4.0: ??下面是具体的配置过程 安装JDK 1.7+ [下载网址]http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 环境变量设置(最好不要采用o

Spark1.0.0属性配置

1:Spark1.0.0属性配置方式 Spark属性提供了大部分应用程序的控制项,并且可以单独为每个应用程序进行配置. 在Spark1.0.0提供了3种方式的属性配置: SparkConf方式 SparkConf方式可以直接将属性值传递到SparkContext: SparkConf可以对某些通用属性直接配置,如master使用setMaster,appname使用setAppName: 也可以使用set()方法对属性进行键-值对配置,如set("spark.executor.memory&qu

Ubuntu 12.04下spark1.0.0 集群搭建(原创)

spark1.0.0新版本的于2014-05-30正式发布啦,新的spark版本带来了很多新的特性,提供了更好的API支持,spark1.0.0增加了Spark SQL组件,增强了标准库(ML.streaming.GraphX)以及对JAVA和Python语言的支持: 下面,我们首先进行spark1.0.0集群的安装,在这里我使用了两台服务器,一台作为master即namenode主机,另一台作为slave即datanode主机,增加更多的slave只需重复slave部分的内容即可.: 系统版本

Spark1.0.0部署指南

1 节点说明   IP Role 192.168.1.111 ActiveNameNode 192.168.1.112 StandbyNameNode,Master,Worker 192.168.1.113 DataNode,Master,Worker 192.168.1.114 DataNode,Worker HDFS集群和Spark集群之间节点共用. 2 安装HDFS 见HDFS2.X和Hive的安装部署文档:http://www.cnblogs.com/Scott007/p/3614960

机器学习库初探之TensorFlow

什么是TensorFlow?1 TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor).它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等.TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深