model_predict_analyse.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import argparse
  2. import gzip
  3. import sys
  4. import pandas as pd
  5. from hdfs import InsecureClient
  6. client = InsecureClient("http://master-1-1.c-7f31a3eea195cb73.cn-hangzhou.emr.aliyuncs.com:9870", user="spark")
  7. def read_predict(hdfs_path: str) -> list:
  8. result = []
  9. for file in client.list(hdfs_path):
  10. with client.read(hdfs_path + file) as reader:
  11. with gzip.GzipFile(fileobj=reader, mode="rb") as gz_file:
  12. for line in gz_file.read().decode("utf-8").split("\n"):
  13. split = line.split("\t")
  14. if len(split) != 4:
  15. continue
  16. cid = split[3].split("_")[0]
  17. label = int(split[0])
  18. score = float(split[2].replace("[", "").replace("]", "").split(",")[1])
  19. result.append({
  20. "cid": cid,
  21. "label": label,
  22. "score": score
  23. })
  24. return result
  25. def _main(model1_predict_path: str, model2_predict_path: str, file: str):
  26. if not model1_predict_path.endswith("/"):
  27. model1_predict_path += "/"
  28. if not model2_predict_path.endswith("/"):
  29. model2_predict_path += "/"
  30. # # 设置 pandas 显示选项
  31. # pd.set_option('display.max_rows', None) # 显示所有行
  32. # pd.set_option('display.max_columns', None) # 显示所有列
  33. model1_result = read_predict(model1_predict_path)
  34. model2_result = read_predict(model2_predict_path)
  35. m1 = pd.DataFrame(model1_result)
  36. g1 = m1.groupby("cid").agg(
  37. view=('cid', 'size'),
  38. conv=('label', 'sum'),
  39. old_score_avg=('score', lambda x: round(x.mean(), 6))
  40. ).reset_index()
  41. g1['true'] = g1['conv'] / g1['view']
  42. m2 = pd.DataFrame(model2_result)
  43. g2 = m2.groupby("cid").agg(
  44. new_score_avg=('score', lambda x: round(x.mean(), 6))
  45. )
  46. merged = pd.merge(g1, g2, on='cid', how='left')
  47. merged.fillna(0, inplace=True)
  48. merged["abs((new-true)/true)"] = abs(
  49. (merged['new_score_avg'] - merged['true']) / merged['true']
  50. ).mask(merged['true'] == 0, 0)
  51. merged["abs((old-true)/true)"] = abs(
  52. (merged['old_score_avg'] - merged['true']) / merged['true']
  53. ).mask(merged['true'] == 0, 0)
  54. merged = merged[['cid', 'view', "conv", "true", "old_score_avg", "new_score_avg",
  55. "abs((old-true)/true)", "abs((new-true)/true)"]]
  56. merged = merged.sort_values(by=['view'], ascending=False)
  57. with open(file, "w") as writer:
  58. writer.write(merged.to_string(index=False))
  59. print("0")
  60. if __name__ == '__main__':
  61. parser = argparse.ArgumentParser(description="model_predict_analyse.py")
  62. parser.add_argument("-p", "--predict_path_list", nargs='*',
  63. help="模型评估结果保存路径,第一个为老模型评估结果,第二个为新模型评估结果")
  64. parser.add_argument("-f", "--file", help="最后计算结果的保存路径")
  65. args = parser.parse_args()
  66. predict_path_list = args.predict_path_list
  67. # 判断参数是否正常
  68. if len(predict_path_list) != 2:
  69. sys.exit(1)
  70. _main(predict_path_list[0], predict_path_list[1], args.file)