# 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低频交易场景 **核心原则**: 在低频场景下,所有历史数据都很宝贵,不要过度衰减