Browse Source

feat:添加人群选择实验

zhaohaipeng 4 months ago
parent
commit
e3dfd3270c
23 changed files with 323 additions and 22 deletions
  1. 1 1
      ad-engine-commons/pom.xml
  2. 1 1
      ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/enums/ExpCodeEnum.java
  3. 1 1
      ad-engine-server/src/main/resources/application-dev.yml
  4. 2 1
      ad-engine-server/src/main/resources/application.yml
  5. 10 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/feature/FeatureService.java
  6. 4 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/log/LogHubService.java
  7. 31 5
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/log/impl/LogHubServiceImpl.java
  8. 0 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/config/AbConfig.java
  9. 0 6
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/AbTestConfigContainer.java
  10. 0 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/ThresholdModelContainer.java
  11. 9 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/impl/PredictModelServiceImpl.java
  12. 0 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/AddThresholdPredictModel.java
  13. 0 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/BasicThresholdPredictModel.java
  14. 0 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/MultiplyThresholdPredictModel.java
  15. 0 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/RandomPredict667Model.java
  16. 0 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/ScoreThresholdPredictModel.java
  17. 58 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/ConvertUtil.java
  18. 68 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/PredictContext.java
  19. 26 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/PredictLogParam.java
  20. 111 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/PredictServiceV2.java
  21. BIN
      xgboost351/data/XGBoostClassificationModel
  22. 0 0
      xgboost351/metadata/_SUCCESS
  23. 1 0
      xgboost351/metadata/part-00000

+ 1 - 1
ad-engine-commons/pom.xml

@@ -97,7 +97,7 @@
         <dependency>
             <groupId>ml.dmlc</groupId>
             <artifactId>xgboost4j-spark_2.12</artifactId>
-            <version>1.7.6</version>
+            <version>2.0.1</version>
             <exclusions>
                 <exclusion>
                     <artifactId>scala-library</artifactId>

+ 1 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/enums/ExpCodeEnum.java → ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/enums/ExpCodeEnum.java

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.ad.engine.service.predict.enums;
+package com.tzld.piaoquan.ad.engine.commons.enums;
 
 public enum ExpCodeEnum {
 

+ 1 - 1
ad-engine-server/src/main/resources/application-dev.yml

@@ -4,7 +4,7 @@ server:
 eureka:
   client:
     serviceUrl:
-      defaultZone: http://deveureka-internal.piaoquantv.com/eureka/
+      defaultZone: http://127.0.0.1:7000/eureka/
 
 datalog: .
 

+ 2 - 1
ad-engine-server/src/main/resources/application.yml

@@ -77,7 +77,7 @@ mybatis:
   configuration:
     log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
 
-datalog: /datalog
+datalog: /Users/zhao/Desktop/tzld/Code/Java/ad-engine
 
 #datalog: /Users/zhao/Desktop/Code/Java/ad-engine
 
@@ -95,6 +95,7 @@ aliyun:
       info: info-log
       error: error-log
       statistics: statistics-log
+      crowdChooseStatistics: crowd-choose-statistics-log
       landingTypeFilter: landingpagetype-filter-error-log
       adPackageData: ad-package-data
     topic:

+ 10 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/feature/FeatureService.java

@@ -79,6 +79,16 @@ public class FeatureService {
             protos.add(genWithMid("alg_mid_feature_return_tags", param.getMid()));
             protos.add(genWithMid("alg_mid_feature_share_tags", param.getMid()));
         }
+        return this.invokeFeatureService(protos);
+    }
+
+    public Feature getPredictFeature(String mid) {
+        List<FeatureKeyProto> protos = new ArrayList<>();
+        protos.add(genWithMid("alg_ad_crowd_choose_feature", mid));
+        return this.invokeFeatureService(protos);
+    }
+
+    public Feature invokeFeatureService(List<FeatureKeyProto> protos) {
 
         Map<String, String> featureMap = remoteService.getFeature(protos);
         featureMap = this.featureStrCover(featureMap);

+ 4 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/log/LogHubService.java

@@ -3,11 +3,15 @@ package com.tzld.piaoquan.ad.engine.service.log;
 import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
 import com.tzld.piaoquan.ad.engine.commons.dto.AdPlatformCreativeDTO;
 import com.tzld.piaoquan.ad.engine.commons.param.RecommendRequestParam;
+import com.tzld.piaoquan.ad.engine.service.predict.v2.PredictContext;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
 
 import java.util.List;
+import java.util.Map;
 
 public interface LogHubService {
 
     void scoreLogUpload(ScoreParam param, List<AdPlatformCreativeDTO> adIdList, List<AdRankItem> rankItems, RecommendRequestParam requestParam, String abCode);
+
+    void crowdChooseLogUpload(PredictContext context);
 }

+ 31 - 5
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/log/impl/LogHubServiceImpl.java

@@ -4,10 +4,11 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Sets;
 import com.tzld.commons.aliyun.log.AliyunLogManager;
-import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
-import com.tzld.piaoquan.ad.engine.service.log.LogHubService;
 import com.tzld.piaoquan.ad.engine.commons.dto.AdPlatformCreativeDTO;
 import com.tzld.piaoquan.ad.engine.commons.param.RecommendRequestParam;
+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
+import com.tzld.piaoquan.ad.engine.service.log.LogHubService;
+import com.tzld.piaoquan.ad.engine.service.predict.v2.PredictContext;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRequestContext;
 import lombok.extern.slf4j.Slf4j;
@@ -30,10 +31,13 @@ public class LogHubServiceImpl implements LogHubService {
             TimeUnit.MINUTES, new LinkedBlockingDeque<>(), new ThreadPoolExecutor.CallerRunsPolicy());
 
     @Value("${aliyun.log.logstore.statistics}")
-    private String logStore;
+    private String scoreStatisticsLogStore;
     @Value("${aliyun.log.project}")
     private String project;
 
+    @Value("${aliyun.log.logstore.crowdChooseStatistics}")
+    private String crowdChooseStatisticsLogStore;
+
     @Autowired
     private AliyunLogManager aliyunLogManager;
 
@@ -110,8 +114,30 @@ public class LogHubServiceImpl implements LogHubService {
                 logMap.put("allfeature", JSON.toJSONString(top1.getFeatureMap()));
                 logMap.put("metafeature", JSON.toJSONString(top1.getMetaFeatureMap()));
 
-                aliyunLogManager.sendLog(project, logStore, "", logMap);
+                aliyunLogManager.sendLog(project, scoreStatisticsLogStore, "", logMap);
+            }
+        });
+    }
+
+    @Override
+    public void crowdChooseLogUpload(PredictContext context) {
+        logUploadThreadPool.execute(new Runnable() {
+            @Override
+            public void run() {
+                Map<String, Object> logMap = new HashMap<>();
+                logMap.put("mid", context.getMid());
+                logMap.put("vid", context.getVideoId());
+                logMap.put("apptype", context.getAppType());
+                logMap.put("abcode", context.getAdAbCode());
+                logMap.put("pqtid", context.getPqtId());
+                logMap.put("expid", context.getLogParam().getExpId());
+                logMap.put("score", context.getLogParam().getScore());
+                logMap.put("allfeature", JSON.toJSONString(context.getLogParam().getAllFeature()));
+                logMap.put("metafeature", JSON.toJSONString(context.getLogParam().getMetaFeature()));
+                logMap.put("scoremap", JSON.toJSONString(context.getLogParam().getScoreMap()));
+
+                aliyunLogManager.sendLog(project, crowdChooseStatisticsLogStore, "", logMap);
             }
         });
     }
-}
+}

+ 0 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/config/AbConfig.java

@@ -3,7 +3,6 @@ package com.tzld.piaoquan.ad.engine.service.predict.config;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.google.gson.Gson;
-import com.tzld.piaoquan.ad.engine.service.predict.model.threshold.ThresholdPredictModel;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;

+ 0 - 6
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/AbTestConfigContainer.java

@@ -1,10 +1,7 @@
 package com.tzld.piaoquan.ad.engine.service.predict.container;
 
 import com.alibaba.fastjson.JSONObject;
-import com.tzld.piaoquan.ad.engine.commons.feign.CommonResponse;
 import com.tzld.piaoquan.ad.engine.commons.feign.longvideo.abtest.LongVideoFeign;
-import com.tzld.piaoquan.ad.engine.commons.feign.longvideo.abtest.request.AbTestConfigRequest;
-import com.tzld.piaoquan.ad.engine.commons.math.Tuple;
 import com.tzld.piaoquan.ad.engine.service.predict.impl.PredictModelServiceImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -12,10 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.PostConstruct;
 import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 
 @Component
 public class AbTestConfigContainer {

+ 0 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/container/ThresholdModelContainer.java

@@ -1,6 +1,5 @@
 package com.tzld.piaoquan.ad.engine.service.predict.container;
 
-import com.tdunning.math.stats.Centroid;
 import com.tzld.piaoquan.ad.engine.service.predict.model.threshold.ThresholdPredictModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

+ 9 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/impl/PredictModelServiceImpl.java

@@ -7,6 +7,7 @@ import com.tzld.piaoquan.ad.engine.commons.enums.AppTypeEnum;
 import com.tzld.piaoquan.ad.engine.commons.enums.RedisPrefixEnum;
 import com.tzld.piaoquan.ad.engine.commons.redis.AdRedisHelper;
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
+import com.tzld.piaoquan.ad.engine.commons.util.AbUtil;
 import com.tzld.piaoquan.ad.engine.commons.util.DateUtils;
 import com.tzld.piaoquan.ad.engine.service.predict.PredictModelService;
 import com.tzld.piaoquan.ad.engine.service.predict.config.AbConfig;
@@ -21,6 +22,8 @@ import com.tzld.piaoquan.ad.engine.service.predict.param.RoiThresholdPredictMode
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.request.RoiPredictModelRequestParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.request.ThresholdPredictModelRequestParam;
+import com.tzld.piaoquan.ad.engine.service.predict.v2.ConvertUtil;
+import com.tzld.piaoquan.ad.engine.service.predict.v2.PredictServiceV2;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -55,6 +58,9 @@ public class PredictModelServiceImpl implements PredictModelService {
     @Autowired
     RoiModelConfig roiModelConfig;
 
+    @Autowired
+    private PredictServiceV2 predictServiceV2;
+
     @Value("${ad.predict.share0.exp.code:000}")
     private String adPredictNoShareUserExpCode;
 
@@ -219,6 +225,9 @@ public class PredictModelServiceImpl implements PredictModelService {
                 }
             }
 
+            if (AbUtil.isInAbExp(expCodes, requestParam.getAppType(), requestParam.getNewExpGroup(), "713")){
+                return predictServiceV2.adPredict(ConvertUtil.predictParam2Context(requestParam));
+            }
 
             // 市-中文
             requestParam.setRegion(requestParam.getRegion().replace("省", ""));

+ 0 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/AddThresholdPredictModel.java

@@ -2,7 +2,6 @@ package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
 
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
-import com.tzld.piaoquan.ad.engine.commons.util.TimerWatchUtil;
 import com.tzld.piaoquan.ad.engine.service.predict.calculator.ThresholdPredictCalculator;
 import com.tzld.piaoquan.ad.engine.service.predict.helper.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdCalculateParam;

+ 0 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/BasicThresholdPredictModel.java

@@ -1,7 +1,6 @@
 package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
-import com.tzld.piaoquan.ad.engine.commons.util.TimerWatchUtil;
 import com.tzld.piaoquan.ad.engine.service.predict.calculator.ThresholdPredictCalculator;
 import com.tzld.piaoquan.ad.engine.service.predict.helper.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdCalculateParam;

+ 0 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/MultiplyThresholdPredictModel.java

@@ -1,7 +1,6 @@
 package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
-import com.tzld.piaoquan.ad.engine.commons.util.TimerWatchUtil;
 import com.tzld.piaoquan.ad.engine.service.predict.calculator.ThresholdPredictCalculator;
 import com.tzld.piaoquan.ad.engine.service.predict.helper.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdCalculateParam;

+ 0 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/RandomPredict667Model.java

@@ -1,6 +1,5 @@
 package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
-import com.tzld.piaoquan.ad.engine.commons.util.DateUtils;
 import com.tzld.piaoquan.ad.engine.service.predict.container.RandWContainer;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import org.slf4j.Logger;

+ 0 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/ScoreThresholdPredictModel.java

@@ -2,7 +2,6 @@ package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
 import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
-import com.tzld.piaoquan.ad.engine.commons.util.TimerWatchUtil;
 import com.tzld.piaoquan.ad.engine.service.predict.config.AdOutV1OnlineWeightConfig;
 import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.container.ThresholdModelContainer;

+ 58 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/ConvertUtil.java

@@ -0,0 +1,58 @@
+package com.tzld.piaoquan.ad.engine.service.predict.v2;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.tzld.piaoquan.ad.engine.service.predict.param.request.ThresholdPredictModelRequestParam;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+@Slf4j
+public class ConvertUtil {
+
+    public static PredictContext predictParam2Context(ThresholdPredictModelRequestParam param) {
+        PredictContext context = new PredictContext();
+        context.setMid(param.getMid());
+        context.setVideoId(Optional.ofNullable(param.getVideoId()).map(Object::toString).orElse(""));
+        context.setAppType(Optional.ofNullable(param.getAppType()).map(Object::toString).orElse(""));
+        context.setAdAbCode(param.getAbTestCode());
+
+        context.setRegion(param.getRegion());
+        context.setCity(param.getCity());
+        context.setPqtId(param.getPqtId());
+        context.setUserExternalSource(param.getUserExternalSource());
+        context.setShareLayer(param.getShareLayer());
+        context.setMachineInfo(param.getMachineInfo());
+
+        JSONObject abExpInfo = param.getAbExpInfo();
+        Map<String, JSONObject> expConfigMap = ConvertUtil.parseAbTest002Info(abExpInfo);
+        context.setExpCodeSet(expConfigMap.keySet());
+        context.setExpConfigMap(expConfigMap);
+
+        return context;
+    }
+
+
+    private static Map<String, JSONObject> parseAbTest002Info(JSONObject abExpInfo) {
+        Map<String, JSONObject> abTest002Info = new HashMap<>();
+        try {
+            List<JSONObject> abTest002 = abExpInfo.getJSONArray("ab_test002").toJavaObject(new TypeReference<List<JSONObject>>() {
+            });
+
+            for (JSONObject json : abTest002) {
+                String expCode = json.getString("abExpCode");
+                JSONObject configValue = json.getJSONObject("configValue");
+                abTest002Info.put(expCode, configValue);
+            }
+
+        } catch (Exception e) {
+            log.error("ConvertUtil解析广告层实验配置异常: ", e);
+        }
+
+        return abTest002Info;
+    }
+
+}

+ 68 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/PredictContext.java

@@ -0,0 +1,68 @@
+package com.tzld.piaoquan.ad.engine.service.predict.v2;
+
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.piaoquan.ad.engine.commons.param.MachineInfoParam;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PredictContext {
+
+    private String mid;
+
+    private String videoId;
+
+    private String appType;
+
+    /**
+     * 用户在广告层所属的实验组
+     */
+    private String adAbCode;
+
+    /**
+     * 用户命中的广告层所有实验
+     */
+    private Set<String> expCodeSet = new HashSet<>();
+
+    private Map<String, JSONObject> expConfigMap = new HashMap<>();
+
+    /**
+     * 省份
+     */
+    private String region;
+
+    /**
+     * 城市
+     */
+    private String city;
+
+    private String pqtId;
+
+    /**
+     * 设备信息
+     */
+    MachineInfoParam machineInfo = new MachineInfoParam();
+
+    private String userExternalSource;
+
+    /**
+     * 分享所属层
+     * <br />
+     * 1. firstLayer: 首层
+     * <br />
+     * 2. otherLayer: 裂变层
+     */
+    private String shareLayer;
+
+    private PredictLogParam logParam = new PredictLogParam();
+}

+ 26 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/PredictLogParam.java

@@ -0,0 +1,26 @@
+package com.tzld.piaoquan.ad.engine.service.predict.v2;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PredictLogParam {
+
+    private String expId;
+
+    private Map<String, Double> allFeature = new HashMap<>();
+
+    private Map<String, Map<String, String>> metaFeature = new HashMap<>();
+
+    private Double score;
+
+    private Map<String, Double> scoreMap = new HashMap<>();
+}

+ 111 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/v2/PredictServiceV2.java

@@ -0,0 +1,111 @@
+package com.tzld.piaoquan.ad.engine.service.predict.v2;
+
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
+import com.tzld.piaoquan.ad.engine.commons.util.NumUtil;
+import com.tzld.piaoquan.ad.engine.service.feature.Feature;
+import com.tzld.piaoquan.ad.engine.service.feature.FeatureService;
+import com.tzld.piaoquan.ad.engine.service.log.LogHubService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class PredictServiceV2 {
+
+    @Autowired
+    private FeatureService featureService;
+    @Autowired
+    private LogHubService logHubService;
+
+    @ApolloJsonValue("${exp.713.config:{}}")
+    private Map<String, Double> exp713Config;
+
+    public Map<String, Object> adPredict(PredictContext context) {
+
+        Feature feature = featureService.getPredictFeature(context.getMid());
+        Map<String, Map<String, String>> userFeature = feature.getUserFeature();
+
+        Map<String, String> featureMap = userFeature.getOrDefault("alg_ad_crowd_choose_feature", new HashMap<>());
+
+        boolean isShowAd = false;
+
+        context.getLogParam().setExpId("713");
+
+        // 没有特征为新用户,随机出广告
+        if (MapUtils.isEmpty(featureMap)) {
+            double newUserShowAdRate = exp713Config.getOrDefault("newUserShowAdRate", 1d);
+            double randomRate = Math.random();
+            if (randomRate < newUserShowAdRate) {
+                isShowAd = true;
+                context.getLogParam().getScoreMap().put("newUserShowAdRate", newUserShowAdRate);
+                context.getLogParam().getScoreMap().put("randomRate", randomRate);
+            }
+        } else {
+            context.getLogParam().getMetaFeature().putAll(userFeature);
+            for (Map.Entry<String, String> entry : featureMap.entrySet()) {
+                context.getLogParam().getAllFeature().put(entry.getKey(), Double.parseDouble(entry.getValue()));
+            }
+
+            // 获取需要的特征值
+            double showAdClickPv = Double.parseDouble(featureMap.getOrDefault("show_ad_click_pv", "0"));
+            double noShowAdClickPv = Double.parseDouble(featureMap.getOrDefault("no_show_ad_click_pv", "0"));
+            double showAdIncome = Double.parseDouble(featureMap.getOrDefault("show_ad_income", "0"));
+            double showAdSharePv = Double.parseDouble(featureMap.getOrDefault("show_ad_share_pv", "0"));
+            double noShowAdSharePv = Double.parseDouble(featureMap.getOrDefault("no_show_ad_share_pv", "0"));
+            double showAdNewReturnPv = Double.parseDouble(featureMap.getOrDefault("show_ad_new_return_pv", "0"));
+            double noShowAdNewReturnPv = Double.parseDouble(featureMap.getOrDefault("no_show_ad_new_return_pv", "0"));
+
+            // 计算中间过程值
+            double singleReturnAdIncome = NumUtil.div(showAdIncome, (showAdClickPv + noShowAdClickPv));
+            double showAdShareRate = NumUtil.div((showAdSharePv + 1), (showAdClickPv + 1));
+            double noShowAdShareRate = NumUtil.div((noShowAdSharePv + 1), (noShowAdClickPv + 1));
+            double returnDivShare = NumUtil.div((showAdNewReturnPv + noShowAdNewReturnPv + 1), (showAdSharePv + noShowAdSharePv + 1));
+
+            double alpha = exp713Config.getOrDefault("alpha", 0.1d);
+            double score = singleReturnAdIncome + ((showAdShareRate - noShowAdShareRate) * returnDivShare * alpha);
+
+            double showAdScoreThreshold = exp713Config.getOrDefault("showAdScoreThreshold", 0d);
+            if (score >= showAdScoreThreshold) {
+                isShowAd = true;
+            }
+
+            context.getLogParam().getScoreMap().put("singleReturnAdIncome", singleReturnAdIncome);
+            context.getLogParam().getScoreMap().put("showAdShareRate", showAdShareRate);
+            context.getLogParam().getScoreMap().put("noShowAdShareRate", noShowAdShareRate);
+            context.getLogParam().getScoreMap().put("returnDivShare", returnDivShare);
+            context.getLogParam().getScoreMap().put("score", score);
+            context.getLogParam().getScoreMap().put("alpha", alpha);
+            context.getLogParam().getScoreMap().put("showAdScoreThreshold", showAdScoreThreshold);
+            context.getLogParam().setScore(score);
+
+        }
+
+        logHubService.crowdChooseLogUpload(context);
+
+        if (isShowAd) {
+            Map<String, Object> rtnMap = rtnAdPredict();
+            rtnMap.putAll(context.getLogParam().getScoreMap());
+            return rtnMap;
+        } else {
+            return rtnNoAdPredict("713_exp");
+        }
+    }
+
+    private Map<String, Object> rtnNoAdPredict(String noAdStrategy) {
+        Map<String, Object> rtnMap = new HashMap<>();
+        rtnMap.put("ad_predict", 1);
+        rtnMap.put("no_ad_strategy", noAdStrategy);
+        return rtnMap;
+    }
+
+    private Map<String, Object> rtnAdPredict() {
+        Map<String, Object> rtnMap = new HashMap<>();
+        rtnMap.put("ad_predict", 1);
+        return rtnMap;
+    }
+}

BIN
xgboost351/data/XGBoostClassificationModel


+ 0 - 0
xgboost351/metadata/_SUCCESS


+ 1 - 0
xgboost351/metadata/part-00000

@@ -0,0 +1 @@
+{"class":"ml.dmlc.xgboost4j.scala.spark.XGBoostClassificationModel","timestamp":1724913235968,"sparkVersion":"3.3.1","uid":"xgbc_1beefd518e38","paramMap":{"evalMetric":"auc","missing":0.0,"minChildWeight":1.0,"maxDepth":5,"colsampleBytree":0.8,"labelCol":"label","nthread":1,"numRound":1000,"seed":2024,"scalePosWeight":1.0,"numWorkers":30,"objective":"binary:logistic","eta":0.01,"featuresCol":"features","gamma":0.0,"subsample":0.8},"defaultParamMap":{"useExternalMemory":false,"missing":"NaN","handleInvalid":"error","dmlcWorkerConnectRetry":5,"trackerConf":{"workerConnectionTimeout":0,"trackerImpl":"python","hostIp":"","pythonExec":""},"predictionCol":"prediction","rawPredictionCol":"rawPrediction","treeLimit":0,"labelCol":"label","allowNonZeroForMissing":false,"rabitTimeout":-1,"numRound":1,"nthread":1,"trainTestRatio":1.0,"seed":0,"numWorkers":1,"batchSize":32768,"featuresCol":"features","rabitRingReduceThreshold":32768,"probabilityCol":"probability"},"xgboostVersion":"1.7.6"}