如今,再討論大數據,無論是互聯網行業還是傳統行業似乎都有話說。大數據改變了很多,也帶來了很多。人工智能作為大數據的一個重要分支,也紛紛被各大企業劃入未來的規劃之內。不久前,李開復就曾說過,未來的人工智能市場將比如今大火的移動互聯市場要大10倍。
本文將討論Spark的開源機器學習庫Spark ML。從Spark 1.6開始,Spark ML軟件包中基于DataFrame的API推薦明顯多于基于RDD的API,但是還未完全取代。從Spark 2.0開始,Spark.ML軟件包中基于RDD的API已進入維護模式。Spark的主要機器學習API現在是Spark.ML包中基于DataFrame的API。
Databricks服務對數據科學家來說是一個很好的選擇。它具有完整的攝取,特征選擇,模型構建和評估功能,以及與數據源的大量集成和出色的可擴展性。Databricks服務提供了一個基于Spark的云服務。Databricks公司由Spark的原創開發商Matei Zaharia和來自U.C.Berkeley’s AMPLab的公司創立。同時,Databricks也是Apache Spark項目的主要貢獻者。
Spark ML特點
Spark ML庫提供了通用的機器學習算法,如分類,回歸,聚類和協同過濾(但沒有深度神經網絡)以及用于特征提取,變換,降維和用于構建,評估和調整ML的選項和工具管道。Spark ML還包括用于保存和加載算法,模型,管道,用于數據處理以及進行線性代數和統計的實用程序。
Spark ML是用Scala編寫的,并使用了線性代數包Breeze。Breeze依靠netlib-java來優化數值處理。 如果你有機器優化的本地netlib-java二進制代理,這將使整個庫比純JVM實現運行得更快。在Mac上,默認情況下安裝的是veclib框架。
你也可以通過Databricks配置的Spark集群使用GPU,而不僅僅是只有CPU的Apache Spark。GPU可以為具有大量數據的復雜機器學習模型帶來10倍的速度提升,盡管與機器優化的CPU庫相比,這可能導致數據規模較小的簡單機器學習模型的訓練速度降低。
MLlib實現了分類和回歸的常用算法和模型,這可能是新手容易混亂的點,但專家可能會有更好的用于數據分析的模型選擇。對于這么多模型,Spark ML增加了超參數調整的重要特性,也稱為模型選擇,它允許分析人員設置參數網格,估計器和評估者,并通過交叉驗證方法(耗時但很準確)或訓練驗證分割方法(很快但不太準確)找到最佳的數據模型。
Spark ML擁有針對Scala和Java的完整API,主要是針對Python的完整API以及針對R的部分API。通過示例計算,ML覆蓋:54個Java和60個Scala ML示例,52個Python ML 示例,但只有5個R示例。
Spark安裝
如果你的電腦上已經安裝了java 1.8.0_05,那安裝Scala2.11.8就沒有其他額外工作了,也可以考慮安裝再安裝Python 2.7和R 3.3.1。安裝Spark時,當Spark沒有檢測到Hadoop會發出警告:“WARN NativeCodeLoader:無法為您的平臺加載native-hadoop庫......請在適當的情況下使用內置java類” 。
目前有一種使用默認Spark AMI在Amazon EC2上設置Spark集群的簡單方法。據推測,如果你已經安裝了Spark和具有EC2權限的Amazon帳戶,整個過程大約只需要五分鐘。
在服務器上安裝帶有Spark的Hadoop集群可能很復雜,這取決于你使用的集群管理器。除非你自己就是做這個的,否則你可能很難解決這個問題。
如果你不想安裝但仍想使用Spark,你可以在Databricks上運行。一個免費的Databricks社區集群可以提供6GB的RAM節點和0.88核。付費集群可以在Amazon r3.2xlarge EC2實例上部署內存優化節點(30GB,四核),部署在Amazon c3.4xlarge EC2實例上的計算優化節點(15GB,八核)或部署在Amazon上的GPU節點 g2.2xlarge(一個GPU)或g2.8xlarge(四個GPU)EC2實例類型。
使用Databricks的一個優點是,你可以使用從1.3到當前的任何Spark版本創建集群,這很重要,因為一些舊的Spark ML程序包括示例,只能在特定版本的Spark上正確運行,其他版本會拋出錯誤。
運行Spark ML
雖然Databricks默認提供了一個兼容Jupyter notebook來運行Spark,標準的Apache Spark從命令行開始分布式運行。Spark存儲庫中有多個腳本:./ bin / run-example從存儲庫運行示例代碼; ./bin/spark-shell運行交互式Scala shell; ./bin/pyspark運行交互式Python shell; ./bin/sparkR用于運行R shell; 和用于運行應用程序的通用./bin/spark-submit。Spark提交腳本繼而運行spark-class,它負責查找Java和Spark .jar文件,然后啟動所需的腳本。
默認情況下,Spark都會生成一個詳細的日志輸出流,即使沒有實質性的輸出。下圖展示的是使用Spark來計算Pi的一個Scala示例。 計算值,從底部大約10行,僅精確到三位數。
幸運的是,可以使用設置來減小終端日志輸出。但是還有一個更好的方法來運行Spark。使用Jupyter類型的筆記本隱藏日志記錄并且散置解釋性文本,代碼和輸出,如下面兩個Databricks屏幕截圖所示。
實際上,你不需要在Databricks上用Jupyter Notebook運行Spark。你可以在本地安裝Jupyter,并在默認的IPython內核之上添加所需的任何語言的核(例如Scala和R)。如果你在網上搜索“如何在Jupyter Notebook上使用Spark”,你會發現很多具體說明。
學習Spark ML
在Spark網站上,你將看到用于運行分布式Scala,Java,Python和R示例的說明,Spark API快速啟動和編程指南及其他相關文件。示例頁面解釋了Python,Scala和Java中的一些簡單示例。
Spark遇到TensorFlow
正如我們所看到的,Spark ML提供了基本機器學習,特征選擇,管道等。它在分類,回歸,聚類和過濾方面都做得很好。鑒于它是Spark的一部分,它還具有訪問數據庫,流和其他數據源的強大訪問權限。
另一方面,Spark ML并沒有采用與Google TensorFlow,Caffe和Microsoft Cognitive Toolkit相同的方式建模和訓練深度神經網絡。為此,Databricks一直致力于將Spark的可擴展性和超參數調整與TensorFlow的深度神經網絡訓練和部署相結合。
如果你安裝了Hadoop,并希望用機器學習做數據科學,Spark ML是一個明智的選擇。如果你需要用深度神經網絡正確建模數據,那么Spark ML不是最好的選擇,但你可以將它與其他工具相結合,以創造一個更適合的工具。
成本:免費,因為開源。 平臺:Spark運行在Windows和類Unix系統(如Linux,MacOS)上,使用Java 7或更高版本,Python 2.6 / 3.4或更高版本以及R 3.1或更高版本。 對于Scala API,Spark 2.0.1使用Scala 2.11。