來源:http://mocom.xmu.edu.cn/article/show/584816afe083c990247075a2/0/1
一、什麼是機器學習
機器學習可以看做是一門人工智能的科學,該領域的主要研究對象是人工智能。機器學習利用資料或以往的經驗,以此優化計算機程式的性能标準。一種經常引用的英文定義是:
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。

機器學習強調三個關鍵詞:算法、經驗、性能,其處理過程如上圖所示。在資料的基礎上,通過算法建構出模型并對模型進行評估。評估的性能如果達到要求,就用該模型來測試其他的資料;如果達不到要求,就要調整算法來重建立立模型,再次進行評估。如此循環往複,最終獲得滿意的經驗來處理其他的資料。機器學習技術和方法已經被成功應用到多個領域,比如個性推薦系統,金融反欺詐,語音識别,自然語言處理和機器翻譯,模式識别,智能控制等。
二、基于大資料的機器學習
傳統的機器學習算法,由于技術和單機存儲的限制,隻能在少量資料上使用。即以前的統計/機器學習依賴于資料抽樣。但實際過程中樣本往往很難做好随機,導緻學習的模型不是很準确,在測試資料上的效果也可能不太好。随着 HDFS(Hadoop Distributed File System) 等分布式檔案系統出現,存儲海量資料已經成為可能。在全量資料上進行機器學習也成為了可能,這順便也解決了統計随機性的問題。然而,由于 MapReduce 自身的限制,使得使用 MapReduce 來實作分布式機器學習算法非常耗時和消耗磁盤IO。因為通常情況下機器學習算法參數學習的過程都是疊代計算的,即本次計算的結果要作為下一次疊代的輸入,這個過程中,如果使用 MapReduce,我們隻能把中間結果存儲磁盤,然後在下一次計算的時候從新讀取,這對于疊代 頻發的算法顯然是緻命的性能瓶頸。
在大資料上進行機器學習,需要處理全量資料并進行大量的疊代計算,這要求機器學習平台具備強大的處理能力。Spark 立足于記憶體計算,天然的适應于疊代式計算。即便如此,對于普通開發者來說,實作一個分布式機器學習算法仍然是一件極具挑戰的事情。幸運的是,Spark提供了一個基于海量資料的機器學習庫,它提供了常用機器學習算法的分布式實作,開發者隻需要有 Spark 基礎并且了解機器學習算法的原理,以及方法相關參數的含義,就可以輕松的通過調用相應的 API 來實作基于海量資料的機器學習過程。其次,Spark-Shell的即席查詢也是一個關鍵。算法工程師可以邊寫代碼邊運作,邊看結果。spark提供的各種高效的工具正使得機器學習過程更加直覺便捷。比如通過sample函數,可以非常友善的進行抽樣。當然,Spark發展到後面,擁有了實時批計算,批處理,算法庫,SQL、流計算等子產品等,基本可以看做是全平台的系統。把機器學習作為一個子產品加入到Spark中,也是大勢所趨。
三、Spark 機器學習庫MLLib
MLlib是Spark的機器學習(Machine Learning)庫,旨在簡化機器學習的工程實踐工作,并友善擴充到更大規模。MLlib由一些通用的學習算法和工具組成,包括分類、回歸、聚類、協同過濾、降維等,同時還包括底層的優化原語和高層的管道API。具體來說,其主要包括以下幾方面的内容:
- 算法工具:常用的學習算法,如分類、回歸、聚類和協同過濾;
- 特征化公交:特征提取、轉化、降維,和選擇公交;
- 管道(Pipeline):用于建構、評估和調整機器學習管道的工具;
- 持久性:儲存和加載算法,模型和管道;
- 實用工具:線性代數,統計,資料處理等工具。
Spark 機器學習庫從 1.2 版本以後被分為兩個包:
-
包含基于RDD的原始算法API。Spark MLlib 曆史比較長,在1.0 以前的版本即已經包含了,提供的算法實作都是基于原始的 RDD。spark.mllib
-
則提供了基于DataFrames 高層次的API,可以用來建構機器學習工作流(PipeLine)。ML Pipeline 彌補了原始 MLlib 庫的不足,向使用者提供了一個基于 DataFrame 的機器學習工作流式 API 套件。spark.ml
使用 ML Pipeline API可以很友善的把資料處理,特征轉換,正則化,以及多個機器學習算法聯合起來,建構一個單一完整的機器學習流水線。這種方式給我們提供了更靈活的方法,更符合機器學習過程的特點,也更容易從其他語言遷移。Spark官方推薦使用spark.ml。如果新的算法能夠适用于機器學習管道的概念,就應該将其放到spark.ml包中,如:特征提取器和轉換器。開發者需要注意的是,從Spark2.0開始,基于RDD的API進入維護模式(即不增加任何新的特性),并預期于3.0版本的時候被移除出MLLib。
Spark在機器學習方面的發展非常快,目前已經支援了主流的統計和機器學習算法。縱觀所有基于分布式架構的開源機器學習庫,MLlib可以算是計算效率最高的。MLlib目前支援4種常見的機器學習問題: 分類、回歸、聚類和協同過濾。下表列出了目前MLlib支援的主要的機器學習算法: