機器學習庫Spark MLlib簡介與教程

banq發表於2021-12-29

Spark MLlib是 Apache Spark 的機器學習元件。 Spark 的主要吸引力之一是能夠大規模擴充套件計算,而這正是機器學習演算法所需要的。但侷限性是所有機器學習演算法都無法有效並行化。每個演算法都有自己的並行化挑戰,無論是任務並行還是資料並行。

話雖如此,Spark 正在成為構建機器學習演算法和應用程式的事實上的平臺。 好吧,在繼續閱讀部落格之前,您可以檢視由行業專家策劃的Spark 課程。 在 Spark MLlib 上工作的開發人員正在 Spark 框架中以可擴充套件和簡潔的方式實現越來越多的機器演算法。通過這個部落格,我們將學習機器學習的概念、Spark MLlib、它的實用程式、演算法和電影推薦系統的完整用例。 

 

Spark MLlib 概述

Spark MLlib 用於在 Apache Spark 中執行機器學習。MLlib 包含流行的演算法和實用程式。

MLlib 概述:

  • spark.mllib 包含構建在RDD 之上的原始 API。它目前處於維護模式。
  • spark.ml提供了構建在 DataFrames 之上的更高階別的 API,用於構建機器學習管道。spark.ml 是目前 Spark 的主要機器學習 API。

 

Spark MLlib 工具

Spark MLlib 提供以下工具:

  • ML 演算法:  ML 演算法構成了 MLlib 的核心。其中包括常見的學習演算法,例如分類、迴歸、聚類和協同過濾。
  •  特徵化:特徵化包括特徵提取、變換、降維和選擇。
  • 管道: 管道提供用於構建、評估和調整 ML 管道的工具。
  • 永續性: 永續性有助於儲存和載入演算法、模型和流水線。
  • 公用事業: 公用事業用於線性代數、統計和資料處理。

  

MLlib 演算法

Spark MLlib 中流行的演算法和實用程式是:

  1. 基本統計
  2. 迴歸
  3. 分類
  4. 推薦系統
  5. 聚類
  6. 降維
  7. 特徵提取
  8. 優化

 

基本統計

基本統計包括最基本的機器學習技術。這些包括:

  1. 彙總統計:示例包括均值、方差、計數、最大值、最小值和 numNonZeros。
  2. 相關性:Spearman 和 Pearson 是找到相關性的一些方法。
  3. 分層抽樣:包括 sampleBykey 和 sampleByKeyExact。
  4. 假設檢驗:Pearson 的卡方檢驗是假設檢驗的一個例子。
  5. 隨機資料生成:RandomRDDs、Normal 和 Poisson 用於生成隨機資料。

  

迴歸

迴歸分析是估計變數之間關係的統計過程。當重點是因變數與一個或多個自變數之間的關係時,它包括許多建模和分析多個變數的技術。更具體地說,迴歸分析有助於理解當任何一個自變數發生變化而其他自變數保持固定時,因變數的典型值如何變化。

迴歸分析廣泛用於預測和預測,其使用與機器學習領域有很大的重疊。迴歸分析還用於瞭解自變數中哪些與因變數相關,並探索這些關係的形式。在有限的情況下,迴歸分析可用於推斷自變數和因變數之間的因果關係。

 

分類

分類 是根據包含類別成員已知的觀察(或例項)的訓練資料集來識別新觀察屬於一組類別(子種群)中的哪一個的問題。這是模式識別的一個例子。

在這裡,一個例子是將給定的電子郵件分配到“垃圾郵件”或“非垃圾郵件”類別中,或者根據觀察到的患者特徵(性別、血壓、是否存在某些症狀、等等。)。 

 

推薦系統

一個推薦系統 是資訊過濾系統,試圖預測的“評級”或“偏愛”,使用者將給予專案的一個子類。近年來,推薦系統變得越來越流行,並被廣泛應用於電影、音樂、新聞、書籍、研究文章、搜尋查詢、社交標籤和一般產品等各個領域。

推薦系統通常以兩種方式之一生成推薦列表——通過協作和基於內容的過濾或基於個性的方法。 

  1. 協同過濾方法根據使用者過去的行為(之前購買或選擇的專案和/或給這些專案的數字評級)以及其他使用者做出的類似決定來構建模型。然後使用該模型來預測使用者可能感興趣的專案(或專案的評分)。
  2. 基於內容的過濾方法利用專案的一系列離散特徵來推薦具有相似屬性的其他專案。 

此外,這些方法通常組合為混合推薦系統。 

 

聚類

聚類是將一組物件以這樣的方式分組的任務,即同一組(稱為叢集)中的物件彼此之間比其他組(叢集)中的物件更相似(在某種意義上或另一種意義上)。因此,它是探索性資料探勘的主要任務,也是統計資料分析的常用技術,用於許多領域,包括機器學習、模式識別、影像分析、資訊檢索、生物資訊學、資料壓縮和計算機圖形學。

 

降維

降維 是通過獲得一組主要變數來減少所考慮的隨機變數數量的過程。可分為特徵選擇和特徵提取。

  1. 特徵選擇:特徵選擇找到原始變數(也稱為特徵或屬性)的子集。 
  2. 特徵提取:將高維空間中的資料轉換為維數較少的空間。資料變換可能是線性的,如主成分分析 (PCA),但也存在許多非線性降維技術。

 

特徵提取

特徵提取從一組初始測量資料開始,並構建旨在提供資訊和非冗餘的派生值(特徵),促進後續的學習和泛化步驟,並在某些情況下導致更好的人類解釋。這與降維有關。

 

優化

優化 是 從一組可用的備選方案中選擇最佳元素(關於某些標準)。 

在最簡單的情況下,優化問題包括通過系統地從允許的集合中選擇輸入值並計算函式值來最大化或最小化實際函式。優化理論和技術對其他公式的推廣包含了大量的應用數學領域。更一般地說,優化包括在給定定義的域(或輸入)的情況下找到某些目標函式的“最佳可用”值, 包括各種不同型別的目標函式和不同型別的域。

 

用例 - 電影推薦系統

問題陳述: 構建一個電影推薦系統,使用Apache Spark根據使用者的喜好推薦電影。

我們的要求:

因此,讓我們評估構建電影推薦系統的要求:

  1. 處理海量資料
  2. 來自多個來源的輸入
  3. 使用方便
  4. 快速處理

由於我們可以評估我們的需求,因此我們需要最好的大資料工具來在短時間內處理大資料。因此,Apache Spark是實現我們的電影推薦系統的完美工具。

使用來自 Spark Streaming 的 Streaming。我們可以實時流式傳輸或從 Hadoop HDFS 讀取資料。

  • 獲取資料集:

對於我們的電影推薦系統,我們可以從 IMDB、Rotten Tomatoes 和 Times Movie Ratings 等許多流行網站獲取使用者評分。該資料集有多種格式,例如 CSV 檔案、文字檔案和資料庫。我們可以從網站實時流式傳輸資料,也可以下載並將它們儲存在我們的本地檔案系統或 HDFS 中。

  • 機器學習:

整個推薦系統基於機器學習演算法交替最小二乘法。在這裡,ALS 是一種迴歸分析,其中迴歸用於在資料點之間畫一條線,以使與每個資料點的距離的平方和最小化。因此,這條線隨後用於預測函式在滿足自變數值的情況下的值。

Spark MLlib 實現:

  1. 我們將使用協同過濾 (CF) 根據使用者對其他電影的評分來預測使用者對特定電影的評分。
  2. 然後我們將其與其他使用者對該特定電影的評分進行協作。
  3. 為了從我們的機器學習中獲得以下結果,我們需要使用 Spark SQL 的 DataFrame、Dataset 和 SQL Service。

這是我們程式的虛擬碼:

import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating
import org.apache.spark.SparkConf
//Import other necessary packages
 
object Movie {
def main(args: Array[String]) {
 
val conf = new SparkConf().setAppName("Movie").setMaster("local[2]")
val sc = new SparkContext(conf)
val rawData = sc.textFile(" *Read Data from Movie CSV file* ")
 
//rawData.first()
val rawRatings = rawData.map( *Split rawData on tab delimiter* )
val ratings = rawRatings.map { *Map case array of User, Movie and Rating* }
 
//Training the data
val model = ALS.train(ratings, 50, 5, 0.01)
model.userFeatures
model.userFeatures.count
model.productFeatures.count
val predictedRating = *Predict for User 789 for movie 123*
val userId = *User 789*
val K = 10
val topKRecs = model.recommendProducts( *Recommend for User for the particular value of K* )
println(topKRecs.mkString("
"))
val movies = sc.textFile(" *Read Movie List Data* ")
val titles = movies.map(line => line.split("|").take(2)).map(array => (array(0).toInt,array(1))).collectAsMap()
val titlesRDD = movies.map(line => line.split("|").take(2)).map(array => (array(0).toInt,array(1))).cache()
titles(123)
val moviesForUser = ratings.*Search for User 789*
val sqlContext= *Create SQL Context*
val moviesRecommended = sqlContext.*Make a DataFrame of recommended movies*
moviesRecommended.registerTempTable("moviesRecommendedTable")
sqlContext.sql("Select count(*) from moviesRecommendedTable").foreach(println)
moviesForUser. *Sort the ratings for User 789* .map( *Map the rating to movie title* ). *Print the rating*
val results = moviesForUser.sortBy(-_.rating).take(30).map(rating => (titles(rating.product), rating.rating))
 }
}

生成預測後,我們可以使用 Spark SQL 將結果儲存到 RDBMS 系統中。此外,這可以顯示在 Web 應用程式上。

 

相關文章