02_ad_model_update_test.sh 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #!/bin/sh
  2. set -x
  3. export PATH=$SPARK_HOME/bin:$PATH
  4. export HADOOP_CONF_DIR=/etc/taihao-apps/hadoop-conf
  5. export JAVA_HOME=/usr/lib/jvm/java-1.8.0
  6. sh_path=$(cd $(dirname $0); pwd)
  7. source ${sh_path}/00_common.sh
  8. source /root/anaconda3/bin/activate py37
  9. # 全局常量
  10. HADOOP=/opt/apps/HADOOP-COMMON/hadoop-common-current/bin/hadoop
  11. TRAIN_PATH=/dw/recommend/model/31_ad_sample_data_v4
  12. BUCKET_FEATURE_PATH=/dw/recommend/model/33_ad_train_data_v4
  13. TABLE=alg_recsys_ad_sample_all
  14. # 特征文件名
  15. feature_file=20240703_ad_feature_name.txt
  16. # 模型本地临时保存路径
  17. model_local_home=/root/zhaohp/XGB/
  18. # 模型HDFS保存路径,测试时修改为其他路径,避免影响线上
  19. MODEL_PATH=/dw/recommend/model/35_ad_model
  20. # 预测结果保存路径,测试时修改为其他路径,避免影响线上
  21. PREDICT_RESULT_SAVE_PATH=/dw/recommend/model/34_ad_predict_data
  22. # 模型OSS保存路径,测试时修改为其他路径,避免影响线上
  23. MODEL_OSS_PATH=oss://art-recommend.oss-cn-hangzhou.aliyuncs.com/zhangbo/
  24. # 线上模型名,测试时修改为其他模型名,避免影响线上
  25. model_name=model_xgb_351_1000_v2
  26. # 线上校准文件名
  27. OSS_CALIBRATION_FILE_NAME=model_xgb_351_1000_v2_calibration
  28. # 本地保存HDFS模型路径文件,测试时修改为其他模型名,避免影响线上
  29. model_path_file=${model_local_home}/online_model_path.txt
  30. # 获取当前是星期几,1表示星期一
  31. current_day_of_week="$(date +"%u")"
  32. # 任务开始时间
  33. start_time=$(date +%s)
  34. # 前一天
  35. today_early_1="$(date -d '1 days ago' +%Y%m%d)"
  36. # 线上模型在HDFS中的路径
  37. online_model_path=`cat ${model_path_file}`
  38. # 训练用的数据路径
  39. train_data_path=""
  40. # 评估用的数据路径
  41. predict_date_path=""
  42. #评估结果保存路径
  43. new_model_predict_result_path=""
  44. # 模型保存路径
  45. model_save_path=""
  46. # 评测结果保存路径,后续需要根据此文件评估是否要更新模型
  47. predict_analyse_file_path=/root/zhaohp/XGB/predict_analyse_file/20241105_351_1000_analyse.txt
  48. # 校准文件保存路径
  49. calibration_file_path=""
  50. # 保存模型评估的分析结果
  51. old_incr_rate_avg=0
  52. new_incr_rate_avg=0
  53. top10_msg=""
  54. calc_model_predict() {
  55. local count=0
  56. local max_line=10
  57. local old_total_diff=0
  58. local new_total_diff=0
  59. top10_msg="| CID | 老模型相对真实CTCVR的变化 | 新模型相对真实CTCVR的变化 |"
  60. top10_msg+=" \n| ---- | --------- | -------- |"
  61. while read -r line && [ ${count} -lt ${max_line} ]; do
  62. # 使用 ! 取反判断,只有当行中不包含 "cid" 时才执行继续的逻辑
  63. if [[ "${line}" == *"cid"* ]]; then
  64. continue
  65. fi
  66. read -a numbers <<< "${line}"
  67. # 分数分别保存
  68. real_score_map[${numbers[0]}]=${numbers[3]}
  69. old_score_map[${numbers[0]}]=${numbers[6]}
  70. new_score_map[${numbers[0]}]=${numbers[7]}
  71. # 拼接Top10详情的飞书消息
  72. top10_msg="${top10_msg} \n| ${numbers[0]} | ${numbers[6]} | ${numbers[7]} | "
  73. # 计算top10相对误差绝对值的均值
  74. old_abs_score=$( echo "if(${numbers[6]} < 0) -${numbers[6]} else ${numbers[6]}" | bc -l )
  75. new_abs_score=$( echo "if(${numbers[7]} < 0) -${numbers[7]} else ${numbers[7]}" | bc -l )
  76. old_total_diff=$( echo "${old_total_diff} + ${old_abs_score}" | bc -l )
  77. new_total_diff=$( echo "${new_total_diff} + ${new_abs_score}" | bc -l )
  78. count=$((${count} + 1))
  79. done < "${predict_analyse_file_path}"
  80. local return_code=$?
  81. check_run_status $return_code $step_start_time "计算Top10差异" "计算Top10差异异常"
  82. old_incr_rate_avg=$( echo "scale=6; ${old_total_diff} / ${count}" | bc -l )
  83. check_run_status $? $step_start_time "计算老模型Top10差异" "计算老模型Top10差异异常"
  84. new_incr_rate_avg=$( echo "scale=6; ${new_total_diff} / ${count}" | bc -l )
  85. check_run_status $? $step_start_time "计算新模型Top10差异" "计算新模型Top10差异异常"
  86. echo "老模型Top10差异平均值: ${old_incr_rate_avg}"
  87. echo "新模型Top10差异平均值: ${new_incr_rate_avg}"
  88. echo "新老模型分数对比: "
  89. for cid in "${!new_score_map[@]}"; do
  90. echo "\t CID: $cid, 老模型分数: ${old_score_map[$cid]}, 新模型分数: ${new_score_map[$cid]}"
  91. done
  92. }
  93. calc_model_predict