9832fef6
tangwang
offline tasks
|
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
|
# B2B低频场景优化总结
## 📋 优化背景
B2B场景的特点:
- ✅ 用户行为频次**非常低**
- ✅ 行为间隔时间**可能很长**
- ✅ 历史行为**依然重要**,不应过度衰减
## ✅ 已完成的优化
### 1. **i2i_session_w2v.py** - Session分割策略优化
#### 修改前(基于时间间隔)
```python
# 问题:B2B场景下,用户可能几个月才有一次行为
# 基于30分钟间隔分割session不合适
session_gap_minutes = 30
if (current_time - last_time).total_seconds() / 60 > session_gap_minutes:
# 新session
```
#### 修改后(固定长度分块)
```python
# 参考: graphembedding/session_w2v/prepare_data.py
# 按固定长度分块,不考虑时间间隔
max_session_length = 50 # 最大会话长度
min_session_length = 2 # 最小会话长度
# 按用户行为序列分块
user_sessions = [
item_sequence[i:i + max_session_length]
for i in range(0, len(item_sequence), max_session_length)
]
```
**优势:**
- 不依赖时间间隔,适合低频场景
- 逻辑简化,性能更好
- 保留用户行为的顺序信息
**新增参数:**
```bash
--max_session_length 50 # 最大会话长度
--min_session_length 2 # 最小会话长度(过滤太短的序列)
```
---
### 2. **i2i_swing.py** - 关闭时间衰减
#### 修改前
```python
--time_decay # 默认True,开启时间衰减
# 30天前权重: 0.95
# 60天前权重: 0.90
# 180天前权重: 0.74 (衰减过快)
```
#### 修改后
```python
--time_decay # 默认False,关闭时间衰减
# 所有历史行为权重相同,更适合低频场景
```
**原因:**
在B2B低频场景下,6个月前的行为可能依然很有价值,不应该被大幅衰减。
---
### 3. **interest_aggregation.py** - 关闭时间衰减
#### 修改内容
```python
# 热门商品索引 - 关闭时间衰减
list_type_indices['hot'] = aggregate_by_dimensions(
df_hot, behavior_weights, time_decay=False # 改为False
)
# 加购商品索引 - 关闭时间衰减
list_type_indices['cart'] = aggregate_by_dimensions(
df_cart, behavior_weights, time_decay=False # 改为False
)
# 全局索引 - 关闭时间衰减
global_aggregations = aggregate_by_dimensions(
df, behavior_weights, time_decay=False # 改为False
)
# 新品索引 - 本来就不用时间衰减(保持不变)
list_type_indices['new'] = aggregate_by_dimensions(
df_new, behavior_weights, time_decay=False
)
```
---
## 🚀 使用方法
### Session W2V(已自动优化)
```bash
# 使用新的固定长度分块策略
python3 scripts/i2i_session_w2v.py \
--lookback_days 365 \
--max_session_length 50 \
--min_session_length 2 \
--top_n 50 \
--debug
```
### Swing算法(默认已关闭时间衰减)
```bash
# 默认不使用时间衰减,适合B2B场景
python3 scripts/i2i_swing.py \
--lookback_days 365 \
--top_n 50 \
--debug
# 如果需要开启时间衰减(不推荐)
python3 scripts/i2i_swing.py \
--lookback_days 365 \
--time_decay \
--decay_factor 0.99 # 更缓慢的衰减
```
### 兴趣聚合(已自动优化)
```bash
# 已默认关闭时间衰减
python3 scripts/interest_aggregation.py \
--lookback_days 365 \
--top_n 100 \
--debug
```
### 运行所有任务
```bash
cd /home/tw/recommendation/offline_tasks
# 使用更长的回溯天数,适合低频场景
python3 run_all.py --lookback_days 365 --top_n 50 --debug
```
---
## 📊 其他索引(无需修改)
### i2i_deepwalk.py
- ✅ 不涉及session分割
- ✅ 不使用时间衰减
- ✅ 无需修改
### i2i_content_similar.py
- ✅ 基于商品属性的相似度
- ✅ 不涉及时间因素
- ✅ 无需修改
---
## 💡 建议的配置调整
### 1. 增加回溯天数
```python
# offline_tasks/config/offline_config.py
DEFAULT_LOOKBACK_DAYS = 365 # 从默认值改为365天
```
### 2. 如果需要重新启用时间衰减(特殊场景)
```bash
# Swing算法
python3 scripts/i2i_swing.py --time_decay --decay_factor 0.99
# 修改interest_aggregation.py中的hard-coded值
# 将 time_decay=False 改回 time_decay=True
```
---
## ✨ 优化效果
### 预期改进
1. **Session W2V**:
- 不再因为时间间隔过长而丢失用户行为序列
- 能够更好地捕捉低频用户的行为模式
2. **Swing算法**:
- 历史行为不会因时间衰减而被低估
- 在数据稀疏的情况下充分利用所有历史数据
3. **兴趣聚合**:
- 长期累积的用户偏好得到保留
- 推荐结果更稳定
### 需要监控的指标
- [ ] Session数量变化
- [ ] 相似物品覆盖率
- [ ] 推荐效果指标(CTR、转化率等)
---
## 📝 回滚方法
如果需要恢复之前的逻辑:
```bash
# 1. 恢复i2i_swing.py的时间衰减
git diff offline_tasks/scripts/i2i_swing.py
# 将 default=False 改回 default=True
# 2. 恢复interest_aggregation.py的时间衰减
git diff offline_tasks/scripts/interest_aggregation.py
# 将所有 time_decay=False 改回 time_decay=True
# 3. 恢复i2i_session_w2v.py的时间分割
git diff offline_tasks/scripts/i2i_session_w2v.py
# 恢复基于时间间隔的session分割逻辑
```
---
**修改时间**: 2025-10-16
**适用场景**: B2B低频交易场景
**核心原则**: 在低频场景下,所有历史数据都很宝贵,不要过度衰减
|