歡迎加入機(jī)器學(xué)習(xí)QQ交流群:740377503
一裹刮、什么是機(jī)器學(xué)習(xí)
機(jī)器學(xué)習(xí)(Machine Learning, ML)是一門(mén)多領(lǐng)域交叉學(xué)科盏混,涉及概率論蔚鸥、統(tǒng)計(jì)學(xué)、逼近論许赃、凸分析止喷、算法復(fù)雜度理論等多門(mén)學(xué)科。專(zhuān)門(mén)研究計(jì)算機(jī)怎樣模擬或?qū)崿F(xiàn)人類(lèi)的學(xué)習(xí)行為混聊,以獲取新的知識(shí)或技能启盛,重新組織已有的知識(shí)結(jié)構(gòu)使之不斷改善自身的性能。它是人工智能的核心技羔,是使計(jì)算機(jī)具有智能的根本途徑僵闯,其應(yīng)用遍及人工智能的各個(gè)領(lǐng)域,它主要使用歸納藤滥、綜合而不是演繹鳖粟。一種經(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ò)程如上圖所示标沪。在數(shù)據(jù)的基礎(chǔ)上榄攀,通過(guò)算法構(gòu)建出模型并對(duì)模型進(jìn)行評(píng)估。評(píng)估的性能如果達(dá)到要求金句,就用該模型來(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ù)趁曼。機(jī)器學(xué)習(xí)技術(shù)和方法已經(jīng)被成功應(yīng)用到多個(gè)領(lǐng)域军浆,比如個(gè)性推薦系統(tǒng),金融反欺詐挡闰,語(yǔ)音識(shí)別乒融,自然語(yǔ)言處理和機(jī)器翻譯,模式識(shí)別摄悯,智能控制等赞季。
二、基于大數(shù)據(jù)的機(jī)器學(xué)習(xí)
傳統(tǒng)的機(jī)器學(xué)習(xí)算法射众,由于技術(shù)和單機(jī)存儲(chǔ)的限制碟摆,只能在少量數(shù)據(jù)上使用。即以前的統(tǒng)計(jì)/機(jī)器學(xué)習(xí)依賴于數(shù)據(jù)抽樣叨橱。但實(shí)際過(guò)程中樣本往往很難做好隨機(jī)典蜕,導(dǎo)致學(xué)習(xí)的模型不是很準(zhǔn)確,在測(cè)試數(shù)據(jù)上的效果也可能不太好罗洗。
隨著 HDFS(Hadoop Distributed File System) 等分布式文件系統(tǒng)出現(xiàn)愉舔,存儲(chǔ)海量數(shù)據(jù)已經(jīng)成為可能。在全量數(shù)據(jù)上進(jìn)行機(jī)器學(xué)習(xí)也成為了可能伙菜,這順便也解決了統(tǒng)計(jì)隨機(jī)性的問(wèn)題轩缤。然而,由于 MapReduce 自身的限制,使得使用 MapReduce 來(lái)實(shí)現(xiàn)分布式機(jī)器學(xué)習(xí)算法非常耗時(shí)和消耗磁盤(pán)IO火的。因?yàn)橥ǔG闆r下機(jī)器學(xué)習(xí)算法參數(shù)學(xué)習(xí)的過(guò)程都是迭代計(jì)算的壶愤,即本次計(jì)算的結(jié)果要作為下一次迭代的輸入,這個(gè)過(guò)程中馏鹤,如果使用 MapReduce征椒,我們只能把中間結(jié)果存儲(chǔ)磁盤(pán),然后在下一次計(jì)算的時(shí)候從新讀取湃累,這對(duì)于迭代 頻發(fā)的算法顯然是致命的性能瓶頸勃救。
在大數(shù)據(jù)上進(jìn)行機(jī)器學(xué)習(xí),需要處理全量數(shù)據(jù)并進(jìn)行大量的迭代計(jì)算治力,這要求機(jī)器學(xué)習(xí)平臺(tái)具備強(qiáng)大的處理能力蒙秒。Spark 立足于內(nèi)存計(jì)算,天然的適應(yīng)于迭代式計(jì)算宵统。即便如此晕讲,對(duì)于普通開(kāi)發(fā)者來(lái)說(shuō),實(shí)現(xiàn)一個(gè)分布式機(jī)器學(xué)習(xí)算法仍然是一件極具挑戰(zhàn)的事情榜田。
幸運(yùn)的是益兄,Spark提供了一個(gè)基于海量數(shù)據(jù)的機(jī)器學(xué)習(xí)庫(kù),它提供了常用機(jī)器學(xué)習(xí)算法的分布式實(shí)現(xiàn)箭券,開(kāi)發(fā)者只需要有 Spark 基礎(chǔ)并且了解機(jī)器學(xué)習(xí)算法的原理净捅,以及方法相關(guān)參數(shù)的含義,就可以輕松的通過(guò)調(diào)用相應(yīng)的 API 來(lái)實(shí)現(xiàn)基于海量數(shù)據(jù)的機(jī)器學(xué)習(xí)過(guò)程辩块。
其次蛔六,Spark-Shell的即席查詢也是一個(gè)關(guān)鍵。算法工程師可以邊寫(xiě)代碼邊運(yùn)行废亭,邊看結(jié)果国章。spark提供的各種高效的工具正使得機(jī)器學(xué)習(xí)過(guò)程更加直觀便捷。比如通過(guò)sample函數(shù)豆村,可以非常方便的進(jìn)行抽樣液兽。
當(dāng)然,Spark發(fā)展到后面掌动,擁有了實(shí)時(shí)批計(jì)算四啰,批處理,算法庫(kù)粗恢,SQL柑晒、流計(jì)算等模塊等,基本可以看做是全平臺(tái)的系統(tǒng)眷射。把機(jī)器學(xué)習(xí)作為一個(gè)模塊加入到Spark中匙赞,也是大勢(shì)所趨佛掖。
三、Spark 機(jī)器學(xué)習(xí)庫(kù)MLLib
MLlib是Spark的機(jī)器學(xué)習(xí)(Machine Learning)庫(kù)涌庭,旨在簡(jiǎn)化機(jī)器學(xué)習(xí)的工程實(shí)踐工作芥被,并方便擴(kuò)展到更大規(guī)模。MLlib由一些通用的學(xué)習(xí)算法和工具組成脾猛,包括分類(lèi)撕彤、回歸、聚類(lèi)猛拴、協(xié)同過(guò)濾、降維等蚀狰,同時(shí)還包括底層的優(yōu)化原語(yǔ)和高層的管道API愉昆。具體來(lái)說(shuō),其主要包括以下幾方面的內(nèi)容:
機(jī)器學(xué)習(xí)算法:常用的學(xué)習(xí)算法麻蹋,如分類(lèi)跛溉、回歸、聚類(lèi)和協(xié)同過(guò)濾扮授;
特征處理:特征提取芳室、轉(zhuǎn)化、降維刹勃,和特征選擇堪侯;
管道(Pipeline):用于構(gòu)建、評(píng)估和調(diào)整機(jī)器學(xué)習(xí)管道的工具;
存儲(chǔ):保存和加載算法荔仁,模型和管道;
實(shí)用工具:線性代數(shù)伍宦,統(tǒng)計(jì),數(shù)據(jù)處理等工具乏梁。
Spark 機(jī)器學(xué)習(xí)庫(kù)從 1.2 版本以后被分為兩個(gè)包:
spark.mllib包含基于RDD的原始算法API次洼。Spark MLlib 歷史比較長(zhǎng),在1.0 以前的版本即已經(jīng)包含了遇骑,提供的算法實(shí)現(xiàn)都是基于原始的 RDD卖毁。
spark.ml?則提供了基于DataFrames?高層次的API,可以用來(lái)構(gòu)建機(jī)器學(xué)習(xí)工作流(PipeLine)落萎。ML Pipeline 彌補(bǔ)了原始 MLlib 庫(kù)的不足亥啦,向用戶提供了一個(gè)基于 DataFrame 的機(jī)器學(xué)習(xí)工作流式 API 套件。
使用 ML Pipeline API可以很方便的把數(shù)據(jù)處理模暗,特征轉(zhuǎn)換禁悠,正則化,以及多個(gè)機(jī)器學(xué)習(xí)算法聯(lián)合起來(lái)兑宇,構(gòu)建一個(gè)單一完整的機(jī)器學(xué)習(xí)流水線碍侦。這種方式給我們提供了更靈活的方法,更符合機(jī)器學(xué)習(xí)過(guò)程的特點(diǎn),也更容易從其他語(yǔ)言遷移瓷产。Spark官方推薦使用spark.ml站玄。如果新的算法能夠適用于機(jī)器學(xué)習(xí)管道的概念,就應(yīng)該將其放到spark.ml包中濒旦,如:特征提取器和轉(zhuǎn)換器株旷。開(kāi)發(fā)者需要注意的是,從Spark2.0開(kāi)始尔邓,基于RDD的API進(jìn)入維護(hù)模式(即不增加任何新的特性)晾剖,并預(yù)期于3.0版本的時(shí)候被移除出MLLib。
Spark在機(jī)器學(xué)習(xí)方面的發(fā)展非程菟裕快齿尽,目前已經(jīng)支持了主流的統(tǒng)計(jì)和機(jī)器學(xué)習(xí)算法〉平冢縱觀所有基于分布式架構(gòu)的開(kāi)源機(jī)器學(xué)習(xí)庫(kù)循头,MLlib可以算是計(jì)算效率最高的。MLlib目前支持4種常見(jiàn)的機(jī)器學(xué)習(xí)問(wèn)題:?分類(lèi)炎疆、回歸卡骂、聚類(lèi)和協(xié)同過(guò)濾。下表列出了目前MLlib支持的主要的機(jī)器學(xué)習(xí)算法:?