当前位置: 首页 > news >正文

科大讯飞2025AI开发者大赛-用户新增赛道时间规则解析

根据训练集中的时间规则,对测试集中的数据推断用户标签(新用户或老用户)。

时间规则如下:
针对训练集和测试集中都存在的did:
找到在训练集中标记为新用户最晚的时间点,则测试集中对应did的数据在此时间点前全部为新用户;
找到在训练集中标记为老用户最早的时间点,则测试集中对应did的数据在此时间点后全部为老用户;

具体实现代码如下:

1.1参数说明

  • train_df: 训练集DataFrame,包含已知的用户标签(is_new_did
  • test_df: 测试集DataFrame,需要推断用户标签

1.2寻找共同DID

train_dids = set(train_df['did'].unique())
test_dids = set(test_df['did'].unique())
common_dids = train_dids.intersection(test_dids)

功能说明

  • 提取训练集和测试集中的唯一设备ID(DID)
  • 找出两个集合的交集,即同时出现在训练集和测试集中的DID
  • 只有共同的DID才能应用时间规则

2.2 计算时间规则

# 新用户:找每个DID作为新用户时的最大时间戳
new_user_times = train_common[train_common['is_new_did'] == 1].groupby('did')['common_ts'].max()# 老用户:找每个DID作为老用户时的最小时间戳
old_user_times = train_common[train_common['is_new_did'] == 0].groupby('did')['common_ts'].min()

时间规则逻辑

  1. 新用户规则

    • 对于每个DID,找出它在训练集中被标记为新用户(is_new_did=1)的最晚时间戳
    • 推断:如果测试集中该DID的时间戳 < 这个最晚时间戳,则为新用户
  2. 老用户规则

    • 对于每个DID,找出它在训练集中被标记为老用户(is_new_did=0)的最小时间戳
    • 推断:如果测试集中该DID的时间戳 > 这个最小时间戳,则为老用户

1.3 应用规则

应用新用户规则:
mask_new = (test_with_new_rules['max_new_time'].notna()) & \(test_with_new_rules['common_ts'] < test_with_new_rules['max_new_time'])
test_df.loc[mask_new, 'is_new_did'] = 1

判断条件

  • 该DID存在新用户规则(max_new_time不为空)
  • 测试集中的时间戳小于新用户的最大时间戳
应用老用户规则:
mask_old = (test_with_old_rules['min_old_time'].notna()) & \(test_with_old_rules['common_ts'] > test_with_old_rules['min_old_time']) & \(test_with_old_rules['is_new_did'] == -1)

判断条件

  • 该DID存在老用户规则(min_old_time不为空)
  • 测试集中的时间戳大于老用户的最小时间戳
  • 该记录尚未被标记(is_new_did == -1

1.4 性能优化

使用DataFrame的merge操作批量应用规则,而不是逐行遍历,提高了处理效率:

test_with_new_rules = test_df.merge(new_user_rules_df, on='did', how='left'
)

4. 时间线示例

假设某个DID在训练集中的记录:

时间轴: |---新用户期---[T1]---老用户期---|↑               ↑                ↑最早记录          转换点          最新记录
  • T1之前:标记为新用户(is_new_did=1)
  • T1之后:标记为老用户(is_new_did=0)

对于测试集中的该DID:

  • 如果时间 < T1:根据新用户规则,标记为新用户
  • 如果时间 > T1:根据老用户规则,标记为老用户

计算结果如下:

DID统计:
训练集唯一DID: 270,837
测试集唯一DID: 206,342
共同DID: 192,393

计算时间规则…
新用户规则数: 57,787
老用户规则数: 162,173

批量应用规则…

规则应用结果:
通过规则1确定(新用户): 150,714
通过规则2确定(老用户): 882,188
总确定数量: 1,032,902 (90.34%)
未确定数量: 110,407 (9.66%)

将测试集中未确定是新老用户的数据全部计为老用户,F1Score可达0.92以上

关于检查训练集中是否存在对于同一个did,新用户数据出现在老用户之后的情况,请在评论区获取相关解答!

相关文章:

  • ARFoundation系列讲解 - 100 VisionPro 环境搭建
  • Swift Moya自定义插件打印日志
  • 磁悬浮轴承气隙设计深度解析:微米间的生死时速
  • 蚂蚁百宝箱体验:如何快速创建“旅游小助手”AI智能体
  • Eplan2022导入edz文件并插入使用
  • Java 使用 Easy Excel 进行 Excel 数据导入导出
  • Linux基本指令篇 —— less指令
  • GeoTools 结合 OpenLayers 实现属性查询
  • 阶段二开始-第一章—8天Python从入门到精通【itheima】-118节(继承)
  • 《红黑树实现》
  • 基于esp32s3的自定义唤醒词识别-单元测试
  • 基于CNN卷积神经网络图像识别小程序9部合集
  • 【算法深练】单调栈:有序入栈,及时删除垃圾数据
  • 2.搭建Pytorch神经网络进行气温预测
  • 数据湖 vs 数据仓库:数据界的“自来水厂”与“瓶装水厂”?
  • 表达式求值
  • Launcher3中的CellLayout 和ShortcutAndWidgetContainer 的联系和各自职责
  • 华为云镜像仓库下载 selenium/standalone-chrome 镜像
  • SQL关键字三分钟入门:ROW_NUMBER() —— 窗口函数为每一行编号
  • 深度学习-分类