Parcourir la source

Merge branch 'feature/20250211-update-rank683' of algorithm/ad-engine into master

fengzhoutian il y a 2 mois
Parent
commit
ab661cc05e

+ 3 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/math/Const.java

@@ -2,4 +2,7 @@ package com.tzld.piaoquan.ad.engine.commons.math;
 
 public class Const {
     public static final double WILSON_ZSCORE = 1.96;
+    public static final double CTR_SMOOTH_BETA_FACTOR = 25;
+    public static final double CVR_SMOOTH_BETA_FACTOR = 10;
+    public static final double CTCVR_SMOOTH_BETA_FACTOR = 100;
 }

+ 7 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/NumUtil.java

@@ -25,6 +25,13 @@ public class NumUtil {
         return numerator / denominator;
     }
 
+    public static double divSmoothV2(double a, double b, double beta) {
+        if (a == 0 || b == 0) {
+            return 0d;
+        }
+        return a / (b + beta);
+    }
+
     public static double log(double a) {
         if (a <= 0) {
             return 0D;

+ 1 - 1
ad-engine-server/src/main/resources/ad_score_config_xgboost_683.conf

@@ -2,6 +2,6 @@ scorer-config = {
   xgb-score-config = {
     scorer-name = "com.tzld.piaoquan.ad.engine.service.score.scorer.XGBoostScorer683"
     scorer-priority = 99
-    model-path = "fengzhoutian/model_xgb_351_1000_30d_v2.tar.gz"
+    model-path = "zhangbo/model_xgb_351_1000_v2.tar.gz"
   }
 }

+ 13 - 11
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBy683.java

@@ -29,7 +29,7 @@ import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
-import static com.tzld.piaoquan.ad.engine.commons.math.Const.WILSON_ZSCORE;
+import static com.tzld.piaoquan.ad.engine.commons.math.Const.*;
 
 @Slf4j
 @Component
@@ -215,6 +215,7 @@ public class RankStrategyBy683 extends RankStrategyBasic {
         long time5 = System.currentTimeMillis();
 
         // calibrate score for negative sampling
+        /* 02-11 update: 因模型换回基线无采样模型,取消校准
         for (AdRankItem item : result) {
             double originalScore = item.getLrScore();
             double calibratedScore = originalScore / (originalScore + (1 - originalScore) / negSampleRate);
@@ -222,6 +223,7 @@ public class RankStrategyBy683 extends RankStrategyBasic {
             item.getScoreMap().put("originCtcvrScore", originalScore);
             item.getScoreMap().put("ctcvrScore", calibratedScore);
         }
+        */
 
         // loop
         double cpmCoefficient = weightParam.getOrDefault("cpmCoefficient", 0.9);
@@ -330,12 +332,12 @@ public class RankStrategyBy683 extends RankStrategyBasic {
                 double conver = Double.parseDouble(feature.getOrDefault("ad_conversion_" + time, "0"));
                 double income = Double.parseDouble(feature.getOrDefault("ad_income_" + time, "0"));
                 double cpc = NumUtil.div(income, click);
-                double ctr = NumUtil.divSmoothV1(click, view, WILSON_ZSCORE);
-                double ctcvr = NumUtil.divSmoothV1(conver, view, WILSON_ZSCORE);
+                double ctr = NumUtil.divSmoothV2(click, view, CTR_SMOOTH_BETA_FACTOR);
+                double ctcvr = NumUtil.divSmoothV2(conver, view, CTCVR_SMOOTH_BETA_FACTOR);
                 double ecpm = ctr * cpc * 1000;
                 cidFeatureMap.put(prefix + "_" + time + "_ctr", String.valueOf(ctr));
                 cidFeatureMap.put(prefix + "_" + time + "_ctcvr", String.valueOf(ctcvr));
-                cidFeatureMap.put(prefix + "_" + time + "_cvr", String.valueOf(NumUtil.divSmoothV1(conver, click, WILSON_ZSCORE)));
+                cidFeatureMap.put(prefix + "_" + time + "_cvr", String.valueOf(NumUtil.divSmoothV2(conver, click, CVR_SMOOTH_BETA_FACTOR)));
                 cidFeatureMap.put(prefix + "_" + time + "_conver", String.valueOf(conver));
                 cidFeatureMap.put(prefix + "_" + time + "_ecpm", String.valueOf(ecpm));
 
@@ -365,12 +367,12 @@ public class RankStrategyBy683 extends RankStrategyBasic {
                 double conver = Double.parseDouble(feature.getOrDefault("ad_conversion_" + time, "0"));
                 double income = Double.parseDouble(feature.getOrDefault("ad_income_" + time, "0"));
                 double cpc = NumUtil.div(income, click);
-                double ctr = NumUtil.divSmoothV1(click, view, WILSON_ZSCORE);
-                double ctcvr = NumUtil.divSmoothV1(conver, view, WILSON_ZSCORE);
+                double ctr = NumUtil.divSmoothV2(click, view, CTR_SMOOTH_BETA_FACTOR);
+                double ctcvr = NumUtil.divSmoothV2(conver, view, CTCVR_SMOOTH_BETA_FACTOR);
                 double ecpm = ctr * cpc * 1000;
                 cidFeatureMap.put(prefix + "_" + time + "_ctr", String.valueOf(ctr));
                 cidFeatureMap.put(prefix + "_" + time + "_ctcvr", String.valueOf(ctcvr));
-                cidFeatureMap.put(prefix + "_" + time + "_cvr", String.valueOf(NumUtil.divSmoothV1(conver, click, WILSON_ZSCORE)));
+                cidFeatureMap.put(prefix + "_" + time + "_cvr", String.valueOf(NumUtil.divSmoothV2(conver, click, CVR_SMOOTH_BETA_FACTOR)));
                 cidFeatureMap.put(prefix + "_" + time + "_conver", String.valueOf(conver));
                 cidFeatureMap.put(prefix + "_" + time + "_ecpm", String.valueOf(ecpm));
 
@@ -461,10 +463,10 @@ public class RankStrategyBy683 extends RankStrategyBasic {
             double conver = Double.parseDouble(d1Feature.getOrDefault("ad_conversion_" + prefix, "0"));
             double income = Double.parseDouble(d1Feature.getOrDefault("ad_income_" + prefix, "0"));
             double cpc = NumUtil.div(income, click);
-            double ctr = NumUtil.divSmoothV1(click, view, WILSON_ZSCORE);
+            double ctr = NumUtil.divSmoothV2(click, view, CTR_SMOOTH_BETA_FACTOR);
             featureMap.put("d1_feature_" + prefix + "_ctr", String.valueOf(ctr));
-            featureMap.put("d1_feature_" + prefix + "_ctcvr", String.valueOf(NumUtil.divSmoothV1(conver, view, WILSON_ZSCORE)));
-            featureMap.put("d1_feature_" + prefix + "_cvr", String.valueOf(NumUtil.divSmoothV1(conver, click, WILSON_ZSCORE)));
+            featureMap.put("d1_feature_" + prefix + "_ctcvr", String.valueOf(NumUtil.divSmoothV2(conver, view, CTCVR_SMOOTH_BETA_FACTOR)));
+            featureMap.put("d1_feature_" + prefix + "_cvr", String.valueOf(NumUtil.divSmoothV2(conver, click, CVR_SMOOTH_BETA_FACTOR)));
             featureMap.put("d1_feature_" + prefix + "_conver", String.valueOf(conver));
             featureMap.put("d1_feature_" + prefix + "_ecpm", String.valueOf(ctr * cpc * 1000));
         }
@@ -609,7 +611,7 @@ public class RankStrategyBy683 extends RankStrategyBasic {
             return;
         }
         synchronized (this) {
-            String bucketFile = "20250113_ad_bucket_688.txt";
+            String bucketFile = "20240718_ad_bucket_688.txt";
             InputStream resourceStream = RankStrategyBy683.class.getClassLoader().getResourceAsStream(bucketFile);
             if (resourceStream != null) {
                 try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceStream))) {