排序-评价指标
最近要跳到排序的组,之前都是做QP相关的,基本就是query分类(行业、意图),NER实体抽取,query改写,纠错,连qd相关性的模型都很少做,感觉突然跨到搜索链路后端也有点慌。来一起从零学习一下叭。
整体来说,召回之后,我们得到若干个doc 内容(可能包括title,abs,前置label,pv,uv,时效性,权威性等特征),需要与query侧特征+用户侧特征进行交互,得到满足query+用户需求的 多个doc的打分,进行排序展示给用户
评价指标
| 指标 | 物理含义 | 敏感因素 | 日常波动 |
|---|---|---|---|
| CTR | 点不点 | 位置、封面 | 0.1~0.2% |
| AUC | 正负序 | 样本不平衡 | 0.1‰ 就显著 |
| GAUC | 用户内序 | 新用户占比 | 0.3‰ 就显著 |
| NDCG@20 | 排序位置 | relevance 档位 | 1% 以上才显著 |
| 完播率 | 内容质量 | 视频时长 | 0.5% 可见 |
| 时长 | 消费深度 | 长剧/短剧占比 | 2% 以上可见 |
| RPM | 钱 | 竞价库存 | 5% 以上可见 |
- CTR 点击率
ctr = clicks.sum() / impressions.sum()
使用ctr 点击率作为label 时,也需要考虑完播率/播放时长。同时对新物料权重偏低
- AUC
随机抽一个正样本和一个负样本,模型把正样本打分更高的概率
from sklearn.metrics import roc_auc_score
auc = roc_auc_score(y_true, y_score)
面试过程有时候面试官会问一下AUC计算公式
import numpy as np
def auc_manual(y_true, y_score):
pos_score = y_score[y_true == 1]
neg_score = y_score[y_true == 0]
M, N = len(pos_score), len(neg_score)
# 广播构造 M×N 比较矩阵
mat = (pos_score[:, None] > neg_score).sum() + \
0.5 * (pos_score[:, None] == neg_score).sum()
return mat / (M * N)
# 测试
y_true = np.array([1, 0, 1, 0, 0])
y_score = np.array([0.8, 0.7, 0.6, 0.6, 0.5])
print(auc_manual(y_true, y_score)) # 0.75
- GAUC
将样本按照(用户+场景) 分组,每组算AUC,再按权重评价
def gauc(df, group='user_id', y_true='label', y_score='score', weight='impressions'):
return df.groupby(group).apply(
lambda x: roc_auc_score(x[y_true], x[y_score]) * x[weight].sum()
).sum() / df[weight].sum()
注意:
- 用户行为稀疏:单用户全是 0 或全是 1 时 AUC 无定义,需过滤或平滑。
- 新用户占比高时 GAUC 会整体下降,不代表模型变差。
- NDCG
常用于相关性检索指标
计算当前预测相关性结果的DCG
DCG@K=∑i=1K2reli−1log2(i+1)
{DCG@K}=\sum_{i=1}^{K}\frac{2^{rel_i}-1}{\log_2(i+1)}
DCG@K=i=1∑Klog2(i+1)2reli−1
计算label 最佳情况IDCG
IDCG@K=∑i=1K2reli∗−1log2(i+1)
{IDCG@K}=\sum_{i=1}^{K}\frac{2^{rel_i^*}-1}{\log_2(i+1)}
IDCG@K=i=1∑Klog2(i+1)2reli∗−1
最终NDCG
NDCG@K=DCG@KIDCG@K∈[0,1]
{NDCG@K}=\frac{\mathrm{DCG@K}}{\mathrm{IDCG@K}}\in[0,1]
NDCG@K=IDCG@KDCG@K∈[0,1]
from sklearn.metrics import ndcg_score
ndcg = ndcg_score([y_true], [y_score], k=20)
- 完播率
完播率 = 播放时长 ≥ 视频时长 · 90% 的次数 / 播放总次数(90% 可调,短视频常用 100%,长剧常用 70%)
注意:视频本身时长分布极不均匀,必须分 bucket 看(0–30s,30–300s…)
- 播放时长(观看秒数)
- 长剧一集 45 分钟,会把 loss 带偏;需做平方根或对数变换。
- 自动播放/连播场景要扣除非主动点击的时长,否则模型会偏向“自动”物料。
- RPM
RPM = 1000 · 总营收 / 曝光量
对会员业务可换“会员转化收入”算钱。
注意:
- 广告竞价实时变化,RPM 掉可能是广告主预算减少,不一定是模型差。
- 高 RPM 广告往往时长低,会拉低完播率,需要 Pareto 前沿权衡。
指标间的“跷跷板”关系
- CTR↗1% 时,完播率可能↘0.5%(标题党)。
- 时长↗3% 时,RPM 可能↘2%(长剧多、广告位少)。
- AUC 涨 0.5% 不一定带来 GAUC 涨,必须看用户分组。
- NDCG@20 涨,首页前 20 位“更好看”,但总量下降可能导致 RPM 掉。
上线判赢原则
- 核心指标:GAUC 涨 ≥0.3% 且 RPM 不掉 >0.5% → 可直接全量。
- 保护指标:完播率跌幅 >1% 或 时长跌幅 >1.5% → 打回调参。
269

被折叠的 条评论
为什么被折叠?



