Davidmg0815 commited on
Commit
c5dbb3f
·
verified ·
1 Parent(s): b8898d8

Upload bench/auswertung_einlauf.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. bench/auswertung_einlauf.py +80 -0
bench/auswertung_einlauf.py ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Wertet die drei Einlauf-Messungen gegeneinander aus.
3
+
4
+ Die drei Laeufe unterscheiden sich in genau einer Sache voneinander, deshalb
5
+ ist jeder Paarvergleich direkt lesbar. Verglichen wird gepaart (McNemar), weil
6
+ alle drei dieselben 150 Aufgaben bearbeiten — nur die Aufgaben, bei denen genau
7
+ einer der beiden Laeufe besteht, tragen ueberhaupt Information.
8
+ """
9
+ import glob
10
+ import itertools
11
+ import json
12
+ import math
13
+ import os
14
+ import sys
15
+
16
+ ZIEL = "/mnt/models/qwen38-prep/einlauf"
17
+
18
+
19
+ def mcnemar(a, b):
20
+ ids = set(a) & set(b)
21
+ n01 = sum(1 for i in ids if a[i] and not b[i])
22
+ n10 = sum(1 for i in ids if b[i] and not a[i])
23
+ n = n01 + n10
24
+ if n == 0:
25
+ return n01, n10, 1.0
26
+ p = sum(math.comb(n, k) for k in range(min(n01, n10) + 1)) / 2 ** n * 2
27
+ return n01, n10, min(1.0, p)
28
+
29
+
30
+ def main():
31
+ laeufe = {}
32
+ for p in sorted(glob.glob(os.path.join(ZIEL, "*.json"))):
33
+ d = json.load(open(p))
34
+ laeufe[os.path.basename(p)[0]] = d
35
+
36
+ if not laeufe:
37
+ print("keine Ergebnisse gefunden")
38
+ return 1
39
+
40
+ print(f"{'':<3}{'Lauf':<40}{'Quote':>9}{'am Limit':>10}{'Schleifen':>11}{'Token':>9}")
41
+ for k in sorted(laeufe):
42
+ d = laeufe[k]
43
+ leer = sum(1 for x in d["aufgaben"]
44
+ if not x.get("gegeben") and x.get("abbruch") != "length")
45
+ print(f"{k.upper():<3}{d['modell'][:39]:<40}"
46
+ f"{d['bestanden']:>4}/{d['n']} {d['quote']:>5.1f}%"
47
+ f"{d.get('am_limit', 0):>8}"
48
+ f"{leer:>11}"
49
+ f"{d.get('tokens_je_aufgabe', 0):>9.0f}")
50
+
51
+ print("\nGepaarte Vergleiche (exakter McNemar):")
52
+ # Nur Paare, die sich in GENAU einer Sache unterscheiden, sind erklaerbar.
53
+ # a/c und u/v trennen Reasoning, a/u und c/v trennen das Modell. Die
54
+ # Diagonalen (a/v, c/u) aendern zwei Dinge zugleich und werden deshalb
55
+ # ausdruecklich als nicht interpretierbar markiert, statt sie wegzulassen —
56
+ # weglassen laedt dazu ein, sie spaeter doch zu zitieren.
57
+ erklaerung = {
58
+ ("a", "c"): "Reasoning-Effekt, Basismodell",
59
+ ("a", "u"): "Preis der Entzensierung, mit Reasoning",
60
+ ("c", "v"): "Preis der Entzensierung, ohne Reasoning",
61
+ ("u", "v"): "Reasoning-Effekt, entzensiert",
62
+ ("a", "v"): "NICHT interpretierbar (Modell UND Reasoning verschieden)",
63
+ ("c", "u"): "NICHT interpretierbar (Modell UND Reasoning verschieden)",
64
+ }
65
+ for x, y in itertools.combinations(sorted(laeufe), 2):
66
+ A = {t["id"]: t["ok"] for t in laeufe[x]["aufgaben"]}
67
+ B = {t["id"]: t["ok"] for t in laeufe[y]["aufgaben"]}
68
+ n01, n10, p = mcnemar(A, B)
69
+ was = erklaerung.get((x, y), "")
70
+ stern = " *" if p < 0.05 else ""
71
+ print(f" {x.upper()} vs {y.upper()}: {n01}:{n10} p = {p:.4f}{stern}"
72
+ f" {was}")
73
+
74
+ print("\nZum Vergleich der Messung vom 17.08.: 138/150 = 92,0 % "
75
+ "(8.000 Token, kein DRY)")
76
+ return 0
77
+
78
+
79
+ if __name__ == "__main__":
80
+ sys.exit(main())