Blame view

offline_tasks/README.md 7.19 KB
5ab1c29c   tangwang   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
  # 推荐系统离线任务
  
  本目录包含推荐系统的离线任务脚本,用于生成各种推荐索引。
  
  ## 目录结构
  
  ```
  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算法是一种基于用户共同行为的物品相似度计算方法,相比协同过滤有更好的效果。
  
  **运行命令:**
  ```bash
  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模型,学习商品的向量表示,通过向量相似度计算商品相似度。
  
  **运行命令:**
  ```bash
  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模型。
  
  **运行命令:**
  ```bash
  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. 兴趣点聚合索引
  
  按照多个维度聚合用户行为,生成不同场景下的商品推荐索引。
  
  **运行命令:**
  ```bash
  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` 可以一次性运行所有离线任务:
  
  **运行所有任务:**
  ```bash
  python run_all.py --lookback_days 730 --top_n 50
  ```
  
  **运行特定任务:**
  ```bash
  # 只运行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/` 目录下。
  
  ## 依赖项
  
  ```bash
  pip install pandas sqlalchemy pymysql gensim numpy
  ```
  
  ## 定时任务设置
  
  建议使用crontab设置定时任务,每天凌晨运行一次:
  
  ```bash
  # 编辑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. 内存是否充足