1、機(jī)器學(xué)習(xí)概念
1.1機(jī)器學(xué)習(xí)的定義
在維基百科上對(duì)機(jī)器學(xué)習(xí)提出以下幾種定義:
l“機(jī)器學(xué)習(xí)是一門人工智能的科學(xué),該領(lǐng)域的主要研究對(duì)象是人工智能,特別是如何在經(jīng)驗(yàn)學(xué)習(xí)中改善具體算法的性能”。
l“機(jī)器學(xué)習(xí)是對(duì)能通過(guò)經(jīng)驗(yàn)自動(dòng)改進(jìn)的計(jì)算機(jī)算法的研究”。
l“機(jī)器學(xué)習(xí)是用數(shù)據(jù)或以往的經(jīng)驗(yàn)达址,以此優(yōu)化計(jì)算機(jī)程序的性能標(biāo)準(zhǔn)〕煤模”?一種經(jīng)常引用的英文定義是:A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E苏携。
可以看出機(jī)器學(xué)習(xí)強(qiáng)調(diào)三個(gè)關(guān)鍵詞:算法、經(jīng)驗(yàn)对粪、性能右冻,其處理過(guò)程如下圖所示装蓬。
上圖表明機(jī)器學(xué)習(xí)是數(shù)據(jù)通過(guò)算法構(gòu)建出模型并對(duì)模型進(jìn)行評(píng)估,評(píng)估的性能如果達(dá)到要求就拿這個(gè)模型來(lái)測(cè)試其他的數(shù)據(jù)纱扭,如果達(dá)不到要求就要調(diào)整算法來(lái)重新建立模型牍帚,再次進(jìn)行評(píng)估,如此循環(huán)往復(fù)乳蛾,最終獲得滿意的經(jīng)驗(yàn)來(lái)處理其他的數(shù)據(jù)暗赶。
1.2機(jī)器學(xué)習(xí)的分類
1.2.1監(jiān)督學(xué)習(xí)
監(jiān)督是從給定的訓(xùn)練數(shù)據(jù)集中學(xué)習(xí)一個(gè)函數(shù)(模型),當(dāng)新的數(shù)據(jù)到來(lái)時(shí)肃叶,可以根據(jù)這個(gè)函數(shù)(模型)預(yù)測(cè)結(jié)果蹂随。監(jiān)督學(xué)習(xí)的訓(xùn)練集要求包括輸入和輸出,也可以說(shuō)是特征和目標(biāo)因惭。訓(xùn)練集中的目標(biāo)是由人標(biāo)注(標(biāo)量)的岳锁。在監(jiān)督式學(xué)習(xí)下,輸入數(shù)據(jù)被稱為“訓(xùn)練數(shù)據(jù)”蹦魔,每組訓(xùn)練數(shù)據(jù)有一個(gè)明確的標(biāo)識(shí)或結(jié)果激率,如對(duì)防垃圾郵件系統(tǒng)中“垃圾郵件”、“非垃圾郵件”勿决,對(duì)手寫數(shù)字識(shí)別中的“1”乒躺、“2”、“3”等低缩。在建立預(yù)測(cè)模型時(shí)嘉冒,監(jiān)督式學(xué)習(xí)建立一個(gè)學(xué)習(xí)過(guò)程,將預(yù)測(cè)結(jié)果與“訓(xùn)練數(shù)據(jù)”的實(shí)際結(jié)果進(jìn)行比較咆繁,不斷調(diào)整預(yù)測(cè)模型健爬,直到模型的預(yù)測(cè)結(jié)果達(dá)到一個(gè)預(yù)期的準(zhǔn)確率。常見的監(jiān)督學(xué)習(xí)算法包括回歸分析和統(tǒng)計(jì)分類:
l二元分類是機(jī)器學(xué)習(xí)要解決的基本問題么介,將測(cè)試數(shù)據(jù)分成兩個(gè)類,如垃圾郵件的判別蜕衡、房貸是否允許等問題的判斷壤短。
l多元分類是二元分類的邏輯延伸。例如慨仿,在因特網(wǎng)的流分類的情況下久脯,根據(jù)問題的分類,網(wǎng)頁(yè)可以被歸類為體育镰吆、新聞帘撰、技術(shù)等,依此類推万皿。
監(jiān)督學(xué)習(xí)常常用于分類摧找,因?yàn)槟繕?biāo)往往是讓計(jì)算機(jī)去學(xué)習(xí)我們已經(jīng)創(chuàng)建好的分類系統(tǒng)核行。數(shù)字識(shí)別再一次成為分類學(xué)習(xí)的常見樣本。一般來(lái)說(shuō)蹬耘,對(duì)于那些有用的分類系統(tǒng)和容易判斷的分類系統(tǒng)芝雪,分類學(xué)習(xí)都適用。
監(jiān)督學(xué)習(xí)是訓(xùn)練神經(jīng)網(wǎng)絡(luò)和決策樹的最常見技術(shù)综苔。神經(jīng)網(wǎng)絡(luò)和決策樹技術(shù)高度依賴于事先確定的分類系統(tǒng)給出的信息惩系。對(duì)于神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō),分類系統(tǒng)用于判斷網(wǎng)絡(luò)的錯(cuò)誤如筛,然后調(diào)整網(wǎng)絡(luò)去適應(yīng)它堡牡;對(duì)于決策樹,分類系統(tǒng)用來(lái)判斷哪些屬性提供了最多的信息杨刨,如此一來(lái)可以用它解決分類系統(tǒng)的問題晤柄。
1.2.2無(wú)監(jiān)督學(xué)習(xí)
與監(jiān)督學(xué)習(xí)相比,無(wú)監(jiān)督學(xué)習(xí)的訓(xùn)練集沒有人為標(biāo)注的結(jié)果拭嫁。在非監(jiān)督式學(xué)習(xí)中可免,數(shù)據(jù)并不被特別標(biāo)識(shí),學(xué)習(xí)模型是為了推斷出數(shù)據(jù)的一些內(nèi)在結(jié)構(gòu)做粤。常見的應(yīng)用場(chǎng)景包括關(guān)聯(lián)規(guī)則的學(xué)習(xí)以及聚類等浇借。常見算法包括Apriori算法和k-Means算法。這類學(xué)習(xí)類型的目標(biāo)不是讓效用函數(shù)最大化怕品,而是找到訓(xùn)練數(shù)據(jù)中的近似點(diǎn)妇垢。聚類常常能發(fā)現(xiàn)那些與假設(shè)匹配的相當(dāng)好的直觀分類,例如基于人口統(tǒng)計(jì)的聚合個(gè)體可能會(huì)在一個(gè)群體中形成一個(gè)富有的聚合肉康,以及其他的貧窮的聚合闯估。
非監(jiān)督學(xué)習(xí)看起來(lái)非常困難:目標(biāo)是我們不告訴計(jì)算機(jī)怎么做,而是讓它(計(jì)算機(jī))自己去學(xué)習(xí)怎樣做一些事情吼和。非監(jiān)督學(xué)習(xí)一般有兩種思路:第一種思路是在指導(dǎo)Agent時(shí)不為其指定明確的分類涨薪,而是在成功時(shí)采用某種形式的激勵(lì)制度。需要注意的是炫乓,這類訓(xùn)練通常會(huì)置于決策問題的框架里刚夺,因?yàn)樗哪繕?biāo)不是產(chǎn)生一個(gè)分類系統(tǒng),而是做出最大回報(bào)的決定末捣。這種思路很好地概括了現(xiàn)實(shí)世界侠姑,Agent可以對(duì)那些正確的行為做出激勵(lì),并對(duì)其他的行為進(jìn)行處罰箩做。
因?yàn)闊o(wú)監(jiān)督學(xué)習(xí)假定沒有事先分類的樣本莽红,這在一些情況下會(huì)非常強(qiáng)大,例如邦邦,我們的分類方法可能并非最佳選擇安吁。在這方面一個(gè)突出的例子是Backgammon(西洋雙陸棋)游戲醉蚁,有一系列計(jì)算機(jī)程序(例如neuro-gammon和TD-gammon)通過(guò)非監(jiān)督學(xué)習(xí)自己一遍又一遍地玩這個(gè)游戲,變得比最強(qiáng)的人類棋手還要出色柳畔。這些程序發(fā)現(xiàn)的一些原則甚至令雙陸棋專家都感到驚訝馍管,并且它們比那些使用預(yù)分類樣本訓(xùn)練的雙陸棋程序工作得更出色。
1.2.3半監(jiān)督學(xué)習(xí)
半監(jiān)督學(xué)習(xí)(Semi-supervised Learning)是介于監(jiān)督學(xué)習(xí)與無(wú)監(jiān)督學(xué)習(xí)之間一種機(jī)器學(xué)習(xí)方式薪韩,是模式識(shí)別和機(jī)器學(xué)習(xí)領(lǐng)域研究的重點(diǎn)問題确沸。它主要考慮如何利用少量的標(biāo)注樣本和大量的未標(biāo)注樣本進(jìn)行訓(xùn)練和分類的問題。半監(jiān)督學(xué)習(xí)對(duì)于減少標(biāo)注代價(jià)俘陷,提高學(xué)習(xí)機(jī)器性能具有非常重大的實(shí)際意義罗捎。主要算法有五類:基于概率的算法;在現(xiàn)有監(jiān)督算法基礎(chǔ)上進(jìn)行修改的方法拉盾;直接依賴于聚類假設(shè)的方法等桨菜,在此學(xué)習(xí)方式下,輸入數(shù)據(jù)部分被標(biāo)識(shí)捉偏,部分沒有被標(biāo)識(shí)倒得,這種學(xué)習(xí)模型可以用來(lái)進(jìn)行預(yù)測(cè),但是模型首先需要學(xué)習(xí)數(shù)據(jù)的內(nèi)在結(jié)構(gòu)以便合理地組織數(shù)據(jù)來(lái)進(jìn)行預(yù)測(cè)夭禽。應(yīng)用場(chǎng)景包括分類和回歸霞掺,算法包括一些對(duì)常用監(jiān)督式學(xué)習(xí)算法的延伸,這些算法首先試圖對(duì)未標(biāo)識(shí)數(shù)據(jù)進(jìn)行建模讹躯,在此基礎(chǔ)上再對(duì)標(biāo)識(shí)的數(shù)據(jù)進(jìn)行預(yù)測(cè)菩彬,如圖論推理算法(Graph Inference)或者拉普拉斯支持向量機(jī)(Laplacian SVM)等。
半監(jiān)督學(xué)習(xí)分類算法提出的時(shí)間比較短潮梯,還有許多方面沒有更深入的研究骗灶。半監(jiān)督學(xué)習(xí)從誕生以來(lái),主要用于處理人工合成數(shù)據(jù)秉馏,無(wú)噪聲干擾的樣本數(shù)據(jù)是當(dāng)前大部分半監(jiān)督學(xué)習(xí)方法使用的數(shù)據(jù)耙旦,而在實(shí)際生活中用到的數(shù)據(jù)卻大部分不是無(wú)干擾的,通常都比較難以得到純樣本數(shù)據(jù)萝究。
1.2.4強(qiáng)化學(xué)習(xí)
強(qiáng)化學(xué)習(xí)通過(guò)觀察來(lái)學(xué)習(xí)動(dòng)作的完成免都,每個(gè)動(dòng)作都會(huì)對(duì)環(huán)境有所影響,學(xué)習(xí)對(duì)象根據(jù)觀察到的周圍環(huán)境的反饋來(lái)做出判斷糊肤。在這種學(xué)習(xí)模式下,輸入數(shù)據(jù)作為對(duì)模型的反饋氓鄙,不像監(jiān)督模型那樣馆揉,輸入數(shù)據(jù)僅僅是作為一個(gè)檢查模型對(duì)錯(cuò)的方式,在強(qiáng)化學(xué)習(xí)下抖拦,輸入數(shù)據(jù)直接反饋到模型升酣,模型必須對(duì)此立刻做出調(diào)整舷暮。常見的應(yīng)用場(chǎng)景包括動(dòng)態(tài)系統(tǒng)以及機(jī)器人控制等。常見算法包括Q-Learning以及時(shí)間差學(xué)習(xí)(Temporal difference learning)噩茄。
在企業(yè)數(shù)據(jù)應(yīng)用的場(chǎng)景下下面,人們最常用的可能就是監(jiān)督式學(xué)習(xí)和非監(jiān)督式學(xué)習(xí)的模型。在圖像識(shí)別等領(lǐng)域绩聘,由于存在大量的非標(biāo)識(shí)的數(shù)據(jù)和少量的可標(biāo)識(shí)數(shù)據(jù)沥割,目前半監(jiān)督式學(xué)習(xí)是一個(gè)很熱的話題。而強(qiáng)化學(xué)習(xí)更多地應(yīng)用在機(jī)器人控制及其他需要進(jìn)行系統(tǒng)控制的領(lǐng)域凿菩。
1.3機(jī)器學(xué)習(xí)的常見算法
常見的機(jī)器學(xué)習(xí)算法有:
l構(gòu)造條件概率:回歸分析和統(tǒng)計(jì)分類机杜;
l人工神經(jīng)網(wǎng)絡(luò);
l決策樹衅谷;
l高斯過(guò)程回歸椒拗;
l線性判別分析纺棺;
l最近鄰居法兵琳;
l感知器;
l徑向基函數(shù)核糊识;
l支持向量機(jī)玷氏;
l通過(guò)再生模型構(gòu)造概率密度函數(shù)堵未;
l最大期望算法;
lgraphical model:包括貝葉斯網(wǎng)和Markov隨機(jī)場(chǎng)预茄;
lGenerative Topographic Mapping兴溜;
l近似推斷技術(shù);
l馬爾可夫鏈蒙特卡羅方法耻陕;
l變分法拙徽;
l最優(yōu)化:大多數(shù)以上方法,直接或者間接使用最優(yōu)化算法诗宣。
根據(jù)算法的功能和形式的類似性膘怕,我們可以把算法分類,比如說(shuō)基于樹的算法召庞,基于神經(jīng)網(wǎng)絡(luò)的算法等等岛心。當(dāng)然,機(jī)器學(xué)習(xí)的范圍非常龐大篮灼,有些算法很難明確歸類到某一類忘古。而對(duì)于有些分類來(lái)說(shuō),同一分類的算法可以針對(duì)不同類型的問題诅诱,下面用一些相對(duì)比較容易理解的方式來(lái)解析一些主要的機(jī)器學(xué)習(xí)算法:
1.3.1回歸算法
回歸算法是試圖采用對(duì)誤差的衡量來(lái)探索變量之間的關(guān)系的一類算法髓堪。回歸算法是統(tǒng)計(jì)機(jī)器學(xué)習(xí)的利器。在機(jī)器學(xué)習(xí)領(lǐng)域干旁,人們說(shuō)起回歸驶沼,有時(shí)候是指一類問題,有時(shí)候是指一類算法争群,這一點(diǎn)常常會(huì)使初學(xué)者有所困惑回怜。常見的回歸算法包括:最小二乘法(Ordinary Least Square),邏輯回歸(Logistic Regression)换薄,逐步式回歸(Stepwise Regression)玉雾,多元自適應(yīng)回歸樣條(Multivariate Adaptive Regression Splines)以及本地散點(diǎn)平滑估計(jì)(Locally Estimated Scatterplot Smoothing)。
1.3.2基于實(shí)例的算法
基于實(shí)例的算法常常用來(lái)對(duì)決策問題建立模型专控,這樣的模型常常先選取一批樣本數(shù)據(jù)抹凳,然后根據(jù)某些近似性把新數(shù)據(jù)與樣本數(shù)據(jù)進(jìn)行比較。通過(guò)這種方式來(lái)尋找最佳的匹配伦腐。因此赢底,基于實(shí)例的算法常常也被稱為“贏家通吃”學(xué)習(xí)或者“基于記憶的學(xué)習(xí)”。常見的算法包括?k-Nearest Neighbor (KNN)柏蘑,幸冻、學(xué)習(xí)矢量量化(Learning Vector Quantization,?LVQ)以及自組織映射算法(Self-Organizing Map咳焚,SOM)
1.3.3正則化方法
正則化方法是其他算法(通常是回歸算法)的延伸洽损,根據(jù)算法的復(fù)雜度對(duì)算法進(jìn)行調(diào)整。正則化方法通常對(duì)簡(jiǎn)單模型予以獎(jiǎng)勵(lì)而對(duì)復(fù)雜算法予以懲罰革半。常見的算法包括:Ridge Regression碑定、Least Absolute Shrinkage and Selection Operator(LASSO)以及彈性網(wǎng)絡(luò)(Elastic Net)。
1.3.4決策樹學(xué)習(xí)
決策樹算法根據(jù)數(shù)據(jù)的屬性采用樹狀結(jié)構(gòu)建立決策模型又官,決策樹模型常常用來(lái)解決分類和回歸問題延刘。常見的算法包括:分類及回歸樹(Classification And Regression Tree,?CART)六敬、?ID3 (Iterative Dichotomiser 3)碘赖、C4.5、Chi-squared Automatic Interaction Detection (CHAID)外构、Decision Stump普泡、機(jī)森林(Random Forest)、多元自適應(yīng)回歸樣條(MARS)以及梯度推進(jìn)機(jī)(Gradient Boosting Machine审编,GBM)撼班。
1.3.5貝葉斯學(xué)習(xí)
貝葉斯方法算法是基于貝葉斯定理的一類算法,主要用來(lái)解決分類和回歸問題垒酬。常見算法包括:樸素貝葉斯算法砰嘁、平均單依賴估計(jì)(Averaged One-Dependence Estimators眯亦,?AODE)以及?Bayesian Belief Network(BBN)。
1.3.6基于核的算法
基于核的算法中最著名的莫過(guò)于支持向量機(jī)(SVM)了般码。基于核的算法把輸入數(shù)據(jù)映射到一個(gè)高階的向量空間乱顾, 在這些高階向量空間里板祝, 有些分類或者回歸問題能夠更容易解決。常見的基于核的算法包括:支持向量機(jī)(Support Vector Machine走净,SVM)券时、徑向基函數(shù)(Radial Basis Function,RBF)以及線性判別分析(Linear Discriminate Analysis伏伯,LDA)等橘洞。
1.3.7聚類算法
聚類就像回歸一樣,有時(shí)候人們描述的是一類問題说搅,有時(shí)候描述的是一類算法炸枣。聚類算法通常按照中心點(diǎn)或者分層的方式對(duì)輸入數(shù)據(jù)進(jìn)行歸并。所有的聚類算法都試圖找到數(shù)據(jù)的內(nèi)在結(jié)構(gòu)弄唧,以便按照最大的共同點(diǎn)將數(shù)據(jù)進(jìn)行歸類适肠。常見的聚類算法包括?k-Means算法以及期望最大化算法(Expectation Maximization,EM)候引。
1.3.8關(guān)聯(lián)規(guī)則學(xué)習(xí)
關(guān)聯(lián)規(guī)則學(xué)習(xí)通過(guò)尋找最能夠解釋數(shù)據(jù)變量之間關(guān)系的規(guī)則侯养,來(lái)找出大量多元數(shù)據(jù)集中有用的關(guān)聯(lián)規(guī)則。常見算法包括?Apriori算法和?Eclat?算法等澄干。
1.3.9人工神經(jīng)網(wǎng)絡(luò)算法
人工神經(jīng)網(wǎng)絡(luò)算法模擬生物神經(jīng)網(wǎng)絡(luò)逛揩,是一類模式匹配算法。通常用于解決分類和回歸問題麸俘。人工神經(jīng)網(wǎng)絡(luò)是機(jī)器學(xué)習(xí)的一個(gè)龐大的分支辩稽,有幾百種不同的算法(其中深度學(xué)習(xí)就是其中的一類算法,我們會(huì)單獨(dú)討論)疾掰。重要的人工神經(jīng)網(wǎng)絡(luò)算法包括:感知器神經(jīng)網(wǎng)絡(luò)(Perceptron Neural Network)搂誉、反向傳遞(Back Propagation)、Hopfield?網(wǎng)絡(luò)静檬、自組織映射(Self-Organizing Map, SOM)炭懊、學(xué)習(xí)矢量量化(Learning Vector Quantization,LVQ)拂檩。
1.3.10深度學(xué)習(xí)算法
深度學(xué)習(xí)算法是對(duì)人工神經(jīng)網(wǎng)絡(luò)的發(fā)展侮腹,在近期贏得了很多關(guān)注,特別是百度也開始發(fā)力深度學(xué)習(xí)后稻励,更是在國(guó)內(nèi)引起了很多關(guān)注父阻。在計(jì)算能力變得日益廉價(jià)的今天愈涩,深度學(xué)習(xí)試圖建立大得多也復(fù)雜得多的神經(jīng)網(wǎng)絡(luò)。很多深度學(xué)習(xí)的算法是半監(jiān)督式學(xué)習(xí)算法加矛,用來(lái)處理存在少量未標(biāo)識(shí)數(shù)據(jù)的大數(shù)據(jù)集履婉。常見的深度學(xué)習(xí)算法包括:受限波爾茲曼機(jī)(Restricted Boltzmann Machine,?RBN)斟览、?Deep Belief Networks(DBN)毁腿、卷積網(wǎng)絡(luò)(Convolutional Network)、堆棧式自動(dòng)編碼器(Stacked Auto-encoders)苛茂。
1.3.11降低維度算法
像聚類算法一樣已烤,降低維度算法試圖分析數(shù)據(jù)的內(nèi)在結(jié)構(gòu),不過(guò)降低維度算法是以非監(jiān)督學(xué)習(xí)的方式妓羊,試圖利用較少的信息來(lái)歸納或者解釋數(shù)據(jù)胯究。這類算法可以用于高維數(shù)據(jù)的可視化或者用來(lái)簡(jiǎn)化數(shù)據(jù)以便監(jiān)督式學(xué)習(xí)使用。常見的算法包括:主成份分析(Principle Component Analysis躁绸,?PCA)裕循、偏最小二乘回歸(Partial Least Square Regression,PLS)净刮、?Sammon?映射费韭、多維尺度(Multi-Dimensional Scaling, MDS)、投影追蹤(Projection Pursuit)等庭瑰。
1.3.12集成算法
集成算法用一些相對(duì)較弱的學(xué)習(xí)模型獨(dú)立地對(duì)同樣的樣本進(jìn)行訓(xùn)練星持,然后把結(jié)果整合起來(lái)進(jìn)行整體預(yù)測(cè)。集成算法的主要難點(diǎn)在于究竟集成哪些獨(dú)立的較弱的學(xué)習(xí)模型以及如何把學(xué)習(xí)結(jié)果整合起來(lái)弹灭。這是一類非常強(qiáng)大的算法督暂,同時(shí)也非常流行。常見的算法包括:Boosting穷吮、Bootstrapped Aggregation(Bagging)逻翁、AdaBoost、堆疊泛化(Stacked Generalization捡鱼,?Blending)八回、梯度推進(jìn)機(jī)(Gradient Boosting Machine, GBM)、隨機(jī)森林(Random Forest)驾诈。
2缠诅、Spark MLlib介紹
Spark之所以在機(jī)器學(xué)習(xí)方面具有得天獨(dú)厚的優(yōu)勢(shì),有以下幾點(diǎn)原因:
(1)機(jī)器學(xué)習(xí)算法一般都有很多個(gè)步驟迭代計(jì)算的過(guò)程乍迄,機(jī)器學(xué)習(xí)的計(jì)算需要在多次迭代后獲得足夠小的誤差或者足夠收斂才會(huì)停止管引,迭代時(shí)如果使用Hadoop的MapReduce計(jì)算框架,每次計(jì)算都要讀/寫磁盤以及任務(wù)的啟動(dòng)等工作闯两,這回導(dǎo)致非常大的I/O和CPU消耗褥伴。而Spark基于內(nèi)存的計(jì)算模型天生就擅長(zhǎng)迭代計(jì)算谅将,多個(gè)步驟計(jì)算直接在內(nèi)存中完成,只有在必要時(shí)才會(huì)操作磁盤和網(wǎng)絡(luò)重慢,所以說(shuō)Spark正是機(jī)器學(xué)習(xí)的理想的平臺(tái)饥臂。
(2)從通信的角度講,如果使用Hadoop的MapReduce計(jì)算框架似踱,JobTracker和TaskTracker之間由于是通過(guò)heartbeat的方式來(lái)進(jìn)行的通信和傳遞數(shù)據(jù)擅笔,會(huì)導(dǎo)致非常慢的執(zhí)行速度,而Spark具有出色而高效的Akka和Netty通信系統(tǒng)屯援,通信效率極高。
MLlib(Machine Learnig lib)是Spark對(duì)常用的機(jī)器學(xué)習(xí)算法的實(shí)現(xiàn)庫(kù)念脯,同時(shí)包括相關(guān)的測(cè)試和數(shù)據(jù)生成器狞洋。Spark的設(shè)計(jì)初衷就是為了支持一些迭代的Job,?這正好符合很多機(jī)器學(xué)習(xí)算法的特點(diǎn)。在Spark官方首頁(yè)中展示了Logistic Regression算法在Spark和Hadoop中運(yùn)行的性能比較绿店,如圖下圖所示吉懊。
可以看出在Logistic Regression的運(yùn)算場(chǎng)景下,Spark比Hadoop快了100倍以上假勿!
MLlib目前支持4種常見的機(jī)器學(xué)習(xí)問題:?分類借嗽、回歸、聚類和協(xié)同過(guò)濾转培,MLlib在Spark整個(gè)生態(tài)系統(tǒng)中的位置如圖下圖所示恶导。
MLlib基于RDD,天生就可以與Spark SQL浸须、GraphX惨寿、Spark Streaming無(wú)縫集成,以RDD為基石删窒,4個(gè)子框架可聯(lián)手構(gòu)建大數(shù)據(jù)計(jì)算中心裂垦!
MLlib是MLBase一部分,其中MLBase分為四部分:MLlib肌索、MLI蕉拢、ML Optimizer和MLRuntime。
lML Optimizer會(huì)選擇它認(rèn)為最適合的已經(jīng)在內(nèi)部實(shí)現(xiàn)好了的機(jī)器學(xué)習(xí)算法和相關(guān)參數(shù)诚亚,來(lái)處理用戶輸入的數(shù)據(jù)晕换,并返回模型或別的幫助分析的結(jié)果;
lMLI?是一個(gè)進(jìn)行特征抽取和高級(jí)ML編程抽象的算法實(shí)現(xiàn)的API或平臺(tái)站宗;
lMLlib是Spark實(shí)現(xiàn)一些常見的機(jī)器學(xué)習(xí)算法和實(shí)用程序届巩,包括分類、回歸份乒、聚類恕汇、協(xié)同過(guò)濾腕唧、降維以及底層優(yōu)化,該算法可以進(jìn)行可擴(kuò)充瘾英;?MLRuntime?基于Spark計(jì)算框架枣接,將Spark的分布式計(jì)算應(yīng)用到機(jī)器學(xué)習(xí)領(lǐng)域。
3缺谴、Spark MLlib架構(gòu)解析
從架構(gòu)圖可以看出MLlib主要包含三個(gè)部分:
l底層基礎(chǔ):包括Spark的運(yùn)行庫(kù)但惶、矩陣庫(kù)和向量庫(kù);
l算法庫(kù):包含廣義線性模型湿蛔、推薦系統(tǒng)膀曾、聚類、決策樹和評(píng)估的算法阳啥;
l實(shí)用程序:包括測(cè)試數(shù)據(jù)的生成添谊、外部數(shù)據(jù)的讀入等功能。
3.1MLlib的底層基礎(chǔ)解析
底層基礎(chǔ)部分主要包括向量接口和矩陣接口察迟,這兩種接口都會(huì)使用Scala語(yǔ)言基于Netlib和BLAS/LAPACK開發(fā)的線性代數(shù)庫(kù)Breeze斩狱。
MLlib支持本地的密集向量和稀疏向量,并且支持標(biāo)量向量扎瓶。
MLlib同時(shí)支持本地矩陣和分布式矩陣所踊,支持的分布式矩陣分為RowMatrix、IndexedRowMatrix概荷、CoordinateMatrix等秕岛。
關(guān)于密集型和稀疏型的向量Vector的示例如下所示。
疏矩陣在含有大量非零元素的向量Vector計(jì)算中會(huì)節(jié)省大量的空間并大幅度提高計(jì)算速度误证,如下圖所示瓣蛀。
標(biāo)量LabledPoint在實(shí)際中也被大量使用,例如判斷郵件是否為垃圾郵件時(shí)就可以使用類似于以下的代碼:
可以把表示為1.0的判斷為正常郵件雷厂,而表示為0.0則作為垃圾郵件來(lái)看待惋增。
對(duì)于矩陣Matrix而言,本地模式的矩陣如下所示改鲫。
分布式矩陣如下所示诈皿。
RowMatrix直接通過(guò)RDD[Vector]來(lái)定義并可以用來(lái)統(tǒng)計(jì)平均數(shù)、方差像棘、協(xié)同方差等:
而IndexedRowMatrix是帶有索引的Matrix稽亏,但其可以通過(guò)toRowMatrix方法來(lái)轉(zhuǎn)換為RowMatrix,從而利用其統(tǒng)計(jì)功能缕题,代碼示例如下所示截歉。
CoordinateMatrix常用于稀疏性比較高的計(jì)算中,是由RDD[MatrixEntry]來(lái)構(gòu)建的烟零,MatrixEntry是一個(gè)Tuple類型的元素瘪松,其中包含行咸作、列和元素值,代碼示例如下所示:
3.2MLlib的算法庫(kù)分析
下圖是MLlib算法庫(kù)的核心內(nèi)容宵睦。
在這里我們分析一些Spark中常用的算法:
3.2.1分類算法
分類算法屬于監(jiān)督式學(xué)習(xí)记罚,使用類標(biāo)簽已知的樣本建立一個(gè)分類函數(shù)或分類模型,應(yīng)用分類模型壳嚎,能把數(shù)據(jù)庫(kù)中的類標(biāo)簽未知的數(shù)據(jù)進(jìn)行歸類桐智。分類在數(shù)據(jù)挖掘中是一項(xiàng)重要的任務(wù),目前在商業(yè)上應(yīng)用最多烟馅,常見的典型應(yīng)用場(chǎng)景有流失預(yù)測(cè)说庭、精確營(yíng)銷、客戶獲取郑趁、個(gè)性偏好等刊驴。MLlib目前支持分類算法有:邏輯回歸、支持向量機(jī)穿撮、樸素貝葉斯和決策樹。
案例:導(dǎo)入訓(xùn)練數(shù)據(jù)集痪欲,然后在訓(xùn)練集上執(zhí)行訓(xùn)練算法悦穿,最后在所得模型上進(jìn)行預(yù)測(cè)并計(jì)算訓(xùn)練誤差。
[java]view plaincopy
importorg.apache.spark.SparkContext
importorg.apache.spark.mllib.classification.SVMWithSGD
importorg.apache.spark.mllib.regression.LabeledPoint
//?加載和解析數(shù)據(jù)文件
val?data?=?sc.textFile("mllib/data/sample_svm_data.txt")
val?parsedData?=?data.map?{?line?=>
val?parts?=?line.split('?')
LabeledPoint(parts(0).toDouble,?parts.tail.map(x?=>?x.toDouble).toArray)
}
//?設(shè)置迭代次數(shù)并進(jìn)行進(jìn)行訓(xùn)練
val?numIterations?=20
val?model?=?SVMWithSGD.train(parsedData,?numIterations)
//?統(tǒng)計(jì)分類錯(cuò)誤的樣本比例
val?labelAndPreds?=?parsedData.map?{?point?=>
val?prediction?=?model.predict(point.features)
(point.label,?prediction)
}
val?trainErr?=?labelAndPreds.filter(r?=>?r._1?!=?r._2).count.toDouble?/?parsedData.count
println("Training?Error?=?"+?trainErr)
3.2.2回歸算法
回歸算法屬于監(jiān)督式學(xué)習(xí)业踢,每個(gè)個(gè)體都有一個(gè)與之相關(guān)聯(lián)的實(shí)數(shù)標(biāo)簽栗柒,并且我們希望在給出用于表示這些實(shí)體的數(shù)值特征后,所預(yù)測(cè)出的標(biāo)簽值可以盡可能接近實(shí)際值知举。MLlib目前支持回歸算法有:線性回歸瞬沦、嶺回歸浮声、Lasso和決策樹揩徊。
案例:導(dǎo)入訓(xùn)練數(shù)據(jù)集拼岳,將其解析為帶標(biāo)簽點(diǎn)的RDD详恼,使用?LinearRegressionWithSGD?算法建立一個(gè)簡(jiǎn)單的線性模型來(lái)預(yù)測(cè)標(biāo)簽的值唆香,最后計(jì)算均方差來(lái)評(píng)估預(yù)測(cè)值與實(shí)際值的吻合度嫂拴。
[java]view plaincopy
importorg.apache.spark.mllib.regression.LinearRegressionWithSGD
importorg.apache.spark.mllib.regression.LabeledPoint
//?加載和解析數(shù)據(jù)文件
val?data?=?sc.textFile("mllib/data/ridge-data/lpsa.data")
val?parsedData?=?data.map?{?line?=>
val?parts?=?line.split(',')
LabeledPoint(parts(0).toDouble,?parts(1).split('?').map(x?=>?x.toDouble).toArray)
}
//設(shè)置迭代次數(shù)并進(jìn)行訓(xùn)練
val?numIterations?=20
val?model?=?LinearRegressionWithSGD.train(parsedData,?numIterations)
//?統(tǒng)計(jì)回歸錯(cuò)誤的樣本比例
val?valuesAndPreds?=?parsedData.map?{?point?=>
val?prediction?=?model.predict(point.features)
(point.label,?prediction)
}
val?MSE?=?valuesAndPreds.map{case(v,?p)?=>?math.pow((v?-?p),2)}.reduce(_?+?_)/valuesAndPreds.count
println("training?Mean?Squared?Error?=?"+?MSE)
3.2.3聚類算法
聚類算法屬于非監(jiān)督式學(xué)習(xí)腰耙,通常被用于探索性的分析氛堕,是根據(jù)“物以類聚”的原理立肘,將本身沒有類別的樣本聚集成不同的組边坤,這樣的一組數(shù)據(jù)對(duì)象的集合叫做簇,并且對(duì)每一個(gè)這樣的簇進(jìn)行描述的過(guò)程谅年。它的目的是使得屬于同一簇的樣本之間應(yīng)該彼此相似茧痒,而不同簇的樣本應(yīng)該足夠不相似,常見的典型應(yīng)用場(chǎng)景有客戶細(xì)分融蹂、客戶研究旺订、市場(chǎng)細(xì)分弄企、價(jià)值評(píng)估。MLlib目前支持廣泛使用的KMmeans聚類算法耸峭。
案例:導(dǎo)入訓(xùn)練數(shù)據(jù)集桩蓉,使用?KMeans對(duì)象來(lái)將數(shù)據(jù)聚類到兩個(gè)類簇當(dāng)中,所需的類簇個(gè)數(shù)會(huì)被傳遞到算法中劳闹,然后計(jì)算集內(nèi)均方差總和?(WSSSE)院究,可以通過(guò)增加類簇的個(gè)數(shù)?k?來(lái)減小誤差。 實(shí)際上本涕,最優(yōu)的類簇?cái)?shù)通常是1业汰,因?yàn)檫@一點(diǎn)通常是WSSSE圖中的 “低谷點(diǎn)”。
[java]view plaincopy
importorg.apache.spark.mllib.clustering.KMeans
//?加載和解析數(shù)據(jù)文件
val?data?=?sc.textFile("kmeans_data.txt")
val?parsedData?=?data.map(?_.split('?').map(_.toDouble))
//?設(shè)置迭代次數(shù)菩颖、類簇的個(gè)數(shù)
val?numIterations?=20
val?numClusters?=2
//?進(jìn)行訓(xùn)練
val?clusters?=?KMeans.train(parsedData,?numClusters,?numIterations)
//?統(tǒng)計(jì)聚類錯(cuò)誤的樣本比例
val?WSSSE?=?clusters.computeCost(parsedData)
println("Within?Set?Sum?of?Squared?Errors?=?"+?WSSSE)
3.2.4協(xié)同過(guò)濾
協(xié)同過(guò)濾常被應(yīng)用于推薦系統(tǒng)样漆,這些技術(shù)旨在補(bǔ)充用戶-商品關(guān)聯(lián)矩陣中所缺失的部分。MLlib當(dāng)前支持基于模型的協(xié)同過(guò)濾晦闰,其中用戶和商品通過(guò)一小組隱語(yǔ)義因子進(jìn)行表達(dá)放祟,并且這些因子也用于預(yù)測(cè)缺失的元素。
案例:導(dǎo)入訓(xùn)練數(shù)據(jù)集呻右,數(shù)據(jù)每一行由一個(gè)用戶跪妥、一個(gè)商品和相應(yīng)的評(píng)分組成。假設(shè)評(píng)分是顯性的声滥,使用默認(rèn)的ALS.train()方法眉撵,通過(guò)計(jì)算預(yù)測(cè)出的評(píng)分的均方差來(lái)評(píng)估這個(gè)推薦模型。
[java]view plaincopy
importorg.apache.spark.mllib.recommendation.ALS
importorg.apache.spark.mllib.recommendation.Rating
//?加載和解析數(shù)據(jù)文件
val?data?=?sc.textFile("mllib/data/als/test.data")
val?ratings?=?data.map(_.split(',')?match?{
caseArray(user,?item,?rate)?=>?Rating(user.toInt,?item.toInt,?rate.toDouble)
})
//?設(shè)置迭代次數(shù)
val?numIterations?=20
val?model?=?ALS.train(ratings,1,20,0.01)
//?對(duì)推薦模型進(jìn)行評(píng)分
val?usersProducts?=?ratings.map{caseRating(user,?product,?rate)?=>?(user,?product)}
val?predictions?=?model.predict(usersProducts).map{
caseRating(user,?product,?rate)?=>?((user,?product),?rate)
}
val?ratesAndPreds?=?ratings.map{
caseRating(user,?product,?rate)?=>?((user,?product),?rate)
}.join(predictions)
val?MSE?=?ratesAndPreds.map{
case((user,?product),?(r1,?r2))?=>?math.pow((r1-?r2),2)
}.reduce(_?+?_)/ratesAndPreds.count
println("Mean?Squared?Error?=?"+?MSE)
3.3MLlib的實(shí)用程序分析
實(shí)用程序部分包括數(shù)據(jù)的驗(yàn)證器落塑、Label的二元和多元的分析器纽疟、多種數(shù)據(jù)生成器、數(shù)據(jù)加載器憾赁。