scholarshipid / scripts /evaluate.py
ydmhmhm's picture
refactor(config): consolidate serving config into default.yaml and add retraining support
99c7254
Raw
History Blame Contribute Delete
3.05 kB
"""
Entry point untuk evaluasi model pada test set.
Usage:
python scripts/evaluate.py --config configs/default.yaml
# or override checkpoint paths:
python scripts/evaluate.py --config configs/default.yaml \
--student_checkpoint outputs/checkpoints/student_tower_best.keras \
--scholarship_checkpoint outputs/checkpoints/scholarship_tower_best.keras
"""
import argparse
import yaml
import tensorflow as tf
from src.models.student_tower import L2Normalize
from src.evaluators import Evaluator
from src.utils.data_loader import load_data, load_precomputed_features
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("--config", type=str, default="configs/default.yaml")
parser.add_argument("--student_checkpoint", type=str, default=None)
parser.add_argument("--scholarship_checkpoint", type=str, default=None)
return parser.parse_args()
def main():
args = parse_args()
with open(args.config) as f:
cfg = yaml.safe_load(f)
# Resolve checkpoint paths from CLI or config defaults
student_checkpoint = args.student_checkpoint if args.student_checkpoint else cfg["models"]["student_tower"]
scholarship_checkpoint = args.scholarship_checkpoint if args.scholarship_checkpoint else cfg["models"]["scholarship_tower"]
# ── Load features ─────────────────────────────────────────────────────────
_, _, test_df = load_data(cfg)
(stu_struct, sch_struct, stu_text_emb, sch_text_emb,
stu_id_to_idx, sch_id_to_idx) = load_precomputed_features(cfg)
sch_ids = list(sch_id_to_idx.keys())
# ── Load model dari format .keras ─────────────────────────────────────────
custom_objects = {"L2Normalize": L2Normalize}
student_tower = tf.keras.models.load_model(
student_checkpoint, custom_objects=custom_objects)
scholarship_tower = tf.keras.models.load_model(
scholarship_checkpoint, custom_objects=custom_objects)
# ── Evaluate ──────────────────────────────────────────────────────────────
evaluator = Evaluator(k=cfg["evaluation"]["k_values"][0])
metrics = evaluator.compute_metrics(
df=test_df,
student_tower=student_tower,
scholarship_tower=scholarship_tower,
stu_struct=stu_struct,
sch_struct=sch_struct,
stu_text_emb=stu_text_emb,
sch_text_emb=sch_text_emb,
stu_id_to_idx=stu_id_to_idx,
sch_ids=sch_ids,
)
print("\n── Test Set Evaluation ─────────────────────────────")
for key, val in metrics.items():
print(f" {key:<12}: {val:.4f}")
if __name__ == "__main__":
main()