Просмотр исходного кода

feat: V564 排序公式简化为 fmRov × max(norDNNScore, 1e-6)

将 V564 sortscore 由
  fmRov × (rosAdd + rosW × newNorDNN) × (vorAdd + vorW × vor) + 5 linear bonuses
简化为
  score = fmRov × max(norDNNScore, 1e-6)
  if (!Double.isFinite(score)) score = 0d

离线 72 天 (0417-0627 over 49.8M sample/天) 评估依据:
- composite 指标 (gauc_share + gauc_rov + top10pct_rov 容差几何均) 自 5/15 起持续 ≥ 1.0
- 平均高于线上 sortscore 2-4%, share/rov 3 维度均不跌穿 baseline
- 6/4-6/8 退化期: 旧公式 top10pct 跌 -10%, 简化形式同期跌 -5%
  → 5 个 linear bonus 对脆弱性贡献最大

防御:
- 1e-6 epsilon 兜底: NorDNN 缺失 (12% 样本) 或负值 (1.76% 样本) 时
  score 仍按 fmRov × 1e-6 区分, 不全 tie 在 0, 也消除 inversion bug
- Double.isFinite 防 NaN/Infinity: Double.compare(NaN, x) 返正数会让
  NaN 项排到推荐顶部, 必须显式归 0
yangxiaohui 21 часов назад
Родитель
Сommit
4b811ddabd

+ 11 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV564.java

@@ -287,7 +287,17 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
             item.getScoresMap().put("dnRovn24hW", dnRovn24hW);
             item.getScoresMap().put("dnRovn24hW", dnRovn24hW);
             item.getScoresMap().put("dnRovn24h", dnRovn24h);
             item.getScoresMap().put("dnRovn24h", dnRovn24h);
 
 
-            score = fmRov * (rosAdd + rosW * newNorDNNScore) * (vorAdd + vorW * vor) + c1RovnScore + b0StrScore + b0RorScore + cnRovnScore + dnRovnScore;
+            // V564 实验: 简化公式 fmRov × max(norDNNScore, 1e-6)  (cal × rov 朴素乘 + 截负 + NaN 防御)
+            // 旧公式: fmRov * (rosAdd + rosW * newNorDNNScore) * (vorAdd + vorW * vor) + 5 linear bonuses
+            // 离线 72 天 (0417-0627) 验证: 该简化形式自 5/15 起 composite 持续 ≥ 1.0, 比线上 sortscore 平均高 2-4%
+            // 1e-6 epsilon 兜底:
+            //   1. NorDNN 缺失 (~12% 样本 getOrDefault=0) → score = fmRov × 1e-6, 内部仍按 fmRov 区分, 不全部 tie 在 0
+            //   2. NorDNN 负 (~1.76% 样本, min -0.39) → 截到 1e-6, 消除 fmRov × 负 导致的 inversion bug
+            // NaN/Infinity 兜底: Double.compare(NaN, x) 返正数, 降序排 NaN 会到顶部, 必须显式归零
+            score = fmRov * Math.max(norDNNScore, 1e-6);
+            if (!Double.isFinite(score)) {
+                score = 0d;  // NaN 或 ±Infinity → 归 0, 排到底部
+            }
 
 
             Video video = item.getVideo();
             Video video = item.getVideo();
             video.setScore(score);
             video.setScore(score);