Evaluator項目:
- MySQL獲取模型預測結果
- MySQL獲取真實結果
- 線下評估
- 上傳評估結果至MySQL
1 項目結構
1.1 評估時間安排
- 每週五評估:評估上週五往前一週的預測結果
2 腳本解析
2.1 定時腳本 evaluate.sh
- 每週五執行
#!/usr/bin/env bash
# 工作目錄
WORK_DIR=/home/zhoujialiang/evaluate/
# 參數
ds_eval=`date -d "-7 days" +%Y-%m-%d`
ds_pred_start=`date -d "$ds_eval -14 days" +%Y-%m-%d`
ds_pred_end=`date -d "$ds_eval -8 days" +%Y-%m-%d`
ds_ban_start=`date -d "$ds_eval -14 days" +%Y-%m-%d`
ds_ban_end=`date -d "$ds_eval -1 days" +%Y-%m-%d`
# 評估主線掛模型
echo /usr/bin/python3 evaluate.py --tablename zhuxiangua --ds_pred_start $ds_pred_start --ds_pred_end $ds_pred_end --ds_ban_start $ds_ban_start --ds_ban_end $ds_ban_end
/usr/bin/python3 evaluate.py --tablename zhuxiangua --ds_pred_start $ds_pred_start --ds_pred_end $ds_pred_end --ds_ban_start $ds_ban_start --ds_ban_end $ds_ban_end
# 評估三環掛模型
echo /usr/bin/python3 evaluate.py --tablename sanhuangua --ds_pred_start $ds_pred_start --ds_pred_end $ds_pred_end --ds_ban_start $ds_ban_start --ds_ban_end $ds_ban_end
/usr/bin/python3 evaluate.py --tablename sanhuangua --ds_pred_start $ds_pred_start --ds_pred_end $ds_pred_end --ds_ban_start $ds_ban_start --ds_ban_end $ds_ban_end
# 評估圖譜模型
echo /usr/bin/python3 evaluate.py --tablename graph --ds_pred_start $ds_pred_start --ds_pred_end $ds_pred_end --ds_ban_start $ds_ban_start --ds_ban_end $ds_ban_end
/usr/bin/python3 evaluate.py --tablename graph --ds_pred_start $ds_pred_start --ds_pred_end $ds_pred_end --ds_ban_start $ds_ban_start --ds_ban_end $ds_ban_end
1.2 評估模塊 Evaluator
- 獲取預測外掛數、實際封停數、預測外掛中被封停數,並計算準確率和召回率
class Evaluator(object):
"""MySQL數據讀取或上傳
Attributes:
_conn: MySQLl連接
"""
def __init__(self, ids_pred, ids_ban):
self._ids_pred = set(ids_pred)
self._ids_ban = set(ids_ban)
def prec_recall(self):
"""評估準確率和召回率
獲取預測外掛數,實際封停數,預測外掛且封停數;
並計算預測準確率和召回率
Returns:
results: 評估結果字典,包含 {
cnt_pos: 預測外掛數
cnt_true: 實際封停數
cnt_pos_true: 預測正確數
prec: 準確率
recall: 召回率
} 五個key
"""
results = dict()
results['cnt_pos'] = len(self._ids_pred)
results['cnt_true'] = len(self._ids_ban)
results['cnt_pos_true'] = results['cnt_pos'] + results['cnt_true'] - len(set(list(self._ids_ban) + list(self._ids_pred)))
try:
results['prec'] = results['cnt_pos_true'] / results['cnt_pos']
except Exception as e:
logging.error('No predicted results! {}'.format(e))
try:
results['recall'] = results['cnt_pos_true'] / results['cnt_true']
except Exception as e:
logging.error('No banned role_ids! {}'.format(e))
return results