Explorar el Código

增加新模型 修改校准

xueyiming hace 1 día
padre
commit
8e41315808

+ 10 - 3
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/helper/ModelUserLayerDataHelper.java

@@ -22,6 +22,8 @@ public class ModelUserLayerDataHelper {
     private static final String redisKey = "ad:engine:strategy:model_ctcvr_calibration_v1";
     private static final String keyFormat = "%s:%s:%s:%s:%s:%s:%s";
     private static final String SUM = "sum";
+    /** 曝光大于该阈值才使用当前层校准,否则回退下一层 */
+    private static final double MIN_CALIBRATION_EXPOSURE = 5000d;
 
     private volatile static Map<String, String> dataMap = Collections.emptyMap();
 
@@ -46,6 +48,7 @@ public class ModelUserLayerDataHelper {
     /**
      * 按粒度回退取校准数据,并返回命中的校准层:
      * l1=agent+customer 粒度,l2=profession 粒度,l3=layer 粒度。
+     * 当前层曝光必须大于 {@link #MIN_CALIBRATION_EXPOSURE},否则回退下一层。
      * key/value 均以 ':' 分隔;
      * value: exposure_cnt:conversion_cnt:pred_conversion_cnt:real_ctcvr:pred_ctcvr:copc
      */
@@ -62,21 +65,21 @@ public class ModelUserLayerDataHelper {
 
             String key = String.format(keyFormat, model, landingPageType, targetingConversion, layer, profession, agentId, customerId);
             CalibrationData data = parseValue(dataMap.get(key));
-            if (data != null) {
+            if (isExposureEnough(data)) {
                 data.setLayer("l1");
                 return data;
             }
 
             key = String.format(keyFormat, model, landingPageType, targetingConversion, layer, profession, SUM, SUM);
             data = parseValue(dataMap.get(key));
-            if (data != null) {
+            if (isExposureEnough(data)) {
                 data.setLayer("l2");
                 return data;
             }
 
             key = String.format(keyFormat, model, landingPageType, targetingConversion, layer, SUM, SUM, SUM);
             data = parseValue(dataMap.get(key));
-            if (data != null) {
+            if (isExposureEnough(data)) {
                 data.setLayer("l3");
                 return data;
             }
@@ -84,6 +87,10 @@ public class ModelUserLayerDataHelper {
         return null;
     }
 
+    private static boolean isExposureEnough(CalibrationData data) {
+        return data != null && data.getExposureCnt() != null && data.getExposureCnt() > MIN_CALIBRATION_EXPOSURE;
+    }
+
     private static CalibrationData parseValue(String value) {
         if (value == null || value.trim().isEmpty()) {
             return null;

+ 5 - 8
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBy898.java

@@ -1148,18 +1148,15 @@ public class RankStrategyBy898 extends RankStrategyBasic {
 
                 Double copc = calibData.getCopc();
                 item.getExt().put("modelCtcvrCalibrationLayer", calibData.getLayer());
-                item.getScoreMap().put("modelCtcvrCalibrationExposureCnt", calibData.getExposureCnt());
-                item.getScoreMap().put("modelCtcvrCalibrationConversionCnt", calibData.getConversionCnt());
-                item.getScoreMap().put("modelCtcvrCalibrationPredConversionCnt", calibData.getPredConversionCnt());
-                item.getScoreMap().put("modelCtcvrCalibrationRealCtcvr", calibData.getRealCtcvr());
-                item.getScoreMap().put("modelCtcvrCalibrationPredCtcvr", calibData.getPredCtcvr());
+                item.getExt().put("modelCtcvrCalibrationData", JSONObject.toJSONString(calibData));
                 item.getScoreMap().put("modelCtcvrCalibrationPrimitiveCopc", copc);
-                copc = Math.max(0.01d, Math.min(copc, 5.0d));
+                // 校准系数 = (1 + copc) / 2,最终截断到 [0.3, 3]
+                double coefficient = Math.max(0.3d, Math.min((1.0d + copc) / 2.0d, 3.0d));
 
-                double score = item.getLrScore() * copc;
+                double score = item.getLrScore() * coefficient;
 
                 item.getScoreMap().put("modelCtcvrCalibrationScore", score);
-                item.getScoreMap().put("modelCtcvrCalibrationUseCopc", copc);
+                item.getScoreMap().put("modelCtcvrCalibrationUseCopc", coefficient);
                 item.getScoreMap().put("ctcvrScore", score);
                 item.setLrScore(score);
             } catch (Exception e) {

+ 5 - 8
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBy899.java

@@ -1151,18 +1151,15 @@ public class RankStrategyBy899 extends RankStrategyBasic {
 
                 Double copc = calibData.getCopc();
                 item.getExt().put("modelCtcvrCalibrationLayer", calibData.getLayer());
-                item.getScoreMap().put("modelCtcvrCalibrationExposureCnt", calibData.getExposureCnt());
-                item.getScoreMap().put("modelCtcvrCalibrationConversionCnt", calibData.getConversionCnt());
-                item.getScoreMap().put("modelCtcvrCalibrationPredConversionCnt", calibData.getPredConversionCnt());
-                item.getScoreMap().put("modelCtcvrCalibrationRealCtcvr", calibData.getRealCtcvr());
-                item.getScoreMap().put("modelCtcvrCalibrationPredCtcvr", calibData.getPredCtcvr());
+                item.getExt().put("modelCtcvrCalibrationData", JSONObject.toJSONString(calibData));
                 item.getScoreMap().put("modelCtcvrCalibrationPrimitiveCopc", copc);
-                copc = Math.max(0.01d, Math.min(copc, 5.0d));
+                // 校准系数 = (1 + copc) / 2,最终截断到 [0.3, 3]
+                double coefficient = Math.max(0.3d, Math.min((1.0d + copc) / 2.0d, 3.0d));
 
-                double score = item.getLrScore() * copc;
+                double score = item.getLrScore() * coefficient;
 
                 item.getScoreMap().put("modelCtcvrCalibrationScore", score);
-                item.getScoreMap().put("modelCtcvrCalibrationUseCopc", copc);
+                item.getScoreMap().put("modelCtcvrCalibrationUseCopc", coefficient);
                 item.getScoreMap().put("ctcvrScore", score);
                 item.setLrScore(score);
             } catch (Exception e) {

+ 5 - 8
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBy900.java

@@ -1224,18 +1224,15 @@ public class RankStrategyBy900 extends RankStrategyBasic {
 
                 Double copc = calibData.getCopc();
                 item.getExt().put("modelCtcvrCalibrationLayer", calibData.getLayer());
-                item.getScoreMap().put("modelCtcvrCalibrationExposureCnt", calibData.getExposureCnt());
-                item.getScoreMap().put("modelCtcvrCalibrationConversionCnt", calibData.getConversionCnt());
-                item.getScoreMap().put("modelCtcvrCalibrationPredConversionCnt", calibData.getPredConversionCnt());
-                item.getScoreMap().put("modelCtcvrCalibrationRealCtcvr", calibData.getRealCtcvr());
-                item.getScoreMap().put("modelCtcvrCalibrationPredCtcvr", calibData.getPredCtcvr());
+                item.getExt().put("modelCtcvrCalibrationData", JSONObject.toJSONString(calibData));
                 item.getScoreMap().put("modelCtcvrCalibrationPrimitiveCopc", copc);
-                copc = Math.max(0.01d, Math.min(copc, 5.0d));
+                // 校准系数 = (1 + copc) / 2,最终截断到 [0.3, 3]
+                double coefficient = Math.max(0.3d, Math.min((1.0d + copc) / 2.0d, 3.0d));
 
-                double score = item.getLrScore() * copc;
+                double score = item.getLrScore() * coefficient;
 
                 item.getScoreMap().put("modelCtcvrCalibrationScore", score);
-                item.getScoreMap().put("modelCtcvrCalibrationUseCopc", copc);
+                item.getScoreMap().put("modelCtcvrCalibrationUseCopc", coefficient);
                 item.getScoreMap().put("ctcvrScore", score);
                 item.setLrScore(score);
             } catch (Exception e) {