轻量级大规模机器学习算法库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.gitcd Fregatamvn clean package install

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

1.引入所需包

import fregata.spark.data.LibSvmReaderimport fregata.spark.metrics.classification.{AreaUnderRoc, Accuracy}import fregata.spark.model.classification.LogisticRegressionimport 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追求的一个目标,其中最重要的一点就是降低调参的难度。目前的三个算法中有两个是免调参的,另一个也是相对来说调参比较友好的算法。降低了调参的难度,甚至是免去了调参的问题,将大大降低模型应用的难度和成本,提高工作效率。

另一方面我们也会考虑某些常用场景下的特殊需求,比如LR算法的特征交叉需求。虽然通用的LR算法效率已经很高,但是对于特征交叉这种常见需求,如果不把特征交叉这个过程耦合到算法中去,就需要预先将特征交叉好,这会带来巨大的IO开销。而算法实现了对特征交叉的支持,就规避了这个效率瓶颈。未来在集成更多的算法的同时,也会考虑各种常用的场景需要特殊处理的方式。