PAI-Rec模块化推荐算法定制的最佳实践文档

更新时间:
复制为 MD 格式

为方便您快捷体验PAI-Rec产品,本文提供了一份公开数据集,您可以按照文档说明,按步骤体验PAI-Rec推荐算法定制的特征工程、召回、精排等关键功能的配置,生成代码并部署到DataWorks相应的业务流程中。相比非模块化方案定制,模块化可以实现单独功能的上下线,减少对推荐其余流程产生影响。

前提条件

为什么要把推荐方案定制做模块化的拆分?

  • 通过新增特征组的概念,让用户更容易的新增特征组迭代模型。

  • 一键上线,包含了部署、自动启动补数任务,减少用户的操作时间。

  • 在排序模块才真正对需要的特征组、样本、fg等模块全部补数,如果特征工程配置出错,返工的成本更低。

在开始执行操作前,请确认您已完成以下准备工作:

1.创建PAI-Rec实例并初始化服务

  1. 登录推荐系统开发平台首页,单击立即购买

  2. PAI-Rec实例购买页面,配置以下关键参数,然后单击立即购买

    参数

    说明

    地域和可用区

    您的云服务部署的地域。

    服务类型

    本方案选择标准版,并启用“推荐方案定制”功能

  3. 登录PAI-Rec管理控制台,在顶部菜单栏左上角处,选择地域。

  4. 在左侧导航栏选择实例列表,单击实例名称,进入实例详情页面。

  5. 单击操作指引区域的云产品配置,跳转至系统配置>云产品配置页面,单击编辑,按照如下资源配置完成相应参数配置,然后单击退出

    资源配置

    参数

    说明

    建模

    机器学习平台 PAI 工作空间

    填写已创建的PAI默认工作空间。

    大数据开发治理平台 DataWorks 工作空间

    填写自动生成的DataWorks工作空间。

    大数据计算服务 MaxCompute 项目(工作)空间

    填写已创建的MaxCompute项目。

    对象存储 OSS Bucket

    选择已创建的OSS Bucket。

    引擎

    实时召回引擎

    确认是否使用PAI-FeatureStore,选择

    实时特征查询

    确认是否使用PAI-FeatureStore,选择

  6. 在左侧导航栏选择系统配置>权限管理,按照界面提示,在访问服务页签检查各项云产品授权情况,确保对应云产品访问状态正常。

2. 克隆公开数据集

1.同步数据表

本方案的输入数据有两种方案:

  1. pai_online_project项目中克隆固定时间窗的数据,不支持任务例行调度执行。

  2. 提供Python脚本,通过代码产出数据,可以通过DataWorks执行任务产出指定时间段的数据。

如果需要调度每天产出数据和训练模型,建议使用第二种方案。您需要部署指定的Python代码以生成所需数据,详情请参见“通过代码产出数据”页签。

同步固定时间窗的数据

PAI-Rec在公开访问的项目pai_online_project中提前准备了推荐算法中常用的三张表:

  • 用户表:pai_online_project.rec_sln_demo_user_table

  • 物品表:pai_online_project.rec_sln_demo_item_table

  • 行为表:pai_online_project.rec_sln_demo_behavior_table

本方案后续的操作均基于上述三张表,其数据均是随机生成的模拟数据,没有真实业务含义,因此训练得到的AUC等指标较低。您需要在DataWorks中执行SQL命令,从pai_online_project项目中将上述表数据同步到您的DataWorks项目(例如DataWorks_a)中。具体操作步骤如下:

  1. 登录DataWorks控制台,在顶部菜单栏左上角处,选择地域。

  2. 在左侧导航栏单击数据开发与运维>数据开发

  3. 选择已创建的DataWorks工作空间后,单击进入数据开发

  4. 鼠标悬停至新建,选择新建节点>MaxCompute>ODPS SQL,按照如下资源配置完成相应参数配置,然后单击确认

    资源配置

    参数

    说明

    引擎实例

    选择已绑定的MaxCompute数据源。

    节点类型

    选择节点类型ODPS SQL。

    路径

    选择当前节点所在路径。例如业务流程/Workflow/MaxCompute

    名称

    自定义填写,例如Data。

  5. 在新建节点区域,复制并运行下面的代码,将用户表、物品表、行为表从pai_online_project项目同步到您已创建的MaxCompute项目(例如project_mc)中。执行代码需要设置变量,指定bizdatebizdate日期之前100天的数据。一般把bizdate设置为当前的日期的前一天,设置调度参数如下:image以下代码执行一次,即可将数据从公共的pai_online_project项目复制到用户的项目中:

CREATE TABLE IF NOT EXISTS rec_sln_demo_user_table_v1(
 user_id BIGINT COMMENT '用户唯一ID',
 gender STRING COMMENT '性别',
 age BIGINT COMMENT '年龄',
 city STRING COMMENT '城市',
 item_cnt BIGINT COMMENT '创作内容数',
 follow_cnt BIGINT COMMENT '关注数',
 follower_cnt BIGINT COMMENT '粉丝数',
 register_time BIGINT COMMENT '注册时间',
 tags STRING COMMENT '用户标签'
) PARTITIONED BY (ds STRING) STORED AS ALIORC;

INSERT OVERWRITE TABLE rec_sln_demo_user_table_v1 PARTITION(ds)
SELECT *
FROM pai_online_project.rec_sln_demo_user_table
WHERE ds >= "${bizdate_100}" and ds <= "${bizdate}";

CREATE TABLE IF NOT EXISTS rec_sln_demo_item_table_v1(
 item_id BIGINT COMMENT '内容ID',
 duration DOUBLE COMMENT '视频时长',
 title STRING COMMENT '标题',
 category STRING COMMENT '一级标签',
 author BIGINT COMMENT '作者',
 click_count BIGINT COMMENT '累计点击数',
 praise_count BIGINT COMMENT '累计点赞数',
 pub_time BIGINT COMMENT '发布时间'
) PARTITIONED BY (ds STRING) STORED AS ALIORC;

INSERT OVERWRITE TABLE rec_sln_demo_item_table_v1 PARTITION(ds)
SELECT *
FROM pai_online_project.rec_sln_demo_item_table
WHERE ds >= "${bizdate_100}" and ds <= "${bizdate}";

CREATE TABLE IF NOT EXISTS rec_sln_demo_behavior_table_v1(
 request_id STRING COMMENT '埋点ID/请求ID',
 user_id STRING COMMENT '用户唯一ID',
 exp_id STRING COMMENT '实验ID',
 page STRING COMMENT '页面',
 net_type STRING COMMENT '网络型号',
 event_time BIGINT COMMENT '行为时间',
 item_id STRING COMMENT '内容ID',
 event STRING COMMENT '行为类型',
 playtime DOUBLE COMMENT '播放时长/阅读时长'
) PARTITIONED BY (ds STRING) STORED AS ALIORC;


INSERT OVERWRITE TABLE rec_sln_demo_behavior_table_v1 PARTITION(ds)
SELECT *
FROM pai_online_project.rec_sln_demo_behavior_table
WHERE ds >= "${bizdate_100}" and ds <= "${bizdate}";

通过代码产出数据

使用固定时间窗的数据,不支持任务例行调度执行。如果有执行需求,您需要部署特定的Python代码以生成所需数据。具体操作步骤如下:

  1. DataWorks控制台创建PyODPS 3节点,详情请参见创建并管理MaxCompute节点

  2. 单击并下载create_data.py,将文件内容粘贴到PyODPS 3节点中。

  3. 单击右侧的调度配置,并配置以下参数,然后单击右上角的保存image和提交image

    • 配置调度参数:

      • 注意替换变量:

        $user_table_name可以替换为rec_sln_demo_user_table

        $item_table_name可以替换为rec_sln_demo_item_table

        $behavior_table_name可以替换为rec_sln_demo_behavior_table

        image

        替换后:

        image

    • 配置调度依赖。

  4. 单击运维中心,并选择周期任务运维 > 周期任务

  5. 单击目标任务操作列下的补数据 > 当前节点及下游节点

  6. 补数据配置面板中,设置业务日期,并单击提交并跳转

    较好的补数据时间范围为60天,建议您将业务日期设置为任务定时调度日期-60,以确保数据的完整性。

2.配置依赖节点

为了确保后续代码生成与部署的顺利进行,请预先在您的DataWorks项目中添加三个SQL代码节点。请将这些节点的调度依赖配置为工作空间的根节点,完成所有设置后再发布节点。具体操作步骤如下:

  1. 鼠标悬停至新建,选择新建节点>通用>虚拟节点,按照如下资源配置分别创建3个虚拟节点,然后单击确认

    资源配置

    参数

    说明

    方案默认示例

    节点类型

    选择节点类型。

    虚拟节点

    路径

    选择当前节点所在路径。

    业务流程/Workflow/通用

    名称

    分别填写已同步的数据表名称。

    • rec_sln_demo_user_table_v1

    • rec_sln_demo_item_table_v1

    • rec_sln_demo_behavior_table_v1

    image

  2. 选中节点,分别将代码节点内容设置为select 1;,然后单击右侧的调度配置,完成以下配置:

    • 时间属性区域,设置重跑属性运行成功或失败后节点重跑

    • 调度依赖>依赖的上游节点区域,输入DataWorks工作空间名称,选择带有_root后缀的节点,单击添加

      3个虚拟节点均需配置。

      image

  3. 单击虚拟节点前的image,提交该节点。

3.注册数据

为了后续在推荐方案定制功能中配置特征工程、召回、排序算法,您需要先注册同步到DataWorks项目中的三张表,具体操作步骤如下:

  1. 登录PAI-Rec管理控制台,在顶部菜单栏左上角处选择地域。

  2. 在左侧导航栏选择实例列表,单击实例名称,进入实例详情页面。

  3. 在左侧导航栏选择推荐方案定制>数据注册,在MaxCompute页签单击新增数据表,按照如下资源配置分别新增1个用户表、1个物品表和1个行为表,然后单击开始导入

    参数

    说明

    方案默认示例

    MaxCompute项目

    选择已创建的MaxCompute项目。

    project_mc

    MaxCompute

    选择已同步到DataWorks工作空间的数据表。

    • 用户表:rec_sln_demo_user_table_v1

    • 物品表:rec_sln_demo_item_table_v1

    • 行为表:rec_sln_demo_behavior_table_v1

    数据表名称

    自定义填写。

    • 用户表

    • 物品表

    • 行为表

4.创建推荐场景

在配置推荐任务之前需要先创建一个推荐场景。推荐场景的基本概念、流量编码含义参考基本概念

在左侧导航栏选择推荐场景,单击创建场景,按照如下资源配置创建1个推荐场景,然后单击确定

资源配置

参数

说明

方案默认示例

场景名称

自定义填写。

HomePage

场景介绍

关于场景的详细说明。

5.创建并配置算法方案

如果您需要完整配置一个真实场景,建议配置的召回和精排如下。

  • 全局热门召回:日志数据中,全面热门数据的统计排名取Top k。

  • 分组热门召回:按照城市、性别区间等指标来分类召回,这对提高热门物品的准确性有帮助。

  • etrec u2i召回:基于etrec协同过滤算法。

  • swing u2i召回(可选):基于Swing算法。

  • 向量召回(可选):DSSM向量召回。

  • 精排:单目标可以选择MultiTower排序;多目标可选择DBMTL排序。

本文旨在体验配置与部署流程,因此在召回配置环节只配置了全局热门召回及RECommender(eTREC,一种协同过滤的实现)u2i召回策略。在排序配置上,选择了精细化排名以优化体验。具体操作步骤如下:

  1. 在左侧导航栏选择推荐方案定制>创建模块化推荐方案,选择已创建的场景,并单击创建模块化推荐方案,按照如下资源配置创建1个方案,然后单击保存并进入算法方案配置

    未说明的参数保持默认即可,详情请参见数据表配置

    资源配置

    参数

    说明

    方案名称

    自定义填写。

    场景名称

    选择已创建的推荐场景。

    离线数据源

    选择推荐场景关联的MaxCompute项目。

    算法框架

    此处选择PyTorch,可以根据自己偏好选择算法框架

    DataWorks工作空间

    选择推荐场景关联的DataWorks工作空间。

    业务流程名称

    该名称为后续部署推荐方案脚本时,在DataWorks创建的业务流程名称。可自定义填写,例如Flow。

    StorageAPI配置

    国内区域:如北京、上海等可以选择“StorageAPI”,即按量计费的数据传输服务;

    其他区域:如中国香港、新加坡、法兰克福等,需要先购买与使用独享数据传输服务资源组(如没有按量计费,需要购买包月的数据传输服务),然后刷新选择包月的数据传输服务名称。在DataWorksPAI-DLCTorchEasyRec训练任务中增加参数,形式类似:-odps_data_quota_name ot_xxxx_p#ot_yyyy。

    slim_mode

    如果DataWorks选购版本对迁移助手中导入的代码包有大小限制,可使用此功能,并将超出大小限制的代码包手动上传。本方案选择

    OSS Bucket

    选择推荐场景关联的OSS Bucket。

    项目

    选择已创建的FeatureStore项目,其中在线数据源选择FeatureDB。

    用户实体

    选择FeatureStore项目对应的user特征实体user。

    物品实体

    选择FeatureStore项目对应的item特征实体item。

  2. 数据表配置,单击目标数据表右侧的添加,按照如下资源配置分别设置行为日志表用户表物品表,并设置相应的分区、事件、特征、时间戳等字段,然后单击下一步

    未说明的参数保持默认即可,详情请参见数据表配置

    行为日志表资源配置

    在配置行为日志表时,应依据实际数据内容作出调整。以本文为例,行为日志包含诸如请求ID、用户唯一标识符、行为发生的页面、行为时间戳及行为类别等核心信息。若表中包含更丰富的数据维度,推荐将这些信息按用户和物品分类,配置到用户信息或物品信息中,以便于后续的特征工程处理。

    参数

    说明

    方案默认示例

    行为表名称

    选择已注册的行为表。

    rec_sln_demo_behavior_table_v1

    时间分区

    行为表的分区字段。

    ds

    yyyymmdd

    行为信息配置

    请求ID

    日志中标记每次推荐请求的ID,一般是程序生成的UUID。可不填。

    request_id

    行为事件

    指日志中记录行为事件的字段。

    event

    行为事件枚举值

    行为事件中包含的枚举值,如曝光、点击、加购或购买等行为。

    expr,click,praise

    行为的值

    表示行为的深度,如成交价格、观看时长等字段。

    playtime

    行为时间戳

    日志发生的时间,精确到秒的时间戳。

    event_time

    时间戳格式

    和行为时间戳配合使用。

    unixtime

    行为场景

    表示日志发生的场景字段,如首页、搜索页或商品详情页。

    page

    场景枚举值

    指使用了哪些场景的数据,在后续特征工程中可以分场景统计特征。

    home,detail

    用户信息配置

    用户ID

    行为表中用户ID的标识。

    user_id

    用户类别特征

    行为表中存在的用户类别特征,如网络、操作平台或性别等。

    net_type

    物品信息配置

    物品ID

    行为表中物品ID的标识。

    item_id

    用户表资源配置

    参数

    说明

    方案默认示例

    用户表名称

    选择已注册的用户表。

    rec_sln_demo_user_table_v1

    时间分区

    用户表的时间分区字段。

    ds

    yyyymmdd

    用户信息配置

    用户ID

    用户表中的用户ID字段。

    user_id

    注册时间戳

    该用户注册的时间。

    register_time

    时间戳格式

    和注册时间戳配合使用。

    unixtime

    类别特征

    用户表的类别字段,如性别、年龄段或所属城市等。

    gender,city

    数值特征

    用户表的数值字段,如作品数、积分等。

    age,item_cnt,follow_cnt,follower_cnt

    tag特征

    tag特征字段名。

    tags

    物品表资源配置

    参数

    说明

    方案默认示例

    物品表名称

    选择已注册的物品表。

    rec_sln_demo_item_table_v1

    时间分区

    物品表的时间分区字段。

    ds

    yyyymmdd

    物品信息配置

    物品ID

    物品表中的物品ID字段。

    item_id

    作者ID

    商品所属的作者。

    author

    上架时间戳

    物品上架时间戳字段名。

    pub_time

    时间戳格式

    和上架时间戳配合使用。

    unixtime

    类别特征

    物品表的类别字段,如类目。

    category

    数值特征

    物品表的数值字段,如价格、累计销量或点赞量。

    click_count,praise_count

  3. 特征组配置,单击添加,按照如下资源配置完成相应参数配置,设置特征模块名称,版本,分别勾选在数据表配置 中的用户表,物品表,行为日志表。

    资源配置

    参数

    说明

    方案默认示例

    常用统计时间周期

    该配置将用于批量生成特征。为了避免生成特征过多,本方案设置统计时间周期为3、7、15天,分别为统计用户和物品在最近3天、7天和15天内的统计特征。

    如果用户行为数量很少,可尝试设置21天。

    3,7,15

    重点关注行为

    选择已配置的行为事件,建议添加次序为expr(曝光)、click(点击)、praise(点赞)。

    expr,click,praise

    单击确定,会在用户和物品侧衍生出多种统计特征,点击该特征组的特征配置可以查看到对应的验证特征,本方案不对衍生特征进行二次编辑,保持默认即可。您可以根据自身业务需求,对衍生特征进行编辑,详情请参见特征配置。点击该特征组的上线,任务运行日期选择数据最新分区日期,调整任务最大并行数,最大时10,其余配置默认,点击确定。该动作会产出节点,并部署到dataworks,同时根据日期补跑数据,当改模块状态成为已上线才可进行后续配置。点击该模块的上线详情可以查看该模块相关的详细信息,其中补数任务列表可以查看到每个任务运行状态,对于失败的任务,点击查看任务节点可以跳转至dataworks查看任务详细报错,对于失败任务修正后点击补数任务列表该节点重跑,通过后点击续跑。

  4. Label表配置,此模块根据行为表构建样本目标,点击添加,选择当前模块为label模块,输入Label 模块名称,特征模块选择上游配置的特征模块。单击精排目标设置(labels)后的新增,新增如下两个label:

    • 目标1image

    • 目标2(注意ln中的lL的小写)image

    • 确定后仿照特征模块进行上线,等待状态成为已上线后继续下游配置

  5. 样本配置,此模块功能是样本目标表关联特征,并在feature-store产出模型特征。点击添加,选择当前模块为样本模块,并命名模型特征,特征模块选择上游产生的特征模块,Label模块选择上游产出的Label模块,仿照上面进行上线,等待状态成为已上线后继续下游配置。

  6. 特征生成配置,此模块可以将样本表所有特征进一步衍生,目前不支持自定义配置。点击添加,选择当前模块为特征生成,特征生成类型选择排序,模型特征模块选择上游样本配置产生的模型特征。等待状态成为已上线后继续下游配置。

  7. 排序配置,点击精排的添加,特征模块输出选择上游产出的特征生成,其余选项默认,点击确定,仿照上游进行上线。该模块状态变成已上线,在pai-eas中能看到模型服务。

  8. 召回配置,单击目标分类右侧的添加,完成相应参数配置,单击确认,然后进行上线。以下内容包含了多种召回配置方法,为了带您快速体验部署流程,您可以只配置全局热门召回etrec u2i召回。其他向量召回、协同度量召回等仅供参考。

资源配置

全局热门召回

全局热门召回是根据点击事件统计得到热门的物品排行榜(top_n表示排行榜个数)。如果要修改热门的得分公式或者访问事件,您可在生成相关代码后,将其部署到DataWorks平台再进行修改。

打分公式为click_uv*click_uv/(expr+adj_factor)*exp(-item_publish_days/fresh_decay_denom),其中

  • click_uv:相同点击率(CTR)时,点击量越多,则越热门。

  • click_uv/(expr+adj_factor):平滑后的点击率(CTR),其中click_uv表示点击用户数量,expr表示曝光数量。增加调节因子adj_factor,一方面是为了防止分母为0,另一方面是当曝光数量很少的时候,CTR会接近于1,加上adj_factor之后CTR会远离1,从而使得CTR更加趋近于真实的CTR。

  • exp(-item_publish_days/fresh_decay_denom):惩罚发布早的商品。其中item_publish_days表示从发布时间到当前的天数。

image

etrec u2i召回

etrec是基于item的协同过滤算法,详情请参见协同过滤etrec

image

参数

描述

训练天数

表示使用多少天的行为日志来训练。默认为30天,您可以根据日志量来增减。

召回数目

表示最终离线产出的用户到物品的数量。

U2ITrigger

表示用户有交互行为的物品。例如用户点击、收藏或购买的物品,一般不包含曝光物品。

行为时间窗口

表示收集多少天内的行为数据,默认为15,表示最近15天。

行为时间衰减系数

一般介于0-1之间,值越大表示过去的行为距离今天衰减越厉害,在构造trigger_item中其占比权重越小。

Trigger选取数目

指每个用户取多少个物品ID去与etrec产出的i2i数据做笛卡尔积。建议取值在1050之间。如果Trigger的数目太大会造成召回的候选物品数量太多。

u2i行为权重

其中注意曝光事件要么不设置,要么设置为权重0。建议不设置曝光事件,即跳过用户曝光数据。

I2I模型设置

etrec的参数设置,详情请参见协同过滤etrec。其中相关Item选取数目建议不要太多。image

分组热门召回

即可设置按照城市、性别等属性来统计排行榜,能提供初步个性化的召回。如下示例中,使用性别和数值的分桶号组合作为分组。

image

image

swing u2i召回

Swing是一种item相关性计算方法,基于User-Item-User原理衡量Item的相似性。

image

image

image

向量召回

提供一种向量召回方式DSSM ,具体介绍参考:

  • 召回目标名称:一般指是否点击,设置为is_click。

  • 召回目标选取: 设置为max(if(event='click', 1, 0))

    该部分在执行的时候可以参考如下代码:

    select max(if(event='click',1,0)) is_click ,...
    from ${behavior_table}
    where between dt=${bizdate_start} and dt=${bizdate_end}
    group by req_id,user_id,item

    其中:

    • ${behavior_table}:表示行为表。

    • ${bizdate_start}:是行为时间窗的开始日期。

    • event:是${behavior_table}表里面事件字段,需根据具体字段选择。

    • is_click:即目标名称。

    其中维度计算的公式如下:

    EMB_SQRT4_STEP8: (8 + Pow(count, 0.25)) / 8) * 8
    EMB_SQRT4_STEP4: (4 + Pow(count, 0.25)) / 4) * 4
    EMB_LN_STEP8:    (8 + Log(count + 1)) / 8) * 8
    EMB_LN_STEP4:    (4 + Log(count + 1)) / 4) * 4

    其中count表示特征枚举值个数。当特征取值个数较多时,使用Log函数。

image

image