ViClickbait-2025 / scripts /compare_results.py
minhy112's picture
Upload ViClickbait-2025 project (PhoBERT + GPT-OSS-20B LoRA SFT)
af55aed verified
Raw
History Blame Contribute Delete
3.08 kB
"""
compare_results.py – So sánh kết quả PhoBERT vs GPT OSS 20B
--------------------------------------------------------------
Dùng:
python scripts/compare_results.py \
--phobert_dir outputs/phobert \
--gpt_dir outputs/gpt20b
"""
import argparse
import json
import os
def load_results(directory: str) -> dict:
path = os.path.join(directory, "test_results.json")
if not os.path.exists(path):
return {}
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
def fmt(val, pct=True):
if isinstance(val, float):
return f"{val*100:.2f}%" if pct else f"{val:.4f}"
return str(val)
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--phobert_dir", default="outputs/phobert")
parser.add_argument("--gpt_dir", default="outputs/gpt20b")
args = parser.parse_args()
pb = load_results(args.phobert_dir)
gpt = load_results(args.gpt_dir)
if not pb and not gpt:
print("Chưa có kết quả nào. Hãy chạy train trước.")
return
metrics = ["accuracy", "f1_binary", "f1_macro", "precision", "recall"]
labels = ["Accuracy", "F1 Binary", "F1 Macro", "Precision", "Recall"]
col_w = 16
header = f"{'Metric':<16} {'PhoBERT':>{col_w}} {'GPT-OSS-20B':>{col_w}} {'Δ (GPT - PB)':>{col_w}}"
print("\n" + "=" * len(header))
print(" SO SÁNH KẾT QUẢ: PhoBERT vs GPT OSS 20B")
print("=" * len(header))
print(header)
print("-" * len(header))
for m, lbl in zip(metrics, labels):
pb_val = pb.get(m)
gpt_val = gpt.get(m)
if pb_val is None and gpt_val is None:
continue
pb_str = fmt(pb_val) if pb_val is not None else "—"
gpt_str = fmt(gpt_val) if gpt_val is not None else "—"
if pb_val is not None and gpt_val is not None:
delta = gpt_val - pb_val
sign = "+" if delta >= 0 else ""
d_str = f"{sign}{delta*100:.2f}%"
else:
d_str = "—"
print(f"{lbl:<16} {pb_str:>{col_w}} {gpt_str:>{col_w}} {d_str:>{col_w}}")
print("=" * len(header))
# Model info
print(f"\nPhoBERT model : {pb.get('model', '—')}")
print(f"GPT OSS model : {gpt.get('model', '—')}")
# Split sizes
split = pb.get("split_sizes") or gpt.get("split_sizes") or {}
if split:
total = sum(split.values())
print(f"\nDataset splits: train={split.get('train')} "
f"val={split.get('val')} test={split.get('test')} "
f"(total={total})")
# Classification reports
if pb.get("classification_report"):
print("\n── PhoBERT Classification Report ────────────────────────")
print(pb["classification_report"])
if gpt.get("classification_report"):
print("── GPT OSS 20B Classification Report ────────────────────")
print(gpt["classification_report"])
if __name__ == "__main__":
main()