轻量级大规模机器学习算法库Fregata开源:快速,(4)

我们也在公开数据集MNIST上测试了Softmax算法。 从图7中可以看到, Fregata Softmax也是一次扫描数据后在测试集上的AUC就非常接近最好的结果, 而MLLib Softmax需要扫描数据多达40多次以后才接近Fregata Softmax一次扫描数据的结果。对比两个算法在达到各自最优结果所花的时间,MLLib Softmax是Fregata Softmax的50倍以上。

轻量级大规模机器学习算法库Fregata开源:快速,

六. Fregata的使用简介

前面简要介绍了Fregata算法库涉及到的一些技术原理和性能对比,我们再来看看Fregata的使用方式。可以通过3种不同的方式来获取Fregata如果使用Maven来管理工程,则可以通过添加如下代码在pom.xml中进行引入,

<dependency> <groupId>com.talkingdata.fregata</groupId> <artifactId>core</artifactId> <version>0.0.1</version> </dependency> <dependency> <groupId>com.talkingdata.fregata</groupId> <artifactId>spark</artifactId> <version>0.0.1</version> </dependency>

如果使用SBT来管理工程,则可以通过如下代码在build.sbt中进行引入,

// 如果手动部署到本地maven仓库,请将下行注释打开 // resolvers += Resolver.mavenLocal libraryDependencies += "com.talkingdata.fregata" % "core" % "0.0.1" libraryDependencies += "com.talkingdata.fregata" % "spark" % "0.0.1"

如果希望手动部署到本地maven仓库,可以通过在命令中执行如下命令来完成:

git clone https://github.com/TalkingData/Fregata.git cd Fregata mvn clean package install

接下来,让我们以Logistic Regression为例来看看如何快速使用Fregata完成分类任务:

1.引入所需包

import fregata.spark.data.LibSvmReader import fregata.spark.metrics.classification.{AreaUnderRoc, Accuracy} import fregata.spark.model.classification.LogisticRegression import org.apache.spark.{SparkConf, SparkContext}

2. 通过Fregata的LibSvmReader接口加载训练及测试数据集,训练及测试数据集为标准LibSvm格式,可参照[10]

val (_, trainData) = LibSvmReader.read(sc, trainPath, numFeatures.toInt) val (_, testData) = LibSvmReader.read(sc, testPath, numFeatures.toInt)

3. 针对训练样本训练Logsitic Regression 模型

val model = LogisticRegression.run(trainData)

4. 基于已经训练完毕的模型对测试样本进行预测

val pd = model.classPredict(testData)

5. 通过Fregata内置指标评价模型效果

val auc = AreaUnderRoc.of( pd.map{ case ((x,l),(p,c)) => p -> l })

在Fregata中,使用breeze.linalg.Vector[Double]来存储一个样本的特征,如果数据格式已经是LibSvm,则只需通过Fregata内部的接口LibSvmReader.read(…)来加载即可。否则,可以采用如下的方法将代表实例的一组数据封装成breeze.linalg.Vector[Double]即可放入模型中进行训练及测试。

// indices Array类型,下标从0开始,保存不为0的数据下标 // values Array类型, 保存相应于indices中对应下标的数据值 // length Int类型,为样本总特征数 // label Double类型,为样本的标签。如果是测试数据,则不需该字段 sc.textFile(input).map{ val indicies = ... val values = ... val label = ... ... (new SparseVector(indices, values, length).asInstanceOf[Vector], asNum(label)) }

七. Freagata的发展目标

Fregata目前集成的算法还不多,未来还会继续扩充更多的高效的大规模机器学习算法。Fregata项目追求的目标有3个:轻量级,高性能,易使用。

轻量级是指Fregata将尽可能在标准Spark版本上实现算法,不另外搭建计算系统,使得Fregata能够非常容易的在标准Spark版本上使用。虽然Spark有一些固有的限制,比如对模型规模的限制,但是作为目前大数据处理的基础工具,Fregata对其的支持能够大大降低大规模机器学习的应用门槛。毕竟另外搭建一套专用大规模机器学习计算平台,并整合到整个大数据处理平台和流程中,其成本和复杂性也是不可忽视的。

高性能就是坚持高精度和高效率并举的目标,尽可能从算法上和工程实现上将算法的精度和效率推到极致,使得大规模机器学习算法从笨重的牛刀变成轻快的匕首。目前对Fregata一个比较大的限制就是模型规模的问题,这是基于Spark天生带来的劣势。未来会采用一些模型压缩的方法来缓解这个问题。

易使用也是Fregata追求的一个目标,其中最重要的一点就是降低调参的难度。目前的三个算法中有两个是免调参的,另一个也是相对来说调参比较友好的算法。降低了调参的难度,甚至是免去了调参的问题,将大大降低模型应用的难度和成本,提高工作效率。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8f66bd6f49ebf00c77532a99591a860f.html