B2B_LOW_FREQUENCY_OPTIMIZATION.md
5.22 KB
B2B低频场景优化总结
📋 优化背景
B2B场景的特点:
- ✅ 用户行为频次非常低
- ✅ 行为间隔时间可能很长
- ✅ 历史行为依然重要,不应过度衰减
✅ 已完成的优化
1. i2i_session_w2v.py - Session分割策略优化
修改前(基于时间间隔)
# 问题:B2B场景下,用户可能几个月才有一次行为
# 基于30分钟间隔分割session不合适
session_gap_minutes = 30
if (current_time - last_time).total_seconds() / 60 > session_gap_minutes:
# 新session
修改后(固定长度分块)
# 参考: 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)
]
优势:
- 不依赖时间间隔,适合低频场景
- 逻辑简化,性能更好
- 保留用户行为的顺序信息
新增参数:
--max_session_length 50 # 最大会话长度
--min_session_length 2 # 最小会话长度(过滤太短的序列)
2. i2i_swing.py - 关闭时间衰减
修改前
--time_decay # 默认True,开启时间衰减
# 30天前权重: 0.95
# 60天前权重: 0.90
# 180天前权重: 0.74 (衰减过快)
修改后
--time_decay # 默认False,关闭时间衰减
# 所有历史行为权重相同,更适合低频场景
原因: 在B2B低频场景下,6个月前的行为可能依然很有价值,不应该被大幅衰减。
3. interest_aggregation.py - 关闭时间衰减
修改内容
# 热门商品索引 - 关闭时间衰减
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(已自动优化)
# 使用新的固定长度分块策略
python3 scripts/i2i_session_w2v.py \
--lookback_days 365 \
--max_session_length 50 \
--min_session_length 2 \
--top_n 50 \
--debug
Swing算法(默认已关闭时间衰减)
# 默认不使用时间衰减,适合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 # 更缓慢的衰减
兴趣聚合(已自动优化)
# 已默认关闭时间衰减
python3 scripts/interest_aggregation.py \
--lookback_days 365 \
--top_n 100 \
--debug
运行所有任务
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. 增加回溯天数
# offline_tasks/config/offline_config.py
DEFAULT_LOOKBACK_DAYS = 365 # 从默认值改为365天
2. 如果需要重新启用时间衰减(特殊场景)
# Swing算法
python3 scripts/i2i_swing.py --time_decay --decay_factor 0.99
# 修改interest_aggregation.py中的hard-coded值
# 将 time_decay=False 改回 time_decay=True
✨ 优化效果
预期改进
Session W2V:
- 不再因为时间间隔过长而丢失用户行为序列
- 能够更好地捕捉低频用户的行为模式
Swing算法:
- 历史行为不会因时间衰减而被低估
- 在数据稀疏的情况下充分利用所有历史数据
兴趣聚合:
- 长期累积的用户偏好得到保留
- 推荐结果更稳定
需要监控的指标
- [ ] Session数量变化
- [ ] 相似物品覆盖率
- [ ] 推荐效果指标(CTR、转化率等)
📝 回滚方法
如果需要恢复之前的逻辑:
# 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低频交易场景
核心原则: 在低频场景下,所有历史数据都很宝贵,不要过度衰减