Spark 排序算法系列之 GBTs 使用方式介紹
“ Spark推薦排序系列文章之GBDT(梯度提升決策樹)介紹 ”
01
—
前言
【Spark排序算法系列】主要介紹的是目前推薦系統或者廣告點選方面用的比較廣的幾種演算法,和他們在Spark中的應用實現,本篇文章主要介紹GBDT演算法,本系列還包括(持續更新):
-
Spark排序算法系列之LR(邏輯迴歸)
-
Spark排序算法系列之模型融合(GBDT+LR)
-
Spark排序算法系列之XGBoost
-
Spark排序算法系列之FTRL(Follow-the-regularized-Leader)
-
Spark排序算法系列之FM與FFM
在本篇文章中你可以學到:
-
Spark MLLib包中的GBDT使用方式
-
模型的通過儲存、載入、預測
-
PipeLine
-
ML包中的GBDT
02
—
概述
LR因為其容易並行最早應用到推薦排序中的,但學習能力有限,需要大量的特徵工程來增加模型的學習能力。但大量的特徵工程耗時耗力,且不一定帶來效果的提升,因此在如何能有效的發現特徵組合,來縮短LR特徵實驗週期的背景下,GBDT被應用了起來。GBDT模型全稱是Gradient Boosting Decision Tree,梯度提升決策樹。是屬於Boosing演算法中的一種,關於Boosting的介紹可以參考文章 整合學習(Ensemble Learning)
關於GBDT演算法理解可參考:
其實相信很多人對Spark 機器學習包(ml和mllib)中的GBDT傻傻分不清楚,這裡我們先來捋一捋。Spark中的GBDT較GBTs——梯度提升樹,因為其是基於決策樹(Decision Tree,DT)實現的,所以叫GBDT。Spark 中的GBDT演算法存在於ml包和mllib包中,mllib是基於RDD的,ml包則是針對DataFrame的,ml包中的GBDT分為分類和迴歸,在實際使用過程中,需要根據具體情況進行衡量和選擇。由於在實際生產環境中使用基於RDD的較多,所以下面將著重介紹下MLLib包中的GBTs,ML包中的將進行簡單說明。
03
—
MLLib中的GBTs
在前邊提到了GBTs是基於決策樹(Decision Tree,DT), 所以不瞭解DT的朋友可以先進行學習,這裡就不做過多解釋。GBDT 在Spark中的使用方式如下描述
建立Spark物件並載入資料
GBDT引數初始化
模型訓練與測試集載入
效果驗證
模型儲存
模型載入
數值預測
04
—
Pipeline
Spark ML Pipeline 的出現,是受到了 scikit-learn 專案的啟發,並且總結了 MLlib 在處理複雜機器學習問題上的弊端,旨在向用戶提供基於 DataFrame 之上的更加高層次的 API 庫,以更加方便的構建複雜的機器學習工作流式應用。一個 Pipeline 在結構上會包含一個或多個 PipelineStage,每一個 PipelineStage 都會完成一個任務,如資料集處理轉化,模型訓練,引數設定或資料預測等,這樣的 PipelineStage 在 ML 裡按照處理問題型別的不同都有相應的定義和實現。接下來,我們先來了解幾個重要概念。
-
DataFrame
相比RDD,DF包含了 schema 資訊,更類似傳統資料庫中的二維表格。它被 ML Pipeline 用來儲存源資料。DataFrame 可以被用來儲存各種型別的資料,如我們可以把特徵向量儲存在 DataFrame 的一列中,這樣用起來是非常方便的。
-
Transformer
Transformer 中文可以被翻譯成轉換器,是一個 PipelineStage,實現上也是繼承自 PipelineStage 類,主要是用來把 一個 DataFrame 轉換成另一個 DataFrame,比如一個模型就是一個 Transformer,因為它可以把 一個不包含預測標籤的測試資料集 DataFrame 打上標籤轉化成另一個包含預測標籤的 DataFrame,顯然這樣的結果集可以被用來做分析結果的視覺化。
-
Estimator
Estimator 中文可以被翻譯成評估器或介面卡,在 Pipeline 裡通常是被用來操作 DataFrame 資料並生產一個 Transformer,如一個隨機森林演算法就是一個 Estimator,因為它可以通過訓練特徵資料而得到一個隨機森林模型。實現上 Estimator 也是繼承自 PipelineStage 類。
-
Parameter
Parameter 被用來設定 Transformer 或者 Estimator 的引數。
要構建一個 Pipeline,首先我們需要定義 Pipeline 中的各個 PipelineStage,如指標提取和轉換模型訓練等。有了這些處理特定問題的 Transformer 和 Estimator,我們就可以按照具體的處理邏輯來有序的組織 PipelineStages 並建立一個 Pipeline,如 :
val pipeline = new Pipeline().setStages(Array(stage1,stage2,stage3,…))
然後就可以把訓練資料集作為入參並呼叫 Pipelin 例項的 fit 方法來開始以流的方式來處理源訓練資料,這個呼叫會返回一個 PipelineModel 類例項,進而被用來預測測試資料的標籤,它是一個 Transformer。
比如在構建一個GBDT模型的時候,流程是這樣的
05
—
ML包中的GBTs
從Spark 2.0開始,spark.mllib包中基於RDD的API已進入維護模式。 Spark的主要機器學習API現在是spark.ml包中基於DataFrame的API。接下來我們看下ml包中的GBDT(regression)。
載入資料訓練模型
模型評估
其餘相關程式碼可參考MLLib中的GBTs
本篇文章中涉及的程式碼可在github中找到:
https://github.com/Thinkgamer/Hadoop-Spark-Learning/tree/master/Spark