README.md
推荐系统离线任务
本目录包含推荐系统的离线任务脚本,用于生成各种推荐索引。
目录结构
offline_tasks/
├── config/
│ └── offline_config.py # 离线任务配置文件
├── scripts/
│ ├── i2i_swing.py # Swing算法实现
│ ├── i2i_session_w2v.py # Session Word2Vec实现
│ ├── i2i_deepwalk.py # DeepWalk算法实现
│ └── interest_aggregation.py # 兴趣点聚合索引生成
├── output/ # 输出目录
├── logs/ # 日志目录
├── run_all.py # 统一调度脚本
└── README.md # 本文档
功能说明
1. i2i - 行为相似索引
基于用户行为数据,计算商品之间的相似度,生成i2i(item-to-item)推荐索引。
1.1 Swing算法
Swing算法是一种基于用户共同行为的物品相似度计算方法,相比协同过滤有更好的效果。
运行命令:
python scripts/i2i_swing.py --lookback_days 730 --top_n 50 --time_decay
参数说明:
--lookback_days: 回溯天数(默认730天,即2年)--top_n: 每个商品输出的相似商品数量(默认50)--alpha: Swing算法的alpha参数(默认0.5)--time_decay: 是否使用时间衰减--decay_factor: 时间衰减因子(默认0.95,每30天衰减一次)
输出格式:
item_id \t item_name \t similar_item_id1:score1,similar_item_id2:score2,...
1.2 Session Word2Vec
基于用户会话序列训练Word2Vec模型,学习商品的向量表示,通过向量相似度计算商品相似度。
运行命令:
python scripts/i2i_session_w2v.py --lookback_days 730 --top_n 50 --save_model
参数说明:
--lookback_days: 回溯天数--top_n: 输出相似商品数量--window_size: Word2Vec窗口大小(默认5)--vector_size: 向量维度(默认128)--min_count: 最小词频(默认2)--workers: 训练线程数(默认10)--epochs: 训练轮数(默认10)--session_gap: 会话间隔(分钟,默认30)--save_model: 是否保存模型
输出格式:
item_id \t item_name \t similar_item_id1:score1,similar_item_id2:score2,...
1.3 DeepWalk
基于用户-商品交互图,使用随机游走生成序列,然后训练Word2Vec模型。
运行命令:
python scripts/i2i_deepwalk.py --lookback_days 730 --top_n 50 --save_model --save_graph
参数说明:
--lookback_days: 回溯天数--top_n: 输出相似商品数量--num_walks: 每个节点的游走次数(默认10)--walk_length: 游走长度(默认40)--window_size: Word2Vec窗口大小(默认5)--vector_size: 向量维度(默认128)--save_model: 是否保存模型--save_graph: 是否保存图结构
输出格式:
item_id \t item_name \t similar_item_id1:score1,similar_item_id2:score2,...
2. 兴趣点聚合索引
按照多个维度聚合用户行为,生成不同场景下的商品推荐索引。
运行命令:
python scripts/interest_aggregation.py --lookback_days 730 --top_n 1000
参数说明:
--lookback_days: 回溯天数(默认730天,即2年)--recent_days: 热门商品的统计天数(默认180天)--new_days: 新品的定义天数(默认90天)--top_n: 每个维度输出的商品数量(默认1000)--decay_factor: 时间衰减因子(默认0.95)
支持的维度:
单维度:
platform: 平台country: 国家/销售区域customer_type: 客户类型category_level2: 二级分类category_level3: 三级分类
组合维度:
platform_country: 平台 + 国家platform_customer: 平台 + 客户类型country_customer: 国家 + 客户类型platform_country_customer: 平台 + 国家 + 客户类型
列表类型:
hot: 热门商品(基于最近N天的高交互)cart: 加购商品(基于加购行为)new: 新品(基于商品创建时间)global: 全局索引(所有数据)
输出格式:
dimension_key \t item_id1:score1,item_id2:score2,...
示例:
platform:PC \t 12345:98.5,23456:87.3,...
country:US \t 34567:156.2,45678:142.8,...
platform_country:PC_US \t 56789:234.5,67890:198.7,...
统一调度脚本
使用 run_all.py 可以一次性运行所有离线任务:
运行所有任务:
python run_all.py --lookback_days 730 --top_n 50
运行特定任务:
# 只运行Swing算法
python run_all.py --only-swing
# 只运行Session W2V
python run_all.py --only-w2v
# 只运行DeepWalk
python run_all.py --only-deepwalk
# 只运行兴趣点聚合
python run_all.py --only-interest
# 跳过i2i任务
python run_all.py --skip-i2i
# 跳过兴趣点聚合
python run_all.py --skip-interest
配置文件
所有配置参数都在 config/offline_config.py 中定义,包括:
- 数据库配置:数据库连接信息
- 路径配置:输出目录、日志目录
- 时间配置:回溯天数、时间衰减参数
- 算法配置:各算法的超参数
- 行为权重:不同行为类型的权重
可以根据实际需求修改配置文件中的参数。
输出文件
所有输出文件都保存在 output/ 目录下,文件名格式为:
{任务名}_{日期}.txt
例如:
i2i_swing_20251016.txti2i_session_w2v_20251016.txti2i_deepwalk_20251016.txtinterest_aggregation_hot_20251016.txtinterest_aggregation_cart_20251016.txtinterest_aggregation_new_20251016.txtinterest_aggregation_global_20251016.txt
日志
所有任务的执行日志都保存在 logs/ 目录下。
依赖项
pip install pandas sqlalchemy pymysql gensim numpy
定时任务设置
建议使用crontab设置定时任务,每天凌晨运行一次:
# 编辑crontab
crontab -e
# 添加定时任务(每天凌晨2点运行)
0 2 * * * cd /home/tw/recommendation/offline_tasks && /usr/bin/python3 run_all.py --lookback_days 730 --top_n 50
注意事项
- 数据量:由于需要处理2年的数据,任务可能需要较长时间(几小时到十几小时不等)
- 内存占用:Swing算法和DeepWalk可能占用较多内存,建议在内存充足的机器上运行
- 数据库连接:确保数据库连接信息正确,且有足够的权限读取相关表
- 磁盘空间:确保output目录有足够的磁盘空间存储输出文件
性能优化建议
- 并行化:可以将不同算法的任务分配到不同机器上并行运行
- 增量更新:对于已有的索引,可以考虑增量更新而不是全量计算
- 采样:对于数据量特别大的场景,可以考虑先采样一部分数据进行调试
- 缓存:可以将中间结果缓存,避免重复计算
问题排查
如果任务执行失败,请检查:
- 日志文件中的错误信息
- 数据库连接是否正常
- 数据表结构是否正确
- Python依赖包是否安装完整
- 磁盘空间是否充足
- 内存是否充足