如何从历史数据中找出规律,去预测用户未来的购买需求,让最合适的商品遇见最需要的人,是大数据应用在精准营销中的关键问题,也是所有电商平台在做智能化升级时所需要的核心技术。
京东作为中国最大的自营式电商,沉淀了数亿的忠实用户,积累了海量的真实数据。本案例以京东商城真实的用户、商品和行为数据(脱敏后)为基础,通过数据挖掘的技术和机器学习的算法,构建用户购买商品的预测模型,输出高潜用户和目标商品的匹配结果,为精准营销提供高质量的目标群体,挖掘数据背后潜在的意义,为电商用户提供更简单、快捷、省心的购物体验。
本案例以京东高潜用户购买意向预测问题为例,使用 OpenMLDB 进行数据挖掘,使用 OneFlow 中的 DeepFM 模型进行高性能训练推理,提供精准的商品推荐,从而打造一个完整的机器学习应用。
本案例基于 OpenMLDB 集群版进行教程演示。注意,本文档使用的是预编译好的 docker 镜像。如果希望在自己编译和搭建的 OpenMLDB 环境下进行测试,推荐针对 OpenMLDB 优化的 Spark 发行版。(参考章节:
https://openmldb.ai/docs/zh/main/deploy/compile.html)
1
环境准备和预备知识
OneFlow 工具包安装
OneFlow 工具依赖 GPU 的强大算力,所以请确保部署机器具备 Nvidia GPU,并且保证驱动版本 >=460.X.X 驱动版本需支持 CUDA 11.0。
使用以下指令安装 OneFlow:
- conda activate oneflow
- python3 -m pip install --pre oneflow -f https://staging.oneflow.info/branch/support_oneembedding_serving/cu102
还需要安装以下 Python 工具包:
pip install psutil petastorm pandas sklearn
拉取和启动 OpenMLDB Docker 镜像
注意,请确保 Docker Engine 版本号 >= 18.03
拉取 OpenMLDB docker 镜像,并且运行相应容器
映射demo文件夹至/root/project
,这里我们使用的路径为demodir=/home/gtest/demo
- export demodir=/home/gtest/demo
- docker run -dit --name=demo --network=host -v $demodir:/root/project 4pdosc/openmldb:0.5.2 bash
- docker exec -it demo bash
上述镜像预装了OpenMLDB的工具等,我们需要进一步安装Oneflow推理所需依赖。
因为我们将在OpenMLDB的服务中嵌入OneFlow模型推理的预处理及调用,需要安装以下的依赖。
pip install tritonclient[all] xxhash geventhttpclient
注意,本教程以下的 OpenMLDB 部分的演示命令默认均在该已经启动的 docker 容器内运行。OneFlow 命令默认在 1.1 安装的 OneFlow 环境下运行。
初始化环境
./init.sh
我们在镜像内提供了init.sh脚本帮助用户快速初始化环境,包括:
配置 zookeeper
启动集群版 OpenMLDB
启动 OpenMLDB CLI 客户端
/work/openmldb/bin/openmldb --zk_cluster=127.0.0.1:2181 --zk_root_path=/openmldb --role=sql_client
注意,本教程大部分命令在 OpenMLDB CLI 下执行,为了跟普通 shell 环境做区分,在 OpenMLDB CLI 下执行的命令均使用特殊的提示符 `>` 。
预备知识:集群版的非阻塞任务
集群版的部分命令是非阻塞任务,包括在线模式的 LOAD DATA
,以及离线模式的 LOAD DATA
,SELECT
,SELECT INTO
命令。提交任务以后可以使用相关的命令如 SHOW JOBS
, SHOW JOB
来查看任务进度,详情参见离线任务管理文档。
2
机器学习训练流程
使用OpenMLDB+OneFlow进行机器学习训练可总结为以下大致步骤。
接下来会介绍每一个步骤的具体操作细节。
使用OpenMLDB进行离线特征抽取
创建数据库和数据表
以下命令均在 OpenMLDB CLI 环境下执行。
- > CREATE DATABASE JD_db;
- > USE JD_db;
- > CREATE TABLE action(reqId string, eventTime timestamp, ingestionTime timestamp, actionValue int);
- > CREATE TABLE flattenRequest(reqId string, eventTime timestamp, main_id string, pair_id string, user_id string, sku_id string, time bigint, split_id int, time1 string);
- > CREATE TABLE bo_user(ingestionTime timestamp, user_id string, age string, sex string, user_lv_cd string, user_reg_tm bigint);
- > CREATE TABLE bo_action(ingestionTime timestamp, pair_id string, time bigint, model_id string, type string, cate string, br string);
- > CREATE TABLE bo_product(ingestionTime timestamp, sku_id string, a1 string, a2 string, a3 string, cate string, br string);
- > CREATE TABLE bo_comment(ingestionTime timestamp, dt bigint, sku_id string, comment_num int, has_bad_comment string, bad_comment_rate float);
也可使用 sql 脚本(/root/project/create_tables.sql)运行:
/work/openmldb/bin/openmldb --zk_cluster=127.0.0.1:2181 --zk_root_path=/openmldb --role=sql_client < /root/project/create_tables.sql
离线数据准备
首先,切换到离线执行模式。接着,导入数据作为离线数据,用于离线特征计算。
以下命令均在 OpenMLDB CLI 下执行。
> USE JD_db;> SET @@execute_mode='offline';> LOAD DATA INFILE '/root/project/data/JD_data/action/*.parquet' INTO TABLE action options(format='parquet', header=true, mode='append');> LOAD DATA INFILE '/root/project/data/JD_data/flattenRequest_clean/*.parquet' INTO TABLE flattenRequest options(format='parquet', header=true, mode='append');> LOAD DATA INFILE '/root/project/data/JD_data/bo_user/*.parquet' INTO TABLE bo_user options(format='parquet', header=true, mode='append');> LOAD DATA INFILE '/root/project/data/JD_data/bo_action/*.parquet' INTO TABLE bo_action options(format='parquet', header=true, mode='append');> LOAD DATA INFILE '/root/project/data/JD_data/bo_product/*.parquet' INTO TABLE bo_product options(format='parquet', header=true, mode='append');> LOAD DATA INFILE '/root/project/data/JD_data/bo_comment/*.parquet' INTO TABLE bo_comment options(format='parquet', header=true, mode='append');
或使用脚本执行:
/work/openmldb/bin/openmldb --zk_cluster=127.0.0.1:2181 --zk_root_path=/openmldb --role=sql_client < /root/project/load_data.sql
并通过以下命令快速查询 jobs 状态:
echo "show jobs;" | /work/openmldb/bin/openmldb --zk_cluster=127.0.0.1:2181 --zk_root_path=/openmldb --role=sql_client
注意,集群版 `LOAD DATA` 为非阻塞任务,可以使用命令 `SHOW JOBS` 查看任务运行状态,请等待任务运行成功( `state` 转至 `FINISHED` 状态),再进行下一步操作 。
特征设计