《Machine Learning with Spark》書評與作者訪談
機器學習 以現有數據為基礎創建模型,通過數據驅動,對未來做出決策或者預測。機器學習在最近幾年獲得大量的關注,因為它對企業與商業做出決策非常有幫助。
Apache Spark 及其機器學習庫 MLlib 為開發可伸縮的機器學習應用,提供了多種有用的算法。
關于這個話題, Nick Pentreath 撰寫了 《Machine Learning with Spark》 一書(由 Packt Publishing 出版)。
Nick首先介紹了Spark編程模型及其組件,比如SparkContext和彈性分布式數據集(RDD)。同時,他談到了如何使用不同的編程語言,比如Scala、Java和Python來編寫Spark程序。
他還談到了如何基于Spark框架,使用基于內容的過濾和協同過濾技術,構建一個推薦引擎。此外,還講到了使用Spark創建分類、回歸和聚類模型,以及降維。
當能夠對實時數據,而不僅僅是使用靜態數據集進行數據處理和分析時,機器學習解決方案會更加有效。這就是本書最后一章中討論的內容。涵蓋的主題包括流式數據分析、流回歸和k-means模型。
InfoQ采訪了Nick,共同探討了有關數據科學和機器學習的概念,以及這本書。
InfoQ:能為我們的讀者介紹下,什么是機器學習嗎?
Nick Pentreath:機器學習的定義有許多版本,但我傾向于認為它是簡單地從數據中學習并對未來做出預測。從這個意義所上說,機器學習和統計學有許多相似之處,實際上,機器學習和統計學領域確實顯著地重疊。然而,機器學習也深受計算機科學和人工智能領域的影響。將許多學科的思想和技術相結合是機器學習的一個方面,卻是機器學習最吸引我的地方。
InfoQ:能介紹一些機器學習的商用場景嗎?
Pentreath:以往,機器學習是相當理論的,絕不會出現于公眾的心目中。直到最近,憑借在理論和計算能力的進步,機器學習似乎無處不在。現在它正強力支撐著多種應用,包括在線搜索、推薦引擎、定向廣告、欺詐檢測、圖像和視頻識別、自動駕駛汽車,以及各種人工智能場景。
InfoQ:什么是數據科學,數據科學家在大數據項目中的作用是什么?
Pentreath:就像機器學習一樣,“數據科學”是相當新的術語,你能找到許多的定義。我不認為數據科學是一個定義。相反,它融合了來自不同學科的技術,包括統計學、機器學習、編程、數據可視化和通信。
我特別喜歡 最近的一篇文章 ,其中介紹了兩種類型的數據科學家,“A類型”和“B類型”。
“A類型”的數據科學更側重于分析和實驗。從這個意義上講,一個數據科學家很可能做“統計學家”或“數據分析師”方向的事情,這是數據科學的一端。具體實例比如,運行A/B測試,以決定在Web應用中上線哪些新功能;或者為零售商店進行客戶細分的工作。這里的核心技能,除了技術,是溝通和表達,將結果和最終效果呈現給廣大(通常非技術)受眾。
“B類型”的數據科學更側重于創建一個時常處于自動化和實時的環境中,使用機器學習并作出決定的系統。具體實例比如,搜索和推薦引擎和欺詐檢測模型。核心技能往往強調軟件工程和進行較大規模計算的分布式系統。
在“大數據”項目中的數據科學家,其作用取決于項目的性質,通常對準上面提到的兩大陣營。然而,這兩種類型的數據科學家需要具備大數據量相關工作的特殊技能。包括分布式數據處理、可伸縮的機器學習方法,以及大規模數據可視化。
InfoQ: 我們來討論下不同的機器學習模型吧,它們會用于哪些場景或者解決什么問題?
Pentreath:機器學習的應用領域非常廣泛。從某種意義上說,幾乎所有涉及不確定條件下做預測的問題,都可以利用機器學習技術來處理。
機器學習模型的主要類型包括:
- 監督學習——用于預測給定的結果,比如欺詐檢測,或者客戶會購買某件產品的可能性;
- 無監督學習——用于嘗試揭開隱藏在原始數據背后的結構,比如學習單詞和原始文本數據的語言結構之間的關系;
- 強化學習——這基本上學習如何通過不斷地從一組有效的行動中選擇一個,最大限度地“獎勵”一些概念。示例包括許多人工智能的應用,比如自動飛行的直升機和學會玩視頻游戲的計算機。
在每種主要類型中,有許多不同的模型和算法,每個都有自身的優點和缺點。
InfoQ: What are different technologies to implement Machine Learning solutions? How does Spark compare with these technologies?
在實現機器學習的解決方案中,用到了哪些不同的技術?請比較一下這些技術與Spark?
Pentreath:幾乎有與模型的數量同樣多的機器學習庫和框架!其中使用最廣泛的是 R 語言及其諸多庫、Python語言的 scikit-learn 、Java語言的 Weka 和C++語言的 Vowpal Wabbit 。最近的一些新增的包括 H2O 和各種深度學習框架,比如 Caffe 和 Deeplearning4J 。
Apache Spark核心本身是一個分布式數據處理框架。Spark的MLlib庫提供了各種機器學習算法的分布式實現,重點解決的是大規模學習問題,通常涉及數億或數十億的訓練樣本。因此,它可能不會像一些其他通用庫那樣覆蓋盡可能多的算法。這其中部分原因是機器學習模型的分布式實現往往難以做到有效,另一個原因是MLlib仍然是一個出于開發狀態的年輕項目。
InfoQ:設計一款機器學習系統需要考慮些什么,最佳實踐是什么?
Pentreath:設計一款機器學習系統(相對于臨時的探索和分析)時的考慮因素與任何復雜的軟件系統的設計大致相同。可能包括:數據存儲和模式設計(比如,存儲和管理模型,以及各種輸入數據源)、不同組件的模塊化(比如,數據處理和構建模型的組件通常與模型服務組件分離)、單獨架構每個獨立的可擴展組件、系統和性能測試(包括傳統的軟件測試,以及測試和監控模型的性能),以及數據可視化(比如,模型性能和分析的儀表盤)。
此外,機器學習系統可以在大多數情況下,與各種其它系統進行互操作,如Web服務、報告系統、支付處理系統等。在這種情況下,所使用的方法包括面向服務的架構或者“微服務”,它們為機器學習系統和其他系統之間的通信提供了清晰的API。
InfoQ: 在本書的第4章,你討論了推薦引擎。能否談談不同的推薦模式,以及每種會有哪些選擇?
Pentreath:推薦模型一般分為三種主要類型——協同過濾、基于內容或者基于模型的方法。
“協同過濾”方法使用“眾包智慧”,基于大量其他用戶的行為,發現用戶(或項目)與給定用戶(或項目)的相似性。這推動了常見于電子商務網站的推薦,比如“瀏覽了這款產品的人還查瀏覽了......”。協同過濾的潛在假設是,具有類似行為的人也偏好類似的項目(例如,電影)。因此,當推薦電影給用戶時,我們可以查找與其相似的其他用戶,以及他們曾經觀看或評價過那些電影。然后,將這些電影推薦給用戶。
“基于內容”的模型使用項目的內容屬性(比如類別、標簽、說明以及其他數據)生成推薦。基于內容的模型一般不考慮其他用戶的整體行為。
“基于模型”的方法嘗試對用戶偏好的項目直接建模(比如,給定所有用戶對各種電影給出的評分集合,建模某個用戶對一部電影的預期評分)。基于模型的方法通常結合某種形式的協同過濾,并且還可以包括基于內容的方法。
協同過濾(和使用協同過濾的基于模型的方法)在實踐中,往往表現得非常好。
然而,這些模型的一個缺點是,需要相當多的可用數據。這些方法還無法處理“冷啟動問題”——當出現一個新的用戶或項目時,我們的模型沒有歷史數據,因此不能立即為該用戶(或項目)推薦,直到收集到一些偏好數據。最后,協同過濾的計算往往相當昂貴(特別在當用戶和項目的數量非常大的時候)。
基于內容的方法與協同過濾模型相比,缺乏“個性化”,而且常常執行得不好。然而,它們可以處理冷啟動問題,因為它們不需要新項目的偏好數據。
基于模型的方法往往嘗試混合使用協同過濾的強大功能和性能,以及基于內容過濾的靈活性和適應性。最新技術比如基于內容的深度學習中的特征提取、因式分解機、張量分解和其他混合模型都取得了強勁的性能(至少在基準數據集上)。
在實踐中,方法和模型的選用取決于領域、可用的數據(以及數據量),以及時間、成本和其他約束。通常,一個真實的系統融合了多種方法(或更有條理的組合,比如組合模型)。使用任何機器學習系統,測試和評估不同的方法在處理離線和實時數據中表現出來的性能,監控,并做出相應的調整都是非常重要的。
InfoQ:欺詐檢測是流行的機器學習實踐場景之一。能否講述一下如何使用MLlib庫實現這種場景呢?
Pentreath:欺詐檢測是二元分類問題的一個很好的例子。例如,我們可能希望創建一個模型,可以預測一個給定的網上交易是否是欺詐。潛在的結果只有兩種,要么 “欺詐”,要么“沒有欺詐”。
MLlib提供了一些適用于二元分類問題的算法,包括線性支持向量機、邏輯回歸、決策樹、樸素貝葉斯和多層感知。此外,還提供了組合模型(一組模型的組合預測),比如隨機森林、梯度提升模型。這些組合模型往往能夠在二元分類任務中取得非常不錯的表現。
對于任何機器學習問題來說,算法只是解決方案的一部分。在很多情況下,用于訓練的輸入數據(或“特征”)更為重要。這就是常說的,數據科學家需要花費高比例的時間,將原始輸入數據清洗和轉換成對機器學習模型有用的特征。
除了以上各種二元分類算法,MLlib還為這些算法提供了一套豐富的處理和轉換功能,可以從數據集生成特征。
另一個關鍵點是使用工具,比如交叉驗證(MLlib中可用),嚴格評價和比較不同特征轉換和模型管道的性能,如果可能的話,在實時數據中進行A/B測試。
InfoQ:如何將機器學習和Spark的其他庫一起使用,比如Spark Streaming和Spark SQL?
Pentreath:在最初的版本中,Spark MLlib通常是在RDD(即彈性分布式數據集,是Spark的核心數據結構的抽象)上操作的,在RDD中包含了特征向量(以及相關的“標簽”或“目標變量”)。
隨著DataFrames成為Spark上的SQL核心,MLlib推出了名為Spark ML的新API。特別是,Spark ML關注于使用豐富的、更高級的DataFrame API創建機器學習管道。
一個典型的機器學習工作流是,使用DataFrames讀取不同來源的數據。然后,使用Spark SQL過濾、聚合,并執行數據集上的其他初始化處理。接下來,可能涉及的步驟是,使用Spark ML將處理過的數據轉換以創建特征向量,隨后對模型進行訓練和評估。因此,從這個角度上說,Spark中的機器學習與Spark SQL和DataFrames已經深度集成。
Spark Streaming為集群和線性模型提供了流式數據實現。其它的Spark ML模型可以集成于Spark Streaming程序,比如,使用新的數據不斷更新的模型,或者我們模型的性能實時監控數據。
Nick還談到機器學習的未來,以及如何使用Spark MLlib庫開發機器學習的應用程序。
Pentreath:盡管機器學習可能看起來好像無處不在,我相信在使用機器學習技術來解決現實世界問題這條路上,我們才剛剛上路。自動化決策的需求數量將會變得更大,所以機器學習將會在許多不同的行業被越來越廣泛的應用。
同樣地,隨著數據量的不斷增長,分布式機器學習和大規模數據處理工具將變得越來越重要。可以看到,Apache Spark的核心功能包括解決“大數據”難題,它的MLlib和Spark ML是更容易開發和使用大型機器學習、獲得更廣用戶支持的關鍵因素。
我對通用機器學習和Apache Spark機器學習的未來充滿希望!
可以從 Packt的網站 上獲取關于Nick的書的更多信息,如果你對這本書感興趣,可以使用這個優惠碼“MLWSPK50”購買,這是電子書五折銷售的優惠碼,有效期至2016年2月29日。
關于受訪者
Nick Pentreath 是大數據和機器學習公司 Graphflow 的聯合創始人,該公司專注于推薦和客戶智能領域。Nick具有金融市場、機器學習和軟件開發的背景。他曾是高盛的研究科學家,定向于倫敦創業認知匹配的在線廣告。還層領導過非洲最大的社交網絡Mxit的數據科學和分析團隊。他熱衷于結合商業,使用機器學習和尖端科技打造而成智能系統,通過學習數據帶來底線的增值。自2013年以來,Nick一直參與Apache Spark項目,是Apache Spark PMC的成員。
查看英文原文: Machine Learning with Spark: Book Review and Interview
來自: http://www.infoq.com/cn/articles/machine-learning-with-spark-book-review