根据训练集中的时间规则,对测试集中的数据推断用户标签(新用户或老用户)。
时间规则如下:
针对训练集和测试集中都存在的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()
时间规则逻辑:
-
新用户规则:
- 对于每个DID,找出它在训练集中被标记为新用户(
is_new_did=1
)的最晚时间戳 - 推断:如果测试集中该DID的时间戳 < 这个最晚时间戳,则为新用户
- 对于每个DID,找出它在训练集中被标记为新用户(
-
老用户规则:
- 对于每个DID,找出它在训练集中被标记为老用户(
is_new_did=0
)的最小时间戳 - 推断:如果测试集中该DID的时间戳 > 这个最小时间戳,则为老用户
- 对于每个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,新用户数据出现在老用户之后的情况,请在评论区获取相关解答!