File size: 2,928 Bytes
b707206
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"""typed-decisions için AUBIN-Learn hızlı becerisi: soru-anahtarı başına bge gömmesi → softmax sınıflandırıcı (saniyeler, CPU).
train için NIVEN ile AYNI 5 kat (random.Random(7) karıştırma, i::5) → örnek-dışı (OOF) tahmin; test için tüm train'le eğitilir.
Girdi yalnız durum + soru metni ('factors' YOK). Çıktı td_fuse.py'nin üçüncü uzmanı.

    python td_skill.py --out /kaggle/working/td_skill.json
"""
import argparse, json, os, random, sys
import numpy as np

HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, HERE)
from td_eval import load_td
from kev_llm import items
from learn_skill import SoftmaxProbe
from learn_eval import bge_embed_factory


def text(it):
    return f"{it['state']} || {it['q']}"


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--out", default="td_skill.json"); ap.add_argument("--work", default="")
    ap.add_argument("--C", type=float, default=1.0)
    a = ap.parse_args()
    tr, te = items(load_td("train")), items(load_td("test"))
    emb = bge_embed_factory()
    Vtr, Vte = emb([text(x) for x in tr]), emb([text(x) for x in te])
    cid = lambda it: it["key"].split("/", 1)[1].rsplit("/", 1)[0]
    qk = lambda it: f"{it['src']}/{it['key'].rsplit('/', 1)[1]}"
    order = list(dict.fromkeys(cid(x) for x in tr))                 # veri seti sırası (NIVEN: range(len(tr)) karıştırılır)
    perm = list(range(len(order))); random.Random(7).shuffle(perm)
    fold = {order[perm[k]]: k % 5 for k in range(len(order))}       # NIVEN: folds[f] = ids[f::5]
    out = {"oof": {}, "test": {}, "C": a.C}
    for q in sorted({qk(x) for x in tr}):
        I = [i for i, x in enumerate(tr) if qk(x) == q]; J = [j for j, x in enumerate(te) if qk(x) == q]
        lab = lambda it: str(it["keys"][it["y"]])
        for f in range(5):
            trn = [i for i in I if fold[cid(tr[i])] != f]; val = [i for i in I if fold[cid(tr[i])] == f]
            m = SoftmaxProbe(C=a.C).fit(Vtr[trn], [lab(tr[i]) for i in trn])
            P = m.predict_proba(Vtr[val])
            for i, p in zip(val, P):
                out["oof"].setdefault(cid(tr[i]), {})[q] = {str(c): float(v) for c, v in zip(m.classes_, p)}
        m = SoftmaxProbe(C=a.C).fit(Vtr[I], [lab(tr[i]) for i in I])
        for j, p in zip(J, m.predict_proba(Vte[J])):
            out["test"].setdefault(cid(te[j]), {})[q] = {str(c): float(v) for c, v in zip(m.classes_, p)}
        print(q, len(I), len(J), flush=True)
    def acc(split, its):
        h = []
        for it in its:
            d = out[split].get(cid(it), {}).get(qk(it))
            if d:
                h.append(max(d, key=d.get) == str(it["keys"][it["y"]]))
        return round(float(np.mean(h)), 4)
    out["acc"] = {"train_oof": acc("oof", tr), "test": acc("test", te)}
    json.dump(out, open(a.out, "w"))
    print("TD_SKILL", out["acc"], flush=True)


if __name__ == "__main__":
    main()