六. Fregata的使用簡介
前面簡要介紹了Fregata算法庫涉及到的一些技術(shù)原理和性能對比,我們再來看看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倉庫,可以通過在命令中執(zhí)行如下命令來完成:
git clone https://github.com/TalkingData/Fregata.gitcd Fregatamvn clean package install
接下來,讓我們以Logistic Regression為例來看看如何快速使用Fregata完成分類任務(wù):
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接口加載訓(xùn)練及測試數(shù)據(jù)集,訓(xùn)練及測試數(shù)據(jù)集為標準LibSvm格式,可參照[10]
val (_, trainData) = LibSvmReader.read(sc, trainPath, numFeatures.toInt) val (_, testData) = LibSvmReader.read(sc, testPath, numFeatures.toInt)
3. 針對訓(xùn)練樣本訓(xùn)練Logsitic Regression 模型
val model = LogisticRegression.run(trainData)
4. 基于已經(jīng)訓(xùn)練完畢的模型對測試樣本進行預(yù)測
val pd = model.classPredict(testData)
5. 通過Fregata內(nèi)置指標評價模型效果
val auc = AreaUnderRoc.of( pd.map{ case ((x,l),(p,c)) => p -> l })
在Fregata中,使用breeze.linalg.Vector[Double]來存儲一個樣本的特征,如果數(shù)據(jù)格式已經(jīng)是LibSvm,則只需通過Fregata內(nèi)部的接口LibSvmReader.read(…)來加載即可。否則,可以采用如下的方法將代表實例的一組數(shù)據(jù)封裝成breeze.linalg.Vector[Double]即可放入模型中進行訓(xùn)練及測試。
// indices Array類型,下標從0開始,保存不為0的數(shù)據(jù)下標// values Array類型, 保存相應(yīng)于indices中對應(yīng)下標的數(shù)據(jù)值// length Int類型,為樣本總特征數(shù)// label Double類型,為樣本的標簽。如果是測試數(shù)據(jù),則不需該字段sc.textFile(input).map{val indicies = ...val values = ...val label = ......(new SparseVector(indices, values, length).asInstanceOf[Vector], asNum(label))}
七. Freagata的發(fā)展目標
Fregata目前集成的算法還不多,未來還會繼續(xù)擴充更多的高效的大規(guī)模機器學(xué)習(xí)算法。Fregata項目追求的目標有3個:輕量級,高性能,易使用。
輕量級是指Fregata將盡可能在標準Spark版本上實現(xiàn)算法,不另外搭建計算系統(tǒng),使得Fregata能夠非常容易的在標準Spark版本上使用。雖然Spark有一些固有的限制,比如對模型規(guī)模的限制,但是作為目前大數(shù)據(jù)處理的基礎(chǔ)工具,F(xiàn)regata對其的支持能夠大大降低大規(guī)模機器學(xué)習(xí)的應(yīng)用門檻。畢竟另外搭建一套專用大規(guī)模機器學(xué)習(xí)計算平臺,并整合到整個大數(shù)據(jù)處理平臺和流程中,其成本和復(fù)雜性也是不可忽視的。
高性能就是堅持高精度和高效率并舉的目標,盡可能從算法上和工程實現(xiàn)上將算法的精度和效率推到極致,使得大規(guī)模機器學(xué)習(xí)算法從笨重的牛刀變成輕快的匕首。目前對Fregata一個比較大的限制就是模型規(guī)模的問題,這是基于Spark天生帶來的劣勢。未來會采用一些模型壓縮的方法來緩解這個問題。
易使用也是Fregata追求的一個目標,其中最重要的一點就是降低調(diào)參的難度。目前的三個算法中有兩個是免調(diào)參的,另一個也是相對來說調(diào)參比較友好的算法。降低了調(diào)參的難度,甚至是免去了調(diào)參的問題,將大大降低模型應(yīng)用的難度和成本,提高工作效率。
另一方面我們也會考慮某些常用場景下的特殊需求,比如LR算法的特征交叉需求。雖然通用的LR算法效率已經(jīng)很高,但是對于特征交叉這種常見需求,如果不把特征交叉這個過程耦合到算法中去,就需要預(yù)先將特征交叉好,這會帶來巨大的IO開銷。而算法實現(xiàn)了對特征交叉的支持,就規(guī)避了這個效率瓶頸。未來在集成更多的算法的同時,也會考慮各種常用的場景需要特殊處理的方式。