|
@@ -1,134 +1,134 @@
|
|
|
-package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
|
|
|
-
|
|
|
-import com.alibaba.fastjson.JSONArray;
|
|
|
-import com.alibaba.fastjson.JSONObject;
|
|
|
-import com.tzld.piaoquan.ad.engine.commons.score.AdConfig;
|
|
|
-import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
|
|
|
-import com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils;
|
|
|
-import com.tzld.piaoquan.ad.engine.commons.util.CommonCollectionUtils;
|
|
|
-import com.tzld.piaoquan.ad.engine.commons.util.TimerWatchUtil;
|
|
|
-import com.tzld.piaoquan.ad.engine.service.predict.container.PredictPidContainer;
|
|
|
-import com.tzld.piaoquan.ad.engine.service.predict.impl.PredictModelServiceImpl;
|
|
|
-import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
|
|
|
-import com.tzld.piaoquan.ad.engine.service.remote.FeatureRemoteService;
|
|
|
-import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
|
|
|
-import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRequestContext;
|
|
|
-import com.tzld.piaoquan.recommend.feature.domain.ad.base.UserAdFeature;
|
|
|
-import org.slf4j.Logger;
|
|
|
-import org.slf4j.LoggerFactory;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.beans.factory.annotation.Value;
|
|
|
-import org.springframework.stereotype.Component;
|
|
|
-
|
|
|
-import java.time.LocalDateTime;
|
|
|
-import java.time.format.DateTimeFormatter;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-
|
|
|
-import static com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils.BREAK_CONFIG;
|
|
|
-
|
|
|
-@Component
|
|
|
-public class ScoreV2ThresholdPredictModel extends ThresholdPredictModel {
|
|
|
- private final static Logger log = LoggerFactory.getLogger(ScoreV2ThresholdPredictModel.class);
|
|
|
- @Autowired
|
|
|
- private FeatureRemoteService featureRemoteService;
|
|
|
-
|
|
|
- @Value("${ad.predict.threshold:1}")
|
|
|
- private double threshold;
|
|
|
- @Value("${ad.model.pid.type:0.0}")
|
|
|
- private double pidType;
|
|
|
-
|
|
|
- @Override
|
|
|
- String initName() {
|
|
|
- return "modelV2";
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Map<String, Object> predict(ThresholdPredictModelParam modelParam) {
|
|
|
-
|
|
|
- UserAdFeature userAdFeature = featureRemoteService.getUserAdFeature(modelParam.getMid());
|
|
|
- if (userAdFeature == null) {
|
|
|
- userAdFeature = new UserAdFeature();
|
|
|
- }
|
|
|
- List<AdRankItem> rankItems = featureRemoteService.getAllAdFeatureList(CommonCollectionUtils.toList(AdConfig.getAdIds(), id -> id.toString()));
|
|
|
-
|
|
|
- // scoreParam
|
|
|
- AdRequestContext context = new AdRequestContext();
|
|
|
- context.setApptype(modelParam.getAppType().toString());
|
|
|
- context.setMachineinfoBrand(modelParam.getMachineInfo().getBrand());
|
|
|
- context.setMachineinfoModel(modelParam.getMachineInfo().getModel());
|
|
|
- context.setMachineinfoSdkversion(modelParam.getMachineInfo().getSdkVersion());
|
|
|
- context.setMachineinfoWchatversion(modelParam.getMachineInfo().getWeChatVersion());
|
|
|
- LocalDateTime date = LocalDateTime.now();
|
|
|
- context.setHour(date.getHour() + "");
|
|
|
- context.setDay(date.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
|
|
|
- context.setWeek(date.getDayOfWeek().getValue() + "");
|
|
|
-
|
|
|
- ScoreParam scoreParam = new ScoreParam();
|
|
|
- scoreParam.setRequestContext(context);
|
|
|
- scoreParam.getRequestContext().setRegion(modelParam.getRegion().replace("省", ""));
|
|
|
- scoreParam.getRequestContext().setCity(modelParam.getCity().replace("市", ""));
|
|
|
- scoreParam.setVideoId(modelParam.getVideoId());
|
|
|
- scoreParam.setMid(modelParam.getMid());
|
|
|
- scoreParam.setUid("");
|
|
|
- scoreParam.setProvince(modelParam.getRegion());
|
|
|
- scoreParam.setCity(modelParam.getCity());
|
|
|
- scoreParam.setExtraParam(modelParam.getExtraParam());
|
|
|
-
|
|
|
- List<AdRankItem> scoreResult = ScorerUtils
|
|
|
- .getScorerPipeline(BREAK_CONFIG)
|
|
|
- .scoring(scoreParam, userAdFeature, rankItems);
|
|
|
-
|
|
|
- // 找出ctr*cvr最大的
|
|
|
- double max = -1;
|
|
|
- AdRankItem maxItem = null;
|
|
|
- for (int i = 0; i < scoreResult.size(); i++) {
|
|
|
- AdRankItem item = scoreResult.get(i);
|
|
|
- double ctrCvr = item.getCtr() * item.getCvr();
|
|
|
- if (ctrCvr > max) {
|
|
|
- max = ctrCvr;
|
|
|
- maxItem = item;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- double realThreshold=Double.parseDouble(
|
|
|
- scoreParam.getExtraParam().getOrDefault("ScoreV2ThresholdPredict_"+modelParam.getAppType(),threshold).toString()
|
|
|
- );
|
|
|
- int adPredict;
|
|
|
- //加入pid逻辑
|
|
|
- if(pidType>1){
|
|
|
- realThreshold=realThreshold+ PredictPidContainer.getPidLambda(
|
|
|
- scoreParam.getExtraParam().getOrDefault("predict_test_id","default")+"_"+modelParam.getAppType());
|
|
|
- }else if(pidType>=0){
|
|
|
- realThreshold=PredictPidContainer.getLatestThreshold(
|
|
|
- scoreParam.getExtraParam().getOrDefault("predict_test_id","default")+"_"+modelParam.getAppType());
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if (maxItem != null && maxItem.getScore() < realThreshold) {
|
|
|
- // If final score is below threshold, do not show the ad
|
|
|
- adPredict = 1;
|
|
|
- } else {
|
|
|
- // Otherwise, show the ad
|
|
|
- adPredict = 2;
|
|
|
- }
|
|
|
- if(maxItem != null){
|
|
|
-// ThresholdModelContainer.mergingDigestAddScore(modelParam.getAppType(),maxItem.getScore());
|
|
|
- //删除多余打印
|
|
|
- maxItem.setItemFeature(null);
|
|
|
- maxItem.setLrSampleString(null);
|
|
|
- maxItem.setLrSampleStringOrgin(null);
|
|
|
- log.info("svc=ScoreV2ThresholdPredictModel_predict modelName=ScoreV2ThresholdPredictModel maxItem={} extraParam={} app_type={} realThreshold={}",
|
|
|
- JSONObject.toJSONString(maxItem), JSONObject.toJSONString(scoreParam.getExtraParam()),modelParam.getAppType(),realThreshold);
|
|
|
- }
|
|
|
-
|
|
|
- Map<String, Object> result = new HashMap<>();
|
|
|
- result.put("threshold", realThreshold);
|
|
|
- result.put("score", maxItem == null ? -1 : maxItem.getScore());
|
|
|
- result.put("ad_predict", adPredict);
|
|
|
-
|
|
|
-
|
|
|
- return result;
|
|
|
- }
|
|
|
-}
|
|
|
+//package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
|
|
|
+//
|
|
|
+//import com.alibaba.fastjson.JSONArray;
|
|
|
+//import com.alibaba.fastjson.JSONObject;
|
|
|
+//import com.tzld.piaoquan.ad.engine.commons.score.AdConfig;
|
|
|
+//import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
|
|
|
+//import com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils;
|
|
|
+//import com.tzld.piaoquan.ad.engine.commons.util.CommonCollectionUtils;
|
|
|
+//import com.tzld.piaoquan.ad.engine.commons.util.TimerWatchUtil;
|
|
|
+//import com.tzld.piaoquan.ad.engine.service.predict.container.PredictPidContainer;
|
|
|
+//import com.tzld.piaoquan.ad.engine.service.predict.impl.PredictModelServiceImpl;
|
|
|
+//import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
|
|
|
+//import com.tzld.piaoquan.ad.engine.service.remote.FeatureRemoteService;
|
|
|
+//import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
|
|
|
+//import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRequestContext;
|
|
|
+//import com.tzld.piaoquan.recommend.feature.domain.ad.base.UserAdFeature;
|
|
|
+//import org.slf4j.Logger;
|
|
|
+//import org.slf4j.LoggerFactory;
|
|
|
+//import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+//import org.springframework.beans.factory.annotation.Value;
|
|
|
+//import org.springframework.stereotype.Component;
|
|
|
+//
|
|
|
+//import java.time.LocalDateTime;
|
|
|
+//import java.time.format.DateTimeFormatter;
|
|
|
+//import java.util.HashMap;
|
|
|
+//import java.util.List;
|
|
|
+//import java.util.Map;
|
|
|
+//
|
|
|
+//import static com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils.BREAK_CONFIG;
|
|
|
+//
|
|
|
+//@Component
|
|
|
+//public class ScoreV2ThresholdPredictModel extends ThresholdPredictModel {
|
|
|
+// private final static Logger log = LoggerFactory.getLogger(ScoreV2ThresholdPredictModel.class);
|
|
|
+// @Autowired
|
|
|
+// private FeatureRemoteService featureRemoteService;
|
|
|
+//
|
|
|
+// @Value("${ad.predict.threshold:1}")
|
|
|
+// private double threshold;
|
|
|
+// @Value("${ad.model.pid.type:0.0}")
|
|
|
+// private double pidType;
|
|
|
+//
|
|
|
+// @Override
|
|
|
+// String initName() {
|
|
|
+// return "modelV2";
|
|
|
+// }
|
|
|
+//
|
|
|
+// @Override
|
|
|
+// public Map<String, Object> predict(ThresholdPredictModelParam modelParam) {
|
|
|
+//
|
|
|
+// UserAdFeature userAdFeature = featureRemoteService.getUserAdFeature(modelParam.getMid());
|
|
|
+// if (userAdFeature == null) {
|
|
|
+// userAdFeature = new UserAdFeature();
|
|
|
+// }
|
|
|
+// List<AdRankItem> rankItems = featureRemoteService.getAllAdFeatureList(CommonCollectionUtils.toList(AdConfig.getAdIds(), id -> id.toString()));
|
|
|
+//
|
|
|
+// // scoreParam
|
|
|
+// AdRequestContext context = new AdRequestContext();
|
|
|
+// context.setApptype(modelParam.getAppType().toString());
|
|
|
+// context.setMachineinfoBrand(modelParam.getMachineInfo().getBrand());
|
|
|
+// context.setMachineinfoModel(modelParam.getMachineInfo().getModel());
|
|
|
+// context.setMachineinfoSdkversion(modelParam.getMachineInfo().getSdkVersion());
|
|
|
+// context.setMachineinfoWchatversion(modelParam.getMachineInfo().getWeChatVersion());
|
|
|
+// LocalDateTime date = LocalDateTime.now();
|
|
|
+// context.setHour(date.getHour() + "");
|
|
|
+// context.setDay(date.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
|
|
|
+// context.setWeek(date.getDayOfWeek().getValue() + "");
|
|
|
+//
|
|
|
+// ScoreParam scoreParam = new ScoreParam();
|
|
|
+// scoreParam.setRequestContext(context);
|
|
|
+// scoreParam.getRequestContext().setRegion(modelParam.getRegion().replace("省", ""));
|
|
|
+// scoreParam.getRequestContext().setCity(modelParam.getCity().replace("市", ""));
|
|
|
+// scoreParam.setVideoId(modelParam.getVideoId());
|
|
|
+// scoreParam.setMid(modelParam.getMid());
|
|
|
+// scoreParam.setUid("");
|
|
|
+// scoreParam.setProvince(modelParam.getRegion());
|
|
|
+// scoreParam.setCity(modelParam.getCity());
|
|
|
+// scoreParam.setExtraParam(modelParam.getExtraParam());
|
|
|
+//
|
|
|
+// List<AdRankItem> scoreResult = ScorerUtils
|
|
|
+// .getScorerPipeline(BREAK_CONFIG)
|
|
|
+// .scoring(scoreParam, userAdFeature, rankItems);
|
|
|
+//
|
|
|
+// // 找出ctr*cvr最大的
|
|
|
+// double max = -1;
|
|
|
+// AdRankItem maxItem = null;
|
|
|
+// for (int i = 0; i < scoreResult.size(); i++) {
|
|
|
+// AdRankItem item = scoreResult.get(i);
|
|
|
+// double ctrCvr = item.getCtr() * item.getCvr();
|
|
|
+// if (ctrCvr > max) {
|
|
|
+// max = ctrCvr;
|
|
|
+// maxItem = item;
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// double realThreshold=Double.parseDouble(
|
|
|
+// scoreParam.getExtraParam().getOrDefault("ScoreV2ThresholdPredict_"+modelParam.getAppType(),threshold).toString()
|
|
|
+// );
|
|
|
+// int adPredict;
|
|
|
+// //加入pid逻辑
|
|
|
+// if(pidType>1){
|
|
|
+// realThreshold=realThreshold+ PredictPidContainer.getPidLambda(
|
|
|
+// scoreParam.getExtraParam().getOrDefault("predict_test_id","default")+"_"+modelParam.getAppType());
|
|
|
+// }else if(pidType>=0){
|
|
|
+// realThreshold=PredictPidContainer.getLatestThreshold(
|
|
|
+// scoreParam.getExtraParam().getOrDefault("predict_test_id","default")+"_"+modelParam.getAppType());
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+// if (maxItem != null && maxItem.getScore() < realThreshold) {
|
|
|
+// // If final score is below threshold, do not show the ad
|
|
|
+// adPredict = 1;
|
|
|
+// } else {
|
|
|
+// // Otherwise, show the ad
|
|
|
+// adPredict = 2;
|
|
|
+// }
|
|
|
+// if(maxItem != null){
|
|
|
+//// ThresholdModelContainer.mergingDigestAddScore(modelParam.getAppType(),maxItem.getScore());
|
|
|
+// //删除多余打印
|
|
|
+// maxItem.setItemFeature(null);
|
|
|
+// maxItem.setLrSampleString(null);
|
|
|
+// maxItem.setLrSampleStringOrgin(null);
|
|
|
+// log.info("svc=ScoreV2ThresholdPredictModel_predict modelName=ScoreV2ThresholdPredictModel maxItem={} extraParam={} app_type={} realThreshold={}",
|
|
|
+// JSONObject.toJSONString(maxItem), JSONObject.toJSONString(scoreParam.getExtraParam()),modelParam.getAppType(),realThreshold);
|
|
|
+// }
|
|
|
+//
|
|
|
+// Map<String, Object> result = new HashMap<>();
|
|
|
+// result.put("threshold", realThreshold);
|
|
|
+// result.put("score", maxItem == null ? -1 : maxItem.getScore());
|
|
|
+// result.put("ad_predict", adPredict);
|
|
|
+//
|
|
|
+//
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+//}
|