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

✨ 优化效果

预期改进

  1. Session W2V:

    • 不再因为时间间隔过长而丢失用户行为序列
    • 能够更好地捕捉低频用户的行为模式
  2. Swing算法:

    • 历史行为不会因时间衰减而被低估
    • 在数据稀疏的情况下充分利用所有历史数据
  3. 兴趣聚合:

    • 长期累积的用户偏好得到保留
    • 推荐结果更稳定

需要监控的指标

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