本文介绍序列特征和实时特征的基本概念、应用场景和注册使用操作等。
序列特征
基本概念
序列特征是按时间顺序排列的用户行为或事件序列(如点击、购买、浏览行为序列,访问间隔、停留时长序列等),其时序特性不仅体现行为的先后顺序,还能反映用户兴趣的动态演变,从而捕捉用户行为模式及偏好变化。
应用场景
序列特征推荐通过分析用户历史行为序列预测下一步行为,与以静态方式对行为偏好建模的传统推荐任务不同,序列推荐能识别兴趣随时间演变的阶段性特征(例如用户对运动用品与书籍需求的周期性切换),并通过时间顺序的“用户-物品”隐式反馈推断当前偏好,从而提升推荐精准度与用户体验,增强下一阶段的交互效果。
以电商推荐场景为例,用户的序列特征包含了和用户发生过交互的各种商品。箭头下方包含了用户的行为序列,上方是对发生交互关系的各种商品赋予的不同的权重,最后根据所有特征共同得到最后用户的推荐序列。
以上示例内容来源:Deep Interest Network for Click-Through Rate Prediction(Guorui Zhou, Chengru Song, Xiaoqiang Zhu Ying Fan, Han Zhu, Xiao Ma, Yanghui Yan, Junqi Jin, Han Li, Kun Gai)
序列特征视图
在特征平台中,为支持序列特征的离线训练与在线实时获取,特别设计了序列特征视图(Sequence FeatureView)。通过注册该视图,平台可自动完成离线样本表导出及主键与请求ID的关联工作,同时用户可通过FeatureStore SDK直接调用实时序列特征。序列特征视图离线侧支持序列特征表的写入,在线侧则支持实时行为数据的查询与读取。
一般在推荐场景中,离线序列特征表(F1)初期由模拟数据生成,后续可通过线上日志直接替换。在线实时特征查询时,系统会合并两张行为表数据:一张是T-1天的历史行为表(B1),另一张是T天当天实时更新的行为表(B2)。其中,B1由特征平台自动从离线T-1天行为表(A1)同步并完成去重等预处理,而B2需用户通过API或Flink等工具实时写入。
注册序列特征视图时,用户仅需提供离线序列特征表(F1)和离线T-1天行为表(A1)即可,在线行为表 A1 和同步去重过程会由特征平台完成,同时还会生成在线行为表(A2)的schema和表名,用户只需要依照表名写入即可。
序列特征生产
序列特征的生产分为两部分,T-1天的行为序列生产和T天的行为序列生产,这两部分的序列表都构造完成后,再合并为一个实时行为序列表。实时行为序列表的schema通常如下所示:
CREATE TABLE IF NOT EXISTS home_feed_userid_all_seq_feat ( userid bigint ,timestamp bigint ,req_id string ,expo_100_seq__itemid string ,expo_100_seq__ts string ,home_click_100_seq__itemid string ,home_click_100_seq__price string ,home_click_100_seq__ts string ) PARTITIONED BY ( ds string ) LIFECYCLE 30 ;
其中,user_id指主键;timestamp指时间戳;req_id指请求id。表里共包含以下两个序列特征:
曝光序列(expo_100_seq):包含itemid字段(expo_100_seq__itemid)和时间间隔字段(expo_100_seq__ts)。
home页点击序列(home_click_100_seq):包含itemid字段(home_click_100_seq__itemid),价格字段(home_click_100_seq__price),时间间隔字段(home_click_100_seq__ts)。
生成序列特征表后,可进行特征表注册、训练样本导出、模型训练及上线部署等工作。
序列特征视图注册
序列特征视图注册包括以下两种方式。
控制台注册
登录PAI控制台,在左侧导航栏单击数据准备>特征平台(FeatureStore),选择工作空间后,单击进入FeatureStore。
单击已创建的项目名称,进入项目详情页面。
在特征视图页签,单击新建特征视图,配置以下关键参数,其它参数保持默认或按需配置。
参数
说明
类型
选择行为序列。
特征实体
选择user。
数据源
选择已绑定的数据源。具体操作,请参见新建数据源。
行为表
选择已创建的行为表。具体操作,请参见准备数据。
行为特征字段
勾选userid字段右侧的用户ID。
物品ID(item_id)
选择itemid。
事件(event)
选择event。
时间戳(timestamp)
选择event_unix_time。
去重方式
选择用户ID(user_id)+物品ID(item_id)+事件(event)。
离线序列特征表
选择已创建的实时行为序列表。
主键字段
选择userid。
事件时间字段
选择timestamp。
分区字段
选择ds。
序列特征读取配置
按照以下内容配置:
离线序列特征字段:离线序列表中序列特征字段名。
事件名称:行为字段名。
序列长度:在线查询的序列长度,一般与离线一致,大于该长度的序列会被截断。
在线序列特征名称:特征平台在线Go SDK查出该user对应的行为序列item_ids后,会以该名称命名,后续处理可以根据该名称取出序列后进行后处理。
在线行为表字段:选填。如果该序列特征用到了行为表字段,需要在线从行为表中查出对应字段组成序列,可以在该处填写。例如该序列特征子特征是行为表的 price 字段,则该处就可以填写行为表中的 price 字段,在线查出时完整的序列特征名称为:${在线序列特征名称}__price。
特征生命周期
设置为30天。
单击提交。
FeatureStore Python SDK注册
具体操作,请参见特征平台在推荐系统中的应用。
离线行为同步操作
以FeatureStore Python SDK注册方式为例,注册实时序列特征视图后,将离线数据源中的rec_sln_demo_behavior_table_preprocess_v3表中20231023分区的数据同步到在线数据源,同步的时候会自动检查是否有前N天分区的数据,没有的话会自动补充,N是通过days_to_load参数指定,默认取30。
seq_task = seq_feature_view.publish_table({'ds':'20231023'}, days_to_load=30) seq_task.wait()
在DataWorks中脚本可以按如下内容填写。该脚本是为了复制到DataWorks中作为例行脚本,这里并不能直接运行。和User表类似,在DataWorks中新建py3脚本,将如下代码复制到脚本中,然后在调度配置中设置输入参数,参数名为dt,参数值为$[yyyymmdd-1]。调度资源组设置为私有资源组,依赖设置为对应的行为表,提交后可以补最新一天的数据。
from feature_store_py.fs_client import FeatureStoreClient import datetime from feature_store_py.fs_datasource import MaxComputeDataSource import sys cur_day = args['dt'] print('cur_day = ', cur_day) access_key_id = o.account.access_id access_key_secret = o.account.secret_access_key fs = FeatureStoreClient(access_key_id=access_key_id, access_key_secret=access_key_secret, region='cn-beijing') cur_project_name = 'fs_demo' project = fs.get_project(cur_project_name) feature_view_name = 'home_feed_userid_all_seq_feat' batch_feature_view = project.get_feature_view(feature_view_name) task = batch_feature_view.publish_table(partitions={'ds':cur_day},days_to_load=30) task.wait() task.print_summary()
实时行为特征写入
在线除了写入离线行为(T-1天),还需要当天(T天)的行为实时写入。从DataHub获取数据流,进行与处理操作,然后写入到FeatureStore中,使用Flink Connector自定义连接器。
CREATE TEMPORARY TABLE behavior_table_test ( userid bigint ,itemid bigint ,req_id string ,event string ,event_unix_time bigint ) WITH ( 'connector' = 'datahub' ,'subId' = '' ,'endPoint' = 'http://dh-cn-beijing.aliyuncs.com' ,'project' = '' ,'topic' = '' ,'accessId' = '{access_id}' ,'accessKey' = '{access_key}' ) ; CREATE TEMPORARY TABLE rec_sln_seq_feature_v1_seq ( userid bigint ,itemid bigint ,event string ,event_unix_time bigint ) WITH ( 'connector' = 'featurestore' ,'region_id' = 'cn-beijing' ,'project' = 'test' ,'feature_view' = 'home_feed_userid_all_seq_feat' ,'username' = 'featuredb_username' ,'password' = 'featuredb_password' ,'aliyun_access_id' = '{access_id}' ,'aliyun_access_key' = '{access_key}' ) ; INSERT INTO rec_sln_seq_feature_v1_seq SELECT userid ,itemid ,event ,event_unix_time FROM behavior_table_test WHERE event IN ('comment','discover_click','follow','popular_click','praise') ;
数据查询
数据同步完成后,可以点击特征视图页面中对应特征视图的数据查询,输入对应的主键值,查看返回的特征。
创建模型、导出样本、上线及获取特征
具体操作,请参见在推荐系统中应用FeatureStore管理特征和FeatureStore最佳实践。
实时特征
基本概念
实时特征一般指实时变化的特征,其值可能以毫秒级精度变化,要求系统在数据生成后立即捕获并用于实时决策,实时特征通过数据流系统(如Flink)在数据流分析中实时计算生成,要求整个链路具有低延迟与高性能特点。实时特征会动态更新,系统会不断重新计算这些特征。
应用场景
实时特征常见的应用场景如下:
在线广告:根据用户当前的浏览行为实时调整广告内容。
欺诈检测:在金融交易中实时检测可疑行为,并触发警报或阻止交易。
个性化推荐:根据用户当前的活动和历史数据实时更新推荐列表。
IoT系统:在物联网系统中实时监测和控制设备,生成和使用实时特征以响应环境变化。
以实时特征在推荐广告等机器学习系统中的应用为例:
特征写入过程
在特征平台创建实时特征视图后,系统将自动在在线数据引擎中生成一张同结构的表用于实时特征的写入和读取,当数据源为FeatureDB/TableStore/Hologres时,用户可通过DataHub将数据传输至Flink,进行实时特征处理和计算,最后将结果写入对应在线数据源的表中(表名可在视图详情页查看)。
特征读取过程:
EasyRec Processor内置FeatureStore Cpp SDK仅需指定模型特征名即可自动识别并读取实时特征,Go/Java SDK则通过配置参数进行读取。
离线样本导出
FeatureStore贵自动将离线视图对应的离线数据引擎中的表连接后导出,对于实时特征视图,如果使用FeatureDB,会自动将在线数据写入到离线数据引擎对应的离线表;如果不使用FeatureDB,需自行构建任务将数据写入离线数据引擎对应的离线表,或通过PAI-Rec推荐算法定制生成模拟实时数据作为对应的实时特征视图离线表数据。
实时特征视图
特征平台中的实时特征视图用于处理实时变化的特征,线上可以用消息队列DataHub和Flink实时将特征写入,然后用EasyRec Processor实时轮询读取特征或FeatureStore SDK实时读取特征,从而能够在下游实时感知到特征的毫秒级变化。
实时特征视图注册
一般在线特征表在创建完特征视图后会自动在在线存储引擎中新建,离线特征表在MaxCompute中也会新建。
实时特征导出
可选多个实时特征视图、离线特征视图来创建模型特征,创建好模型特征后可导出。特征平台支持进行自动导出,实时特征视图中对应离线数据表的来源根据使用的场景有不同的差异,具体如下:
数据源
推荐引擎
导出方案
FeatureDB
都支持
直接使用特征平台导出。
Hologres/TableStore
PAI-REC
将推荐算法定制的模拟数据导入对应的实时特征视图对应的离线表后,使用特征平台导出。
其他
需手动导出实时特征视图对应的离线表数据,使用特征平台导出。
同步操作
支持以下两种方式:
集成操作
具体操作,请参见在推荐系统中应用FeatureStore管理特征。