【DSW Gallery】Gbdt-FM模型

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: GBDT+FM 模型是由 Gbdt+LR 延伸出来的模型。该模型利用GBDT自动进行特征筛选和组合,进而生成新的离散特征向量,再把该特征向量当做 FM 模型的输入,来产生最后的预测结果。该模型能够综合利用用户、物品和上下文等多种不同的特征,生成较为全面的推荐,在CTR点击率预估场景下使用较为广泛。

直接使用

请打开Gbdt-FM模型,并点击右上角 “ 在DSW中打开” 。

image.png


Gbdt + FM 一体化模型训练及服务部署

GBDT+FM 模型是由 Gbdt+LR 延伸出来的模型。该模型利用GBDT自动进行特征筛选和组合,进而生成新的离散特征向量,再把该特征向量当做 FM 模型的输入,来产生最后的预测结果。该模型能够综合利用用户、物品和上下文等多种不同的特征,生成较为全面的推荐,在CTR点击率预估场景下使用较为广泛。
本文将介绍如何基于DSW使用 Alink 快速的构建 Gbdt+FM 模型,并且会介绍如何方便的将建立的模型部署成服务。

运行环境要求

1. PAI-DSW 官方镜像中默认已经安装了 PyAlink,内存要求 4G 及以上。
2. 本 Notebook 的内容可以直接运行查看,不需要准备任何其他文件。
from pyalink.alink import *
useLocalEnv(2)
Use one of the following commands to start using PyAlink:
 - useLocalEnv(parallelism, flinkHome=None, config=None): run PyAlink scripts locally.
 - useRemoteEnv(host, port, parallelism, flinkHome=None, localIp="localhost", config=None): run PyAlink scripts on a Flink cluster.
 - getMLEnv(): run PyAlink scripts as PyFlink scripts, support 'flink run -py xxx.py'.
Call resetEnv() to reset environment and switch to another.
JVM listening on 127.0.0.1:58007
MLEnv(benv=<pyflink.dataset.execution_environment.ExecutionEnvironment object at 0x7fdd965a0ed0>, btenv=<pyflink.table.table_environment.BatchTableEnvironment object at 0x7fdd965a0ad0>, senv=<pyflink.datastream.stream_execution_environment.StreamExecutionEnvironment object at 0x7fdd965a0b50>, stenv=<pyflink.table.table_environment.StreamTableEnvironment object at 0x7fdd965cc050>)

扩展到更大规模的数据

在这个示例中,我们使用 useLocalEnv 在本地(也就是 DSW 的 container 内)运行 Alink 作业,使用多线程的方式模拟分布式计算。

对于更大规模的数据,可以使用 usePAIEnv 向大规模集群提交作业,详细使用可以通过 help(usePAIEnv) 查看。

数据准备

Adult 数据来源 https://archive.ics.uci.edu/ml/datasets/Adult

算法相关文档:

Adult数据集(即“人口普查收入”数据集),由美国人口普查数据集库 抽取而来,其中共包含48842条记录,年收入大于50k美元的占比23.93%,年收入小于50k美元的占比76.07%,并且已经划分为训练数据32561条和测试数据16281条。 该数据集类变量为年收入是否超过50k美元,属性变量包括年龄、工种、学历、职业等 14类重要信息,其中有8类属于类别离散型变量,另外6类属于数值连续型变量。该数据集是一个分类数据集,用来预测年收入是否超过50k美元。

PATH = "https://alink-test-data.oss-cn-hangzhou.aliyuncs.com/"
TRAIN_FILE = "adult_train.csv"
TEST_FILE = "adult_test.csv"
SCHEMA_STRING = "age bigint, workclass string, fnlwgt bigint, education string, education_num bigint,"\
    + " marital_status string, occupation string, relationship string, race string, sex string, "\
    + "capital_gain bigint, capital_loss bigint, hours_per_week bigint, native_country string, label string"
trainData = CsvSourceBatchOp() \
    .setFilePath(PATH + TRAIN_FILE) \
    .setFieldDelimiter(",") \
    .setSchemaStr(SCHEMA_STRING)
testData = CsvSourceBatchOp() \
    .setFilePath(PATH + TEST_FILE) \
    .setFieldDelimiter(",") \
    .setSchemaStr(SCHEMA_STRING)
trainData.lazyPrint(5)
BatchOperator.execute()
age workclass fnlwgt education education_num marital_status occupation relationship race sex capital_gain capital_loss hours_per_week native_country label
0 51 Private 166934 HS-grad 9 Married-civ-spouse Machine-op-inspct Husband White Male 0 0 40 United-States >50K
1 80 Self-emp-not-inc 26865 7th-8th 4 Never-married Farming-fishing Unmarried White Male 0 0 20 United-States <=50K
2 24 Private 227594 Some-college 10 Never-married Sales Own-child White Female 0 0 20 United-States <=50K
3 50 Private 93690 HS-grad 9 Married-civ-spouse Transport-moving Husband White Male 0 0 40 United-States >50K
4 35 Local-gov 226311 Some-college 10 Divorced Adm-clerical Own-child White Female 0 0 38 United-States <=50K

训练模型

算法相关文档:

我们通过将 GbdtEncoder 和 FM 这两个算子放到一个Pipeline的方式完成模型的一体化训练。这里是用GbdtEncoder对输入的数据进行编码,并将编码的结果输送给FM进行训练。最终我们得到一个pipeline model,这个模型可以用来对数据进行推理,也可以部署成服务。

featureCols = ["age", "fnlwgt", "education_num", "capital_gain",
            "capital_loss", "hours_per_week", "workclass", "education", "marital_status", "occupation",
            "relationship", "race", "sex", "native_country"]
numericalCols = ["age", "fnlwgt", "education_num", "capital_gain",
            "capital_loss", "hours_per_week"]
label = "label"
vecCol = "vec"
gbdtFmPipe = Pipeline() \
    .add(
        GbdtEncoder()\
            .setLabelCol(label)\
            .setFeatureCols(featureCols)\
            .setReservedCols([label])\
            .setPredictionCol(vecCol))\
    .add(
        FmClassifier() \
            .setVectorCol(vecCol) \
            .setLabelCol(label) \
            .setReservedCols([label]) \
            .setPredictionDetailCol("detail") \
            .setPredictionCol("pred"))
model = gbdtFmPipe.fit(trainData)

模型评估

算法相关文档:

模型评估阶段,我们先试用上面训练好的模型对testData进行推理,然后用评估组件EvalBinaryClassBatchOp对推理结果进行评估,最后使用JsonValueBatchOp组件完成评估结果的抽取。

result = model.transform(testData)
result.lazyPrint(5)
EvalBinaryClassBatchOp() \
    .setPredictionDetailCol("detail").setLabelCol(label).linkFrom(result) \
    .link(JsonValueBatchOp().setSelectedCol("Data") \
        .setReservedCols([]) \
        .setOutputCols(["Accuracy", "AUC", "ConfusionMatrix"]) \
        .setJsonPath(["$.Accuracy", "$.AUC", "ConfusionMatrix"])).print()
label pred detail
0 <=50K <=50K {"<=50K":"0.9995387333228002",">50K":"4.612666771997954E-4"}
1 >50K >50K {"<=50K":"1.812868328410211E-5",">50K":"0.9999818713167159"}
2 <=50K <=50K {"<=50K":"0.999317570963927",">50K":"6.824290360729248E-4"}
3 <=50K <=50K {"<=50K":"0.9691711111422066",">50K":"0.030828888857793415"}
4 <=50K <=50K {"<=50K":"0.9650003558051857",">50K":"0.03499964419481427"}


Accuracy AUC ConfusionMatrix
0 0.851852 0.904172 [[2251,817],[1595,11618]]

与 Gbdt+LR 效果对比

算法相关文档:

通过对比可以看到,Gbdt+FM 的效果要比 Gbdt+LR 好一些,对于同一个数据,AUC 大概高0.7个百分点。

gbdtLrPipe = Pipeline() \
    .add(
        GbdtEncoder()\
            .setLabelCol(label)\
            .setFeatureCols(featureCols)\
            .setReservedCols([label])\
            .setPredictionCol(vecCol))\
    .add(
        LogisticRegression() \
            .setVectorCol(vecCol) \
            .setLabelCol(label) \
            .setReservedCols([label]) \
            .setPredictionDetailCol("detail") \
            .setPredictionCol("pred"))
lrModel = gbdtLrPipe.fit(trainData)
resultLr = lrModel.transform(testData)
resultFm = model.transform(testData)
EvalBinaryClassBatchOp() \
    .setPredictionDetailCol("detail").setLabelCol(label).linkFrom(resultLr) \
    .link(JsonValueBatchOp().setSelectedCol("Data") \
        .setReservedCols([]) \
        .setOutputCols(["Accuracy", "AUC", "ConfusionMatrix"]) \
        .setJsonPath(["$.Accuracy", "$.AUC", "ConfusionMatrix"])).print()
EvalBinaryClassBatchOp() \
    .setPredictionDetailCol("detail").setLabelCol(label).linkFrom(resultFm) \
    .link(JsonValueBatchOp().setSelectedCol("Data") \
        .setReservedCols([]) \
        .setOutputCols(["Accuracy", "AUC", "ConfusionMatrix"]) \
        .setJsonPath(["$.Accuracy", "$.AUC", "ConfusionMatrix"])).print()
Accuracy AUC ConfusionMatrix
0 0.847 0.89727 [[2432,1077],[1414,11358]]


Accuracy AUC ConfusionMatrix
0 0.851852 0.904172 [[2251,817],[1595,11618]]


模型写出

算法相关文档:

模型写出阶段,我们使用AkSinkBatchOp将模型写出到文件系统,这里的文件系统可以是本地文件系统(如代码所示),也可以时网络文件系统(比如OSS),可以通过代码:

  fs = OssFileSystem("3.4.1", "oss-cn-hangzhou-zmf.aliyuncs.com", "name", "************", "**********")
  filePath = FilePath("/model/gbdt_fm_model.ak", fs)

完成网络文件系统路径的构建,将这个路径以参数的方式塞给AkSinkBatchOp组件:

  AkSinkBatchOp().setFilePath(filePath).setOverwriteSink(True)

便可以完成将模型写出待网络文件系统的目的。

modelData = model.save();
filePath = "/tmp/gbdt_fm_model.ak"
# 可以将模型文件写出到OSS,这样可以直接部署到EAS,需要一个OSS的idkey。此处直接写出到/tmp 目录下
# fs = OssFileSystem("3.4.1", "oss-cn-hangzhou-zmf.aliyuncs.com", "name", "************", "**********")
# filePath = FilePath("/model/gbdt_fm_model.ak", fs)
modelData.link(AkSinkBatchOp().setFilePath(filePath).setOverwriteSink(True));
BatchOperator.execute();

加载模型并推理

这里加载模型的路径和模型写出时一样,可以是本地文件系统(如代码所示),也可以时网络文件系统(比如OSS)。

model = PipelineModel.load(filePath)
result = model.transform(testData).lazyPrint(5)
BatchOperator.execute()
label pred detail
0 <=50K <=50K {"<=50K":"0.9995387333228002",">50K":"4.612666771997954E-4"}
1 >50K >50K {"<=50K":"1.812868328410211E-5",">50K":"0.9999818713167159"}
2 <=50K <=50K {"<=50K":"0.999317570963927",">50K":"6.824290360729248E-4"}
3 <=50K <=50K {"<=50K":"0.9691711111422066",">50K":"0.030828888857793415"}
4 <=50K <=50K {"<=50K":"0.9650003558051857",">50K":"0.03499964419481427"}


模型部署

模型部署可以使用命令行部署:

!./eascmd64 -i {EAS AccessKeyId} -k {EAS AccessKeySecret} -e pai-eas.cn-beijing.aliyuncs.com create config.json

也可以通过阿里云PAI的交互界面,通过填写若干参数,一键部署,具体细节可以参见文档:

相关实践学习
使用PAI+LLaMA Factory微调Qwen2-VL模型,搭建文旅领域知识问答机器人
使用PAI和LLaMA Factory框架,基于全参方法微调 Qwen2-VL模型,使其能够进行文旅领域知识问答,同时通过人工测试验证了微调的效果。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
机器学习/深度学习 算法 搜索推荐
一文读懂FM算法优势,并用python实现!(附代码)
介绍 我仍然记得第一次遇到点击率预测问题时的情形,在那之前,我一直在学习数据科学,对自己取得的进展很满意,在机器学习黑客马拉松活动中也开始建立了自信,并决定好好迎接不同的挑战。 为了做得更好,我购买了一台内存16GB,i7处理器的机器,但是当我看到数据集的时候却感到非常不安,解压缩之后的数据大概有50GB - 我不知道基于这样的数据集要怎样进行点击率预测。
15369 0
|
机器学习/深度学习 测试技术 Ruby
YOLOv8改进 | 主干篇 | 反向残差块网络EMO一种轻量级的CNN架构(附完整代码 + 修改教程)
YOLOv8改进 | 主干篇 | 反向残差块网络EMO一种轻量级的CNN架构(附完整代码 + 修改教程)
345 0
|
8月前
|
供应链 搜索推荐 API
亚马逊商品列表数据接口(亚马逊 API 系列)
亚马逊的商品列表数据接口为电商从业者、数据分析人员和开发者提供了宝贵的市场洞察。通过该接口,用户可以批量获取商品的关键信息,包括基本信息、价格、销售排名和库存状态等,助力市场分析、竞品研究和商品推荐。开发者需在亚马逊开发者中心注册并申请API权限,使用安全凭证进行认证,支持HTTP/HTTPS协议的GET和POST请求。Python示例展示了如何调用接口获取商品列表,并解析响应数据。应用场景涵盖市场趋势分析、竞品对比、个性化推荐及库存管理,帮助商家优化策略,提升竞争力。
378 13
|
机器学习/深度学习 搜索推荐 算法
【王喆-推荐系统】模型篇-(task5)wide&deep模型
Wide&Deep是工业界中有巨大影响力的模型,如果直接翻译成中文是宽和深的模型,其模型结构如下所示:wide和deep让模型兼具逻辑回归和深度神经网络的特点。
1810 0
【王喆-推荐系统】模型篇-(task5)wide&deep模型
|
机器学习/深度学习 数据采集 数据可视化
Python实现支持向量机SVM分类模型线性SVM决策过程的可视化项目实战
Python实现支持向量机SVM分类模型线性SVM决策过程的可视化项目实战
Python实现支持向量机SVM分类模型线性SVM决策过程的可视化项目实战
|
Unix 数据挖掘
一文读懂Polars中的时间处理:从字符串到时间戳的转换秘籍!
一文读懂Polars中的时间处理:从字符串到时间戳的转换秘籍!
585 0
|
机器学习/深度学习 编解码 算法
算法工程师面试问题总结 | YOLOv5面试考点原理全解析
本文给大家带来的百面算法工程师是深度学习目标检测YOLOv5面试总结,文章内总结了常见的提问问题,旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中,我们还将介绍一些常见的深度学习目标检测面试问题,并提供参考的回答及其理论基础,以帮助求职者更好地准备面试。通过对这些问题的理解和回答,求职者可以展现出自己的深度学习目标检测领域的专业知识、解决问题的能力以及对实际应用场景的理解。同时,这也是为了帮助求职者更好地应对深度学习目标检测岗位的面试挑战,提升面试的成功率和竞争力。
|
机器学习/深度学习 算法
YOLOv8改进算法之添加CA注意力机制
CA(Coordinate Attention)注意力机制是一种用于加强深度学习模型对输入数据的空间结构理解的注意力机制。CA 注意力机制的核心思想是引入坐标信息,以便模型可以更好地理解不同位置之间的关系
2604 0
|
存储 关系型数据库 索引
B+树层数计算(面试官直呼内行)
首先搞清楚一个常识,我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一毛 在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是 512 字节,而文件系统(例如XFS/EXT4)他的最小单元是块,一个块的大小是 4k
2304 0
|
SQL 存储 Oracle
Oracle之3种表连接方式(排序合并连接、嵌套循环、哈希连接)
Oracle之3种表连接方式(排序合并连接、嵌套循环、哈希连接) 排序合并连接 1.2.4.2.1  排序合并连接 排序合并连接(Sort Merge Join)是一种两个表在做表连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的表连接方法。
3594 0

热门文章

最新文章