25

Spark 排序算法系列之 GBTs 使用方式介绍

 5 years ago
source link: https://mp.weixin.qq.com/s/2xBZS9pACQfZL1WWxN4oqQ?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

ieuQriI.jpg!web

 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模型的时候,流程是这样的

EvmUryM.jpg!web

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

RjeqQfQ.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK