根據訓練集中的時間規則,對測試集中的數據推斷用戶標簽(新用戶或老用戶)。
時間規則如下:
針對訓練集和測試集中都存在的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,新用戶數據出現在老用戶之后的情況,請在評論區獲取相關解答!