摘要:
合集:AI案例-ML-零售业
赛题:HW-DIGIX2021-赛题1-基于多目标多视图的用户留存周期预测
主办方:华为终端云服务 + 华为南京研究所 + 江苏省人工智能学会(JSAI)
主页:https://www.saikr.com/DIGIX/2021
AI问题:用户活跃度预测等时间序列预测任务
数据集:连续60天的音乐APP用户行为数据和行为对应匹配的用户、歌曲、歌手数据。
数据集价值:预测未来30天内用户的留存情况
解决方案:特征工程建设,为对应1天、2天、3天、7天、14天、30天的二元分类预测训练独立的LightGBM模型。
一、赛题描述
活跃留存周期预测通常使用单一视图做预测。但是在音乐领域,需结合用户关注的音乐话题信息进行表征学习、结合歌曲信息进行音频、歌词、歌曲名、评论文本的多模态表征、结合歌手、用户、歌曲构建知识图谱,基于用户在APP侧信息构造行为链路向量化,辅助多日留存的多目标优化。在业界探索下一代机器学习模型与多模态向量化中有非常深远的价值。
1、目标
本题目基于脱敏和采样后的数据信息,保证数据安全。利用连续30天的用户行为日志,用户信息,歌曲信息,歌手信息,歌曲音频信息,预测未来30天内用户的留存情况,按未来一日、两日、三日、七日、十四日、三十日分段。
2、评价指标
Area Under Curve (AUC)
3、提交文件
提交的结果文件:submission.csv:模型预测的结果文件。
二、数据集内容
1、基本信息
采样+脱敏后的数据集为:抽取的时间范围是连续60 天的用户行为数据和行为对应匹配的用户、歌曲、歌手数据。数据集包含:共60天的数据文件。分割数据集,第1-30天为训练数据,另外第31-60天为测试数据。
2、数据结构
a、设备活跃表
文件:device_active.csv
| 字段 | 类型| 说明|
|device_id|Int|设备唯一标识|
|days|List|30天内设备活跃的相对日期列表|
b、用户特征
文件:user_info.csv
| 字段 | 类型| 说明|
|device_id|Int|设备唯一标识|
|gender|Int|性别|
|age|Int|年龄区间段|
|device|Int|设备类型|
|city|Int|常驻城市|
|is_vip|Int|是否为VIP用户|
|device_id|Int|设备唯一标识|
|topics|List|关注的话题圈主题,为明文形式|
c、用户行为/时序数据
文件:user_behavior.csv
| 字段 | 类型| 说明|
|device_id | Int | 设备唯一标识 |
|day|Int| 相对日期 |
|pages|List|行为发生的一级页面,数字分别对应推荐、搜索、排行榜等。|
|music_ids|List|交互的音乐唯一标识|
|actions|List|核心用户行为序列,如播放,下载,分享,收藏,进入会员页,会员购买,搜索,搜索结果点击。存在device_active设备活跃表有记录,但user_behavior用户行为表没有记录的情况,这表明该用户有其他非核心行为,未被统计进来。|
|channel|Int|用户当日首次打开App的来源渠道|
d、歌曲信息
文件:music_info.csv
| 字段 | 类型| 说明|
|music_id|Int|歌曲唯一标识|
|title|String|歌曲名(明文)|
|artist_id|Int|音乐创作者唯一标识|
|album|String|专辑名称(明文)|
|is_paid|Int|是否为付费歌曲|
|comment|String|歌曲点赞最多的热评。数据为提取时刻的动态数据。|
|comment_cnt|Int|歌曲评论数。数据为提取时刻的动态数据|
e、 歌手信息
文件:artist_info.csv
| 字段 | 类型| 说明|
|artist_id|Int|音乐创作者唯一标识|
|artist|String|音乐创作者,明文形式,。若有多个作者,用/分割。例如:杨宗纬/张碧晨。|
|style|List|音乐风格列表,明文形式。音乐风格数据不全,选手可自行增强数据。|
3、数据集版权协议
发布方:华为终端云服务
GPL2
三、基线解决方案
1、工作原理
这是是一个典型的用户行为特征工程,适用于用户活跃度预测等时间序列预测任务。
a. 问题定义
- 目标:预测用户在未来的留存周期(如留存天数、留存概率等)。
- 多目标:可能同时预测多个留存相关指标(如 7 日留存率、30 日留存率、用户生命周期价值等)。
- 多视图:数据来源多样化,例如:
- 行为视图:用户点击、页面停留、功能使用等行为序列。
- 交易视图:付费记录、消费金额、优惠券使用等。
- 社交视图:好友关系、群组互动等。
- 上下文视图:时间、地点、设备信息等。
b. 数据预处理
(1) 多视图特征融合
- 特征拼接:将不同视图的特征横向合并(如用户行为统计 + 交易记录 + 设备信息)。
- 跨视图交互:通过特征工程生成组合特征(如“最近一次消费金额” × “活跃天数”)。
- 时间窗口统计:对行为和交易数据按时间窗口聚合(如过去 7 天的日均使用时长)。
(2) 缺失值处理
- 对数值型特征使用均值/中位数填充,类别型特征使用众数填充。
- 使用 LightGBM 内置的缺失值处理(
use_missing=True
)。
(3) 类别特征编码
- 对类别型特征使用 Label Encoding 或 Target Encoding(需防泄漏)。
- LightGBM 原生支持类别特征(
categorical_feature
参数),可自动处理。
c. 模型构建
LightGBM 支持多目标回归(Multi-Output Regression),可通过以下方式实现:
- 独立模型:为每个目标训练单独的 LightGBM 模型。
- 联合训练:通过自定义损失函数,将多个目标的损失合并优化。
2、安装开发包
requirements.txt
python>=3.6.8
graphviz>=0.16
joblib>=1.0.1
lightgbm>=3.2.1
networkx>=2.4
numpy>=1.19.5
pandas>=1.1.5
scikit-learn>=0.24.1
scipy>=1.1.0
torch>=1.1.0
torchsummary>=1.1
torchvision>=0.3.0
tornado>=4.5.3
tqdm>=4.60.0
3、代码结构
>+--- dataset/2021_1_data
>+--- feature_builder
>| +--- 0_generate_features.py
>+--- predictor
>| +--- 0_retrain_and_predict.py
>| +--- Utils.py
>+--- preprocess
>| +--- 0_numbered_items.py
>| +--- 1_format_active_logs.py
>| +--- 2_format_user_info.py
>| +--- 3_format_music_info.py
>| +--- 4_format_user_behavior.py
>| +--- utils.py
>+--- README.md
>+--- requirements.txt
>+--- trainer
>| +--- 0_reformat_features.py
>| +--- 1_impute_and_convert_to_lgb.py
>| +--- 2_run_lightgbm.py
>| +--- Features.py
>| +--- Utils.py
4、源码开源协议
四、工作流程
1、预处理
运行方法:
python -u preprocess/0_numbered_items.py --user-info-file-name "dataset/2021_1_data/2_user_info.csv" --song-info-file-name "dataset/2021_1_data/3_music_info.csv" --user-numbered-file-name "dataset/2021_1_data/device_to_index.csv" --song-numbered-file-name "dataset/2021_1_data/music_to_index.csv"
python -u preprocess/1_format_active_logs.py --active-log-file-name "dataset/2021_1_data/1_device_active.csv" --train-log-file-name "dataset/2021_1_data/active_logs_to_train.csv" --predict-log-file-name "dataset/2021_1_data/active_logs_to_predict.csv" --user-index-file-name "dataset/2021_1_data/device_to_index.csv"
python -u preprocess/2_format_user_info.py --device-info-file-name "dataset/2021_1_data/2_user_info.csv" --user-index-file-name "dataset/2021_1_data/device_to_index.csv" --user-side-info-file-name "dataset/2021_1_data/user_with_side_information.csv" --phone-index-file-name "dataset/2021_1_data/phone_id_to_index.csv" --city-index-file-name "dataset/2021_1_data/city_id_to_index.csv"
python -u preprocess/3_format_music_info.py --music-info-file-name "dataset/2021_1_data/3_music_info.csv" --artist-info-file-name "dataset/2021_1_data/5_artist_info.csv" --song-index-file-name "dataset/2021_1_data/music_to_index.csv" --song-info-file-name "dataset/2021_1_data/song_with_side_information.csv" --style-index-file-name "dataset/2021_1_data/style_name_to_index.csv"
python -u preprocess/4_format_user_behavior.py --behaviors-file-name "dataset/2021_1_data/4_user_behavior.csv" --user-index-file-name "dataset/2021_1_data/device_to_index.csv" --song-index-file-name "dataset/2021_1_data/music_to_index.csv" --behavior-feature-file-name "dataset/2021_1_data/user_behaviors_with_static_info.csv"
2、生成特征数据
源码:feature_builder/0_generate_features.py
这个Python脚本是一个特征生成工具,用于从用户行为数据中提取特征并生成训练和预测数据集。
a、主要功能
- 从多个输入文件中加载用户静态特征、歌曲静态特征、用户行为日志和活跃日志
- 合并这些数据源生成综合特征
- 输出训练集(带标签)和预测集(不带标签)
- 保存类别编码器和缺失行为日志
b、核心组件
b.1. 数据加载与处理
load_features_from_file()
: 通用函数,用于从文件中逐行加载数据并应用处理函数get_device_static_features()
: 加载用户静态特征(性别、年龄、VIP状态等)get_usage_info_with_styles()
: 合并用户行为日志和歌曲风格信息get_active_sequence()
: 加载用户活跃序列数据
b.2. 特征工程
update_coder()
: 维护类别特征的编码器(字符串到数字的映射)update_coder_via_dist()
: 基于分布更新编码器get_top_list()
: 从分布中提取top-k最频繁的类别get_interval_features()
: 计算不同时间窗口内的聚合特征generate_features()
: 生成最终的特征向量
b.3. 输出处理
save_label_coders()
: 保存类别编码器到文件generate_total_features()
: 协调整个特征生成流程
c、工作流程
- 加载静态特征:
- 从
user_with_side_information.csv
加载用户静态特征 - 从
song_with_side_information.csv
加载歌曲风格信息
- 从
- 处理行为日志:
- 从
user_behaviors_with_static_info.csv
加载用户行为日志 - 将歌曲ID映射到风格信息
- 为类别特征(频道、动作、页面、风格)创建编码器
- 从
- 处理活跃日志: 从
active_logs_to_train.csv
和active_logs_to_predict.csv
加载训练和预测的活跃序列 - 生成特征:
- 对于每个用户,组合静态特征和行为特征
- 计算不同时间窗口(30天、14天、7天、3天、2天)的聚合特征
- 生成最终的特征向量,包括:
- 类别特征(性别、年龄等静态特征+top行为)
- 分布特征(动作、页面、风格的分布)
- 数值特征(交互次数、歌曲数量等)
- 输出结果:
- 训练集特征和标签(
train_features_and_labels.csv
) - 预测集特征(
predict_features.csv
) - 类别编码器(多个
*_to_index.csv
文件) - 缺失行为日志(
missing_behaviors.csv
)
- 训练集特征和标签(
d、特征详细说明
生成的最终特征包括:
- 类别特征:
- 用户静态属性(性别、年龄、VIP状态等)
- 每天的行为特征(是否活跃、首次频道、top动作、top页面、top风格)
- 分布特征:
- 不同时间窗口内动作、页面、风格的分布(表示为”值:计数#值:计数”的字符串)
- 数值特征:
- 每天的交互次数
- 不同时间窗口内的总交互次数、歌曲数量、独特歌曲数量
e、运行方法
python -u feature_builder/0_generate_features.py --user-static-features "dataset/2021_1_data/user_with_side_information.csv" --song-static-features "dataset/2021_1_data/song_with_side_information.csv" --user-behaviors-features "dataset/2021_1_data/user_behaviors_with_static_info.csv" --training-active-logs "dataset/2021_1_data/active_logs_to_train.csv" --training-dataset "dataset/2021_1_data/total_features_to_train.csv" --predicting-active-logs "dataset/2021_1_data/active_logs_to_predict.csv" --predicting-dataset "dataset/2021_1_data/total_features_to_predict.csv" --temp-dir "dataset/2021_1_data" --bad-case "dataset/2021_1_data/missing_behaviors.csv"
3、抽取有效的特征数据
源码:trainer/0_extract_valid_features.py
这个Python脚本是一个特征处理工具,用于从原始特征数据集中提取有效的训练特征和标签。是一个典型的数据预处理工具,将原始特征转换为适合机器学习模型输入的格式,同时保持特征的可解释性。
a、主要功能
- 从包含原始特征和标签的CSV文件中读取数据
- 将原始特征转换为有效的机器学习特征格式
- 分离特征和标签,分别保存到不同的文件中
- 生成详细的特征名称列表
b、核心组件
b.1. 特征类别定义
category_to_num
字典:定义了各类别特征的取值范围。例如:性别(gender)有3种可能值,年龄(age)有6种可能值等
b.2. 特征名称生成
generate_titles()
函数:生成特征和标签的列名
- 标签名称:
label_1d
,label_2d
, …,label_30d
- 特征名称分为几类:
- 用户静态特征(性别、年龄等)
- 每日行为特征(频道、动作、页面、风格等)
- 时间窗口聚合特征(不同时间段的分布特征)
- 数值特征(交互次数等)
b.3. 特征处理
- 使用
CategoryFeature
和DistributionFeatures
类(从Features
模块导入)处理特征 - 数值特征进行归一化处理(除以30.0)
c、工作流程
- 初始化:
- 解析命令行参数,设置输入输出文件路径
- 生成特征和标签的列名
- 文件处理:
- 打开输入文件(
total_features_to_train.csv
)和两个输出文件(train_features.csv
和train_labels.csv
) - 写入特征和标签的标题行
- 打开输入文件(
- 逐行处理:
- 读取原始特征文件的每一行
- 分割行内容为不同部分:
- 设备ID
- 类别特征
- 分布特征
- 数值特征
- 真实标签
- 使用
CategoryFeature
和DistributionFeatures
处理特征 - 对数值特征进行归一化
- 将处理后的特征和标签分别写入对应的输出文件
d、特征详细说明
生成的最终特征包括:
- 用户静态特征:
gender_id
: 性别IDage_id
: 年龄IDcity_id
: 城市IDphone_id
: 手机型号IDvip_flag
: VIP标志
- 每日行为特征 (每天一个特征,共30天):
channel_id_X
: 第X天的频道IDtop1_action_id_X
: 第X天的top1动作IDtop1_page_id_X
: 第X天的top1页面IDtop1_style_id_X
: 第X天的top1风格IDinteraction_flag_X
: 第X天是否有交互
- 时间窗口聚合分布特征:
- 针对动作、页面、风格三类特征
- 计算5个不同时间窗口(30,14,7,3,2天)的分布
- 格式如:
last_actions_30_cate_X_dist_Y
(30天内动作X的分布Y)
- 数值特征:
- 每天的交互次数(
num_interactions_X
) - 不同时间窗口内的聚合数值:
last_X_interaction_cnt
: X天内的总交互次数last_X_song_cnt
: X天内的歌曲总数last_X_distinct_cnt
: X天内的独特歌曲数
- 每天的交互次数(
e、运行方法
python -u trainer/0_extract_valid_features.py --train-dataset-file-name "dataset/2021_1_data/total_features_to_train.csv" --train-features-file-name "dataset/2021_1_data/train_features.csv" --train-labels-file-name "dataset/2021_1_data/train_labels.csv"
4、填补缺失值
源码:trainer/1_impute_features.py,填补缺失值并保存为 NumPy 格式。
python -u trainer/1_impute_features.py --features-file-name "dataset/2021_1_data/train_features.csv" --labels-file-name "dataset/2021_1_data/train_labels.csv" --dataset-file-name-prefix "dataset/2021_1_data/lgb_train_dataset_" --preprocessor-file-name "dataset/2021_1_data/feature_selector.joblib"
5、训练
源码:trainer/2_run_lightgbm.py,这个Python脚本是一个基于LightGBM框架的多标签分类器训练工具,用于训练6个不同的预测模型(对应6个不同的时间窗口)。
a、主要功能
- 加载预处理好的特征和标签数据(numpy数组格式)
- 为每个标签训练一个独立的LightGBM分类器
- 评估模型性能并保存训练好的模型
- 计算加权AUC作为整体评估指标
b、核心组件
1. 全局配置
num_labels = 6
: 定义要训练的标签数量(对应1天、2天、3天、7天、14天、30天的预测)category_indices
: 定义哪些特征是类别型特征,用于LightGBM的特殊处理
2. 模型评估函数
eval_lgb_model()
: 使用ROC AUC指标评估模型性能- 输入特征X和标签y
- 输出预测概率并计算AUC分数
3. 模型训练函数
model_training()
: 训练LightGBM分类器- 参数:
train_X
,train_y
: 训练数据valid_X
,valid_y
: 验证数据tuner_params
: 可选的超参数
- 功能:
- 初始化LightGBM分类器(带默认或指定参数)
- 使用早停机制(early stopping)训练模型
- 返回训练好的模型和验证集AUC分数
- 参数:
c. 主程序流程
- 数据准备:
- 加载特征和标签数据(
.npy
文件) - 使用
train_test_split
划分训练集和测试集(80%-20%)
- 加载特征和标签数据(
- 模型训练:
- 为每个标签(共6个)训练独立的LightGBM模型
- 每个标签可以使用不同的超参数(通过
params
列表指定) - 使用验证集进行早停,防止过拟合
- 模型保存与评估:
- 使用
joblib.dump
保存训练好的模型 - 计算加权AUC作为整体评估指标
- 使用
d、关键参数说明
LightGBM参数
max_depth
: 树的最大深度num_leaves
: 一棵树上的最大叶子数objective
: 目标函数(“binary”表示二分类)learning_rate
: 学习率feature_fraction
: 每次迭代随机选择特征的比例n_estimators
: 基学习器的最大数量reg_alpha
,reg_lambda
: L1和L2正则化项
训练控制参数
early_stopping_rounds=20
: 如果验证集指标连续20轮没有提升,则停止训练eval_metric="auc"
: 使用AUC作为评估指标categorical_feature
: 指定类别型特征的列索引
e、运行方法
python -u trainer/2_run_lightgbm.py --features-file-name "dataset/2021_1_data/lgb_train_dataset_X.npy" --labels-file-name "dataset/2021_1_data/lgb_train_dataset_y.npy" --model-cache-path "dataset/2021_1_data/lgb_model_label_"
6、预测
源码:predictor/0_extract_features_for_predict.py
这个Python脚本是一个特征处理工具,专门用于从原始预测数据集中提取有效的特征,为后续的模型预测做准备。
python -u predictor/0_extract_features_for_predict.py --predict-dataset-file-name "dataset/2021_1_data/total_features_to_predict.csv" --predict-features-file-name "dataset/2021_1_data/predict_features.csv"
源码:python -u predictor/1_predict_by_models.py
这个Python脚本是一个预测工具,使用预训练的LightGBM模型对新数据进行预测。
a、主要功能
- 加载预处理好的特征数据
- 加载预训练的模型和特征预处理器
- 对每个用户生成未来多个时间窗口的活跃度预测
- 将预测结果格式化为提交文件
b、输入文件
predict_features.csv
: 包含待预测用户的特征数据。格式:device_index|feature1|feature2|...
feature_selector.joblib
: 特征预处理器。用于对原始特征进行与训练时相同的处理lgb_model_label_{}
: 6个预训练模型文件。分别对应不同时间窗口的预测device_to_index.csv
: 设备ID与索引的映射表。格式:device_id|device_index
c、输出文件
submission.csv
: 预测结果文件
- 格式:
device_id,label_1d,label_2d,...,label_30d
- 每列是不同时间窗口的活跃概率
d、运行方法
python -u predictor/1_predict_by_models.py --features-file-name "dataset/2021_1_data/predict_features.csv" --preprocessor-file-name "dataset/2021_1_data/feature_selector.joblib" --model-cache-path "dataset/2021_1_data/lgb_model_label_" --user-index-file-name "dataset/2021_1_data/device_to_index.csv" --result-file-name "dataset/2021_1_data/submission.csv"
五、获取案例套装
文件包大小:2.5 GB