README.md 7.19 KB

推荐系统离线任务

本目录包含推荐系统的离线任务脚本,用于生成各种推荐索引。

目录结构

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)

支持的维度:

  1. 单维度:

    • platform: 平台
    • country: 国家/销售区域
    • customer_type: 客户类型
    • category_level2: 二级分类
    • category_level3: 三级分类
  2. 组合维度:

    • platform_country: 平台 + 国家
    • platform_customer: 平台 + 客户类型
    • country_customer: 国家 + 客户类型
    • platform_country_customer: 平台 + 国家 + 客户类型
  3. 列表类型:

    • 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.txt
  • i2i_session_w2v_20251016.txt
  • i2i_deepwalk_20251016.txt
  • interest_aggregation_hot_20251016.txt
  • interest_aggregation_cart_20251016.txt
  • interest_aggregation_new_20251016.txt
  • interest_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

注意事项

  1. 数据量:由于需要处理2年的数据,任务可能需要较长时间(几小时到十几小时不等)
  2. 内存占用:Swing算法和DeepWalk可能占用较多内存,建议在内存充足的机器上运行
  3. 数据库连接:确保数据库连接信息正确,且有足够的权限读取相关表
  4. 磁盘空间:确保output目录有足够的磁盘空间存储输出文件

性能优化建议

  1. 并行化:可以将不同算法的任务分配到不同机器上并行运行
  2. 增量更新:对于已有的索引,可以考虑增量更新而不是全量计算
  3. 采样:对于数据量特别大的场景,可以考虑先采样一部分数据进行调试
  4. 缓存:可以将中间结果缓存,避免重复计算

问题排查

如果任务执行失败,请检查:

  1. 日志文件中的错误信息
  2. 数据库连接是否正常
  3. 数据表结构是否正确
  4. Python依赖包是否安装完整
  5. 磁盘空间是否充足
  6. 内存是否充足