本文是《Spark大數(shù)據(jù)處理》系列的第四篇,其他三篇:Spark介紹、 Saprk SQL和 Spark Streaming 。
最近幾年,機(jī)器學(xué)習(xí)、預(yù)測(cè)分析和數(shù)據(jù)科學(xué)主題得到了廣泛的關(guān)注。Spark的機(jī)器學(xué)習(xí)庫(kù)(Spark MLlib),包括各種機(jī)器學(xué)習(xí)算法:協(xié)同過(guò)濾算法、聚類算法、分類算法和其他算法。
在前面的《Spark大數(shù)據(jù)處理》系列文章,介紹Apache Spark框架,介紹如何使用Spark SQL庫(kù)的SQL接口去訪問(wèn)數(shù)據(jù),使用Spark Streaming進(jìn)行實(shí)時(shí)流式數(shù)據(jù)處理和分析。
在本篇文章,作者將討論機(jī)器學(xué)習(xí)概念以及如何使用Spark MLlib來(lái)進(jìn)行預(yù)測(cè)分析。后面將會(huì)使用一個(gè)例子展示Spark MLlib在機(jī)器學(xué)習(xí)領(lǐng)域的強(qiáng)悍。
Spark機(jī)器學(xué)習(xí)API包含兩個(gè)package:spark.mllib 和spark.ml。
spark.mllib 包含基于彈性數(shù)據(jù)集(RDD)的原始Spark機(jī)器學(xué)習(xí)API。它提供的機(jī)器學(xué)習(xí)技術(shù)有:相關(guān)性、分類和回歸、協(xié)同過(guò)濾、聚類和數(shù)據(jù)降維。
spark.ml提供建立在 DataFrame 的機(jī)器學(xué)習(xí)API,DataFrame是Spark SQL的核心部分。這個(gè)包提供開發(fā)和管理機(jī)器學(xué)習(xí)管道的功能,可以用來(lái)進(jìn)行特征提取、轉(zhuǎn)換、選擇器和機(jī)器學(xué)習(xí)算法,比如分類和回歸和聚類。
本篇文章聚焦在Spark MLlib上,并討論各個(gè)機(jī)器學(xué)習(xí)算法。下篇文章將講述Spark ML以及如何創(chuàng)建和管理數(shù)據(jù)管道。
機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)機(jī)器學(xué)習(xí)是從已經(jīng)存在的數(shù)據(jù)進(jìn)行學(xué)習(xí)來(lái)對(duì)將來(lái)進(jìn)行數(shù)據(jù)預(yù)測(cè),它是基于輸入數(shù)據(jù)集創(chuàng)建模型做數(shù)據(jù)驅(qū)動(dòng)決策。
數(shù)據(jù)科學(xué)是從海里數(shù)據(jù)集(結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù))中抽取知識(shí),為商業(yè)團(tuán)隊(duì)提供數(shù)據(jù)洞察以及影響商業(yè)決策和路線圖。數(shù)據(jù)科學(xué)家的地位比以前用傳統(tǒng)數(shù)值方法解決問(wèn)題的人要重要。
以下是幾類機(jī)器學(xué)習(xí)模型:
監(jiān)督學(xué)習(xí)模型非監(jiān)督學(xué)習(xí)模型半監(jiān)督學(xué)習(xí)模型增強(qiáng)學(xué)習(xí)模型下面簡(jiǎn)單的了解下各機(jī)器學(xué)習(xí)模型,并進(jìn)行比較:
監(jiān)督學(xué)習(xí)模型:監(jiān)督學(xué)習(xí)模型對(duì)已標(biāo)記的訓(xùn)練數(shù)據(jù)集訓(xùn)練出結(jié)果,然后對(duì)未標(biāo)記的數(shù)據(jù)集進(jìn)行預(yù)測(cè);監(jiān)督學(xué)習(xí)又包含兩個(gè)子模型:回歸模型和分類模型。非監(jiān)督學(xué)習(xí)模型:非監(jiān)督學(xué)習(xí)模型是用來(lái)從原始數(shù)據(jù)(無(wú)訓(xùn)練數(shù)據(jù))中找到隱藏的模式或者關(guān)系,因而非監(jiān)督學(xué)習(xí)模型是基于未標(biāo)記數(shù)據(jù)集的;半監(jiān)督學(xué)習(xí)模型:半監(jiān)督學(xué)習(xí)模型用在監(jiān)督和非監(jiān)督機(jī)器學(xué)習(xí)中做預(yù)測(cè)分析,其既有標(biāo)記數(shù)據(jù)又有未標(biāo)記數(shù)據(jù)。典型的場(chǎng)景是混合少量標(biāo)記數(shù)據(jù)和大量未標(biāo)記數(shù)據(jù)。半監(jiān)督學(xué)習(xí)一般使用分類和回歸的機(jī)器學(xué)習(xí)方法;增強(qiáng)學(xué)習(xí)模型: 增強(qiáng)學(xué)習(xí)模型 通過(guò)不同的行為來(lái)尋找目標(biāo)回報(bào)函數(shù)最大化。
下面給各個(gè)機(jī)器學(xué)習(xí)模型舉個(gè)列子:
監(jiān)督學(xué)習(xí):異常監(jiān)測(cè);非監(jiān)督學(xué)習(xí):社交網(wǎng)絡(luò),語(yǔ)言預(yù)測(cè);半監(jiān)督學(xué)習(xí):圖像分類、語(yǔ)音識(shí)別;增強(qiáng)學(xué)習(xí):人工智能(AI)。機(jī)器學(xué)習(xí)項(xiàng)目步驟開發(fā)機(jī)器學(xué)習(xí)項(xiàng)目時(shí),數(shù)據(jù)預(yù)處理、清洗和分析的工作是非常重要的,與解決業(yè)務(wù)問(wèn)題的實(shí)際的學(xué)習(xí)模型和算法一樣重要。典型的機(jī)器學(xué)習(xí)解決方案的一般步驟:
特征工程模型訓(xùn)練模型評(píng)估圖1
原始數(shù)據(jù)如果不能清洗或者預(yù)處理,則會(huì)造成最終的結(jié)果不準(zhǔn)確或者不可用,甚至丟失重要的細(xì)節(jié)。
訓(xùn)練數(shù)據(jù)的質(zhì)量對(duì)最終的預(yù)測(cè)結(jié)果非常重要,如果訓(xùn)練數(shù)據(jù)不夠隨機(jī),得出的結(jié)果模型不精確;如果數(shù)據(jù)量太小,機(jī)器學(xué)習(xí)出的模型也不準(zhǔn)確。
使用案例:
業(yè)務(wù)使用案例分布于各個(gè)領(lǐng)域,包括個(gè)性化推薦引擎,數(shù)據(jù)預(yù)測(cè)分析,廣告,異常監(jiān)測(cè),圖像和視頻模型識(shí)別,以及其他各類人工智能。
接著來(lái)看兩個(gè)比較流行的機(jī)器學(xué)習(xí)應(yīng)用:個(gè)性化推薦引擎和異常監(jiān)測(cè)。
推薦引擎個(gè)性化推薦引擎使用商品屬性和用戶行為來(lái)進(jìn)行預(yù)測(cè)。推薦引擎一般有兩種算法實(shí)現(xiàn):基于內(nèi)容過(guò)濾和協(xié)同過(guò)濾。
協(xié)調(diào)過(guò)濾的解決方案比其他算法要好,Spark MLlib實(shí)現(xiàn)了 ALS協(xié)同過(guò)濾算法 。Spark MLlib的協(xié)同過(guò)濾有兩種形式: 顯式反饋和隱試反饋 。顯式反饋是基于用戶購(gòu)買的商品(比如,電影),顯式反饋雖好,但很多情況下會(huì)出現(xiàn)數(shù)據(jù)傾斜;隱試反饋是基于用戶的行為數(shù)據(jù),比如,瀏覽、點(diǎn)擊、喜歡等行為。隱試反饋現(xiàn)在大規(guī)模應(yīng)用在工業(yè)上進(jìn)行數(shù)據(jù)預(yù)測(cè)分析,因?yàn)槠浜苋菀资占黝悢?shù)據(jù)。
另外有基于模型的方法實(shí)現(xiàn)推薦引擎,這里暫且略過(guò)。
異常監(jiān)測(cè)異常監(jiān)測(cè)是機(jī)器學(xué)習(xí)中另外一個(gè)應(yīng)用非常廣泛的技術(shù),因?yàn)槠淇梢钥焖俸蜏?zhǔn)確地解決金融行業(yè)的棘手問(wèn)題。金融服務(wù)業(yè)需要在幾百毫秒內(nèi)判斷出一筆在線交易是否非法。神經(jīng)網(wǎng)絡(luò)技術(shù)被用來(lái)進(jìn)行銷售點(diǎn)的異常監(jiān)測(cè)。比如像PayPal等公司使用不同的機(jī)器學(xué)習(xí)算法(比如,線性回歸,神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí))來(lái)進(jìn)行風(fēng)險(xiǎn)管理。
Spark MLlib庫(kù)提供給了幾個(gè)實(shí)現(xiàn)的算法,比如,線性SVM、邏輯回歸、決策樹和貝葉斯算法。另外,一些集成模型,比如隨機(jī)森林和gradient-boosting樹。那么現(xiàn)在開始我們的使用Apache Spark框架進(jìn)行機(jī)器學(xué)習(xí)之旅。
Spark MLlibSpark MLlib實(shí)現(xiàn)的機(jī)器學(xué)習(xí)庫(kù)使得機(jī)器學(xué)習(xí)模型可擴(kuò)展和易使用,包括分類算法、回歸算法、聚類算法、協(xié)同過(guò)濾算法、降維算法,并提供了相應(yīng)的API。除了這些算法外,Spark MLlib還提供了各種數(shù)據(jù)處理功能和數(shù)據(jù)分析工具為大家使用:
通過(guò)FP-growth算法進(jìn)行頻繁項(xiàng)集挖掘和關(guān)聯(lián)分析;通過(guò)PrefixSpan算法進(jìn)行序列模式挖掘;提供概括性統(tǒng)計(jì)和假設(shè)檢驗(yàn);提供特征轉(zhuǎn)換;機(jī)器學(xué)習(xí)模型評(píng)估和超參數(shù)調(diào)優(yōu)。圖2 展示Spark生態(tài)Spark MLlib API支持Scala,Java和Python編程。
Spark MLlib應(yīng)用實(shí)踐使用Spark MLlib實(shí)現(xiàn)推薦引擎。推薦引擎最佳實(shí)踐是基于已知用戶的商品行為而去預(yù)測(cè)用戶可能感興趣的未知商品。推薦引擎基于已知數(shù)據(jù)(也即,訓(xùn)練數(shù)據(jù))訓(xùn)練出預(yù)測(cè)模型。然后利用訓(xùn)練好的預(yù)測(cè)模型來(lái)預(yù)測(cè)。最佳電影推薦引擎的實(shí)現(xiàn)有下面幾步:
加載電影數(shù)據(jù);加載你指定的評(píng)價(jià)數(shù)據(jù);加載社區(qū)提供的評(píng)價(jià)數(shù)據(jù);將評(píng)價(jià)數(shù)據(jù)join成單個(gè)RDD;使用ALS算法訓(xùn)練模型;確認(rèn)指定用戶(userId = 1)未評(píng)價(jià)的電影;預(yù)測(cè)未被用戶評(píng)價(jià)的電影的評(píng)價(jià);獲取Top N的推薦(這里N= 5);在終端顯示推薦結(jié)果。如果你想對(duì)輸出的數(shù)據(jù)做進(jìn)一步分析,你可以把預(yù)測(cè)的結(jié)果存儲(chǔ)到Cassandra或者M(jìn)ongoDB等數(shù)據(jù)庫(kù)。
使用到的技術(shù)這里采用Java開發(fā)Spark MLlib程序,并在stand-alone模型下執(zhí)行。使用到的MLlib Java類:org.apache.spark.mllib.recommendation。
ALSMatrixFactorizationModelRating圖3 Spark機(jī)器學(xué)習(xí)的例子程序架構(gòu)
程序執(zhí)行:
開發(fā)好的程序進(jìn)行打包,設(shè)置環(huán)境變量:JDK (JAVA_HOME), Maven (MAVEN_HOME)和Spark (SPARK_HOME)。
在Windows環(huán)境中:
set JAVA_HOME=[JDK_INSTALL_DIRECTORY]set PATH=%PATH%;%JAVA_HOME%inset MAVEN_HOME=[MAVEN_INSTALL_DIRECTORY]set PATH=%PATH%;%MAVEN_HOME%inset SPARK_HOME=[SPARK_INSTALL_DIRECTORY]set PATH=%PATH%;%SPARK_HOME%incd c:devprojectsspark-mllib-sample-appmvn clean installmvn eclipse:clean eclipse:eclipse在Linux或者M(jìn)AC系統(tǒng)中;
export JAVA_HOME=[JDK_INSTALL_DIRECTORY]export PATH=$PATH:$JAVA_HOME/binexport MAVEN_HOME=[MAVEN_INSTALL_DIRECTORY]export PATH=$PATH:$MAVEN_HOME/binexport SPARK_HOME=[SPARK_INSTALL_DIRECTORY]export PATH=$PATH:$SPARK_HOME/bincd /Users/USER_NAME/spark-mllib-sample-appmvn clean installmvn eclipse:clean eclipse:eclipse運(yùn)行Spark程序,命令如下:在Windows環(huán)境下:
%SPARK_HOME%inspark-submit --class "org.apache.spark.examples.mllib.JavaRecommendationExample" --master local[*] targetspark-mllib-sample-1.0.jar在Linux或者M(jìn)AC環(huán)境下:
$SPARK_HOME/bin/spark-submit --class "org.apache.spark.examples.mllib.JavaRecommendationExample" --master local[*] target/spark-mllib-sample-1.0.jarSpark MLlib應(yīng)用監(jiān)控使用Spark的web控制臺(tái)可以進(jìn)行監(jiān)控程序運(yùn)行狀態(tài)。這里只給出程序運(yùn)行的有向無(wú)環(huán)圖(DAG):
圖4 DAG的可視化
結(jié)論Spark MLlib是Spark實(shí)現(xiàn)的機(jī)器學(xué)習(xí)庫(kù)中的一種,經(jīng)常用來(lái)做業(yè)務(wù)數(shù)據(jù)的預(yù)測(cè)分析,比如個(gè)性化推薦引擎和異常監(jiān)測(cè)系統(tǒng)。
作者信息:俠天,專注于大數(shù)據(jù)、機(jī)器學(xué)習(xí)和數(shù)學(xué)相關(guān)的內(nèi)容,并有個(gè)人公眾號(hào):bigdata_ny分享相關(guān)技術(shù)文章。
查看英文原文: Big Data Processing with Apache Spark - Part 4: Spark Machine Learning