|
@@ -82,7 +82,7 @@ def get_predict_calibration_file(df: pd.DataFrame, predict_basename: str) -> [pd
|
|
|
计算模型分的diff_rate
|
|
|
"""
|
|
|
agg_df = predict_df_agg(df)
|
|
|
- agg_df['diff_rate'] = (agg_df['p_score_avg'] / agg_df['t_ctcvr'] - 1).mask(agg_df['t_ctcvr'] == 0, 0)
|
|
|
+ agg_df['diff_rate'] = (agg_df['score_avg'] / agg_df['true_ctcvr'] - 1).mask(agg_df['true_ctcvr'] == 0, 0)
|
|
|
condition = 'view > 1000 and diff_rate >= 0.2'
|
|
|
save_full_calibration_file(agg_df, f"{SEGMENT_BASE_PATH}/{predict_basename}.txt")
|
|
|
calibration = agg_df.query(condition)
|
|
@@ -112,15 +112,15 @@ def predict_df_agg(df: pd.DataFrame) -> [pd.DataFrame]:
|
|
|
agg_operations = {
|
|
|
'view': ('cid', 'size'),
|
|
|
'conv': ('label', 'sum'),
|
|
|
- 'p_score_avg': ('score', lambda x: round(x.mean(), 6)),
|
|
|
+ 'score_avg': ('score', lambda x: round(x.mean(), 6)),
|
|
|
}
|
|
|
|
|
|
# 如果存在 score_2 列,则增加相关聚合
|
|
|
if "score_2" in df.columns:
|
|
|
- agg_operations['p_score_2_avg'] = ('score_2', lambda x: round(x.mean(), 6))
|
|
|
+ agg_operations['score_2_avg'] = ('score_2', lambda x: round(x.mean(), 6))
|
|
|
|
|
|
grouped_df = df.groupby("cid").agg(**agg_operations).reset_index()
|
|
|
- grouped_df['t_ctcvr'] = grouped_df['conv'] / grouped_df['view']
|
|
|
+ grouped_df['true_ctcvr'] = grouped_df['conv'] / grouped_df['view']
|
|
|
|
|
|
return grouped_df
|
|
|
|
|
@@ -145,24 +145,24 @@ def _main(old_predict_path: str, new_predict_path: str, calibration_file: str, a
|
|
|
new_agg_df = predict_df_agg(new_df)
|
|
|
|
|
|
# 字段重命名,和列过滤
|
|
|
- old_agg_df.rename(columns={'p_score_avg': 'old_score_avg', 'p_score_2_avg': 'old_score_2_avg'}, inplace=True)
|
|
|
- new_agg_df.rename(columns={'p_score_avg': 'new_score_avg', 'p_score_2_avg': 'new_score_2_avg'}, inplace=True)
|
|
|
- old_group_df = old_agg_df[['cid', 'view', 'conv', 't_ctcvr', 'old_score_avg', 'old_score_2_avg']]
|
|
|
+ old_agg_df.rename(columns={'score_avg': 'old_score_avg', 'score_2_avg': 'old_score_2_avg'}, inplace=True)
|
|
|
+ new_agg_df.rename(columns={'score_avg': 'new_score_avg', 'score_2_avg': 'new_score_2_avg'}, inplace=True)
|
|
|
+ old_group_df = old_agg_df[['cid', 'view', 'conv', 'true_ctcvr', 'old_score_avg', 'old_score_2_avg']]
|
|
|
new_group_df = new_agg_df[['cid', 'new_score_avg', 'new_score_2_avg']]
|
|
|
merged = pd.merge(old_group_df, new_group_df, on='cid', how='left')
|
|
|
|
|
|
# 计算与真实ctcvr的差异值
|
|
|
- merged["(new-true)/true"] = (merged['new_score_avg'] / merged['t_ctcvr'] - 1).mask(merged['t_ctcvr'] == 0, 0)
|
|
|
- merged["(old-true)/true"] = (merged['old_score_avg'] / merged['t_ctcvr'] - 1).mask(merged['t_ctcvr'] == 0, 0)
|
|
|
+ merged["(new-true)/true"] = (merged['new_score_avg'] / merged['true_ctcvr'] - 1).mask(merged['true_ctcvr'] == 0, 0)
|
|
|
+ merged["(old-true)/true"] = (merged['old_score_avg'] / merged['true_ctcvr'] - 1).mask(merged['true_ctcvr'] == 0, 0)
|
|
|
|
|
|
# 计算校准后的模型分与ctcvr的差异值
|
|
|
- merged["(new2-true)/true"] = (merged['new_score_2_avg'] / merged['t_ctcvr'] - 1).mask(merged['t_ctcvr'] == 0, 0)
|
|
|
- merged["(old2-true)/true"] = (merged['old_score_2_avg'] / merged['t_ctcvr'] - 1).mask(merged['t_ctcvr'] == 0, 0)
|
|
|
+ merged["(new2-true)/true"] = (merged['new_score_2_avg'] / merged['true_ctcvr'] - 1).mask(merged['true_ctcvr'] == 0, 0)
|
|
|
+ merged["(old2-true)/true"] = (merged['old_score_2_avg'] / merged['true_ctcvr'] - 1).mask(merged['true_ctcvr'] == 0, 0)
|
|
|
|
|
|
# 按照曝光排序,写入本地文件
|
|
|
merged = merged.sort_values(by=['view'], ascending=False)
|
|
|
merged = merged[[
|
|
|
- 'cid', 'view', "conv", "t_ctcvr",
|
|
|
+ 'cid', 'view', "conv", "true_ctcvr",
|
|
|
"old_score_avg", "new_score_avg", "(old-true)/true", "(new-true)/true",
|
|
|
"old_score_2_avg", "new_score_2_avg", "(old2-true)/true", "(new2-true)/true",
|
|
|
]]
|