İçeriğe geç
academia.sh

Ders 09 / 13

Yeniden Eğitim Politikası

Bir modelin ne zaman yeniden eğitileceğine karar veren tetikleyicilerin ve o kararın gerçekten ne kazandırdığının sayılması: veri kaymalı üretimde üç yeniden eğitim penceresinin üçü de 2026-12 döneminde 0,9800 verir ve bu, hiç yeniden eğitilmemiş eski modelin sayısıyla birebir aynıdır. Takvim, gösterge ve başarım tetikleyicileri iki bozulma senaryosunda koşturulduğunda altı bileşimin altısında da kazanılan isabet 0,0000 çıkar ve karşılığında 3.078.000 satır puanlanır. Kazancı belirleyen şeyin tetikleyici değil pencere olduğu, kavram kaymasında aynı anda tetiklenen yeniden eğitimin pencere 6 ile 0,0000, pencere 1 ile 0,1100 kazandırmasıyla gösterilir.

İçindekiler

Bir önceki ders iki modeli üretimde karşılaştırmanın bedelini ölçtü: bu kümede tek dönemlik bir deneyin ayırt edebildiği en küçük fark 0,0050 ile 0,0275 arasındadır ve altında kalan her karşılaştırma sonuçsuzdur. Karşılaştırmanın pahalı olması, ondan önceki soruyu keskinleştirir: yeni model neden eğitiliyor.

Üretimde bu sorunun yanıtı bir yeniden eğitim tetikleyicisidir: takvim gelmiştir, bir gösterge bandın dışına çıkmıştır ya da isabet gerçekten düşmüştür. Bu ders üç tetikleyici türünü iki ayrı bozulma senaryosunda koşturur ve her birinin yanına iki sayı yazar: kaç model eğitildi ve kazanılan isabet ne kadar. İkinci sayı bu kursun ikinci iddiasının en net örneğidir.

  • MY21. Kaynak, hat ve model kurgudur; hiçbir öğrenme kitaplığı, orkestratör, dağıtım aracı ya da izleme ürünü çağrılmaz. Tohum 20260218.
  • MY22. Etiket abone_ort + 6 x isyeri > 30 kuralına bağlıdır ve bu kural kavramdır. Karar eşiği ayrı bir ayardır, eğitim ölçütü dengeli isabettir, yani duyarlılık (recall) ile özgüllüğün ortalamasıdır. İzleme dönemlerinde taban sınıf oranı 0,5342, dönem başına 200 satır ve isabetin adımı 0,0050.
  • MY23. İki senaryo vardır. Veri kaymasında girdi kayar, kural aynı kalır. Kavram kaymasında girdi aynı kalır, kuralın eşiği 2026-09‘dan sonra 30’dan 27’ye iner.
  • MY24. Etiket gecikmelidir: bir dönemin etiketi iki dönem sonra bilinir. Yeniden eğitim yalnız etiketli dönemleri kullanabilir.
  • MY25. Eğitim bedeli puanlanan satır olarak sayılır: her yeniden eğitim, penceredeki satırları 135 aday için puanlar. Ham süre yazılmaz.
  • MY26. Kazanç, o senaryoda hiç yeniden eğitilmemiş eski modelin 2026-12 isabetine göre ölçülür.

Pencere Süpürmesi: En İyi Durum

İlk blok kurulumu kurar ve veri kaymalı üretimde üç ayrı pencereyle yeniden eğitim yapar. Etiket gecikmesi bu blokta yok sayılır, yani ulaşılabilecek en iyi durum ölçülür.

# KURGUDUR. Olcum aginin sayac okumalari , hattin tuketim asamasi , oznitelik
# yolu ve uc agirlikli esik modeli ders icinde uretilir; hicbir ogrenme
# kitapligi , dagitim araci , deney platformu ya da izleme urunu cagrilmaz.
# Tohum 20260218.
TOHUM, M32 = 20260218, 0xFFFFFFFF


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


BOLGE = ["dogu", "bati", "kuzey", "guney", "merkez"]
TIP = ["mesken", "isyeri"]
DONEM = [f"2026-{a:02d}" for a in range(1, 13)]
ABONE = {}
for i in range(200):
    r = uretec(TOHUM + 37 * i)
    ABONE[f"A{i + 1:03d}"] = {"bolge": BOLGE[int(r() * 5)], "tip": TIP[int(r() * 2)],
                              "baslangic": 10000 + int(r() * 60000)}


def satirlar():
    """Kaynak okumalari ve donem farkindan tuketim: hattin ilk uc asamasi."""
    kayit = []
    for i, (ab, a) in enumerate(ABONE.items()):
        e = a["baslangic"]
        for d in DONEM:
            r = uretec(TOHUM + 101 * i + 7 * DONEM.index(d))
            e += 4 + int(r() * 46)
            kayit.append({"abone": ab, "donem": d, "bolge": a["bolge"], "tip": a["tip"],
                          "endeks": e})
    t = {(k["abone"], k["donem"]): k["endeks"] for k in kayit}
    return [dict(k, m3=k["endeks"] - t[(k["abone"], DONEM[DONEM.index(k["donem"]) - 1])])
            for k in kayit if DONEM.index(k["donem"])]


def oznitelikler(kayitlar):
    """Agirliktan bagimsizdir ve BIR KEZ hesaplanir; tam gecmisi gorur."""
    ab, bo = {}, {}
    for k in sorted(kayitlar, key=lambda k: DONEM.index(k["donem"])):
        ab.setdefault(k["abone"], []).append((DONEM.index(k["donem"]), k["m3"]))
        bo.setdefault(k["bolge"], []).append((DONEM.index(k["donem"]), k["m3"]))

    def ort(dizi, i):
        s = [v for d, v in dizi if d < i]
        return round(sum(s) / len(s), 4) if s else 0.0

    return {(k["abone"], k["donem"]): {
        "abone_ort": ort(ab[k["abone"]], DONEM.index(k["donem"])),
        "bolge_ort": ort(bo[k["bolge"]], DONEM.index(k["donem"])),
        "isyeri": 1 if k["tip"] == "isyeri" else 0} for k in kayitlar}


KURAL_ESIK, KURAL_ISYERI = 30, 6          # etiketi ureten KURAL , yani kavram
IZLEME = DONEM[6:]                        # uretimde izlenen alti donem
IZGARA = [(a, b, c) for a in (0.6, 0.8, 1.0) for b in (0.0, 0.2, 0.4) for c in (0, 4, 8)]
KARAR_IZGARA = (18, 22, 26, 30, 34)       # karar esigi AYRI bir ayardir


def etiket(o, esik=KURAL_ESIK):
    return 1 if o["abone_ort"] + KURAL_ISYERI * o["isyeri"] > esik else 0


def puan(o, w):
    return w[0] * o["abone_ort"] + w[1] * o["bolge_ort"] + w[2] * o["isyeri"]


def tahmin(o, w, karar):
    return 1 if puan(o, w) > karar else 0


def egit(kayitlar, oz, donemler, et):
    """Agirlik ve karar esigi BIRLIKTE aranir (27 x 5 = 135 aday); olcut
    duyarlilik ile ozgullugun ortalamasi , yani DENGELI ISABETTIR."""
    kume = [k for k in kayitlar if k["donem"] in donemler]
    en = (-1.0, None, None, 0.0, 0.0)
    for w in IZGARA:
        for kr in KARAR_IZGARA:
            dp = dn = yp = yn = 0
            for k in kume:
                o = oz[(k["abone"], k["donem"])]
                t, g = tahmin(o, w, kr), et[(k["abone"], k["donem"])]
                if t and g:
                    dp += 1
                elif t:
                    yp += 1
                elif g:
                    yn += 1
                else:
                    dn += 1
            du = dp / (dp + yn) if dp + yn else 0.0
            oz2 = dn / (dn + yp) if dn + yp else 0.0
            if (du + oz2) / 2 > en[0]:
                en = ((du + oz2) / 2, w, kr, du, oz2)
    return {"agirlik": en[1], "karar": en[2], "dengeli": round(en[0], 4),
            "duyarlilik": round(en[3], 4), "ozgulluk": round(en[4], 4), "satir": len(kume)}


def kaydir(kayitlar, baslangic="2026-09", egim=0.06):
    """KURGU veri kaymasi: isyeri tuketimi her donem `egim` kadar buyuyor."""
    b = DONEM.index(baslangic)
    return [dict(k, m3=round(k["m3"] * (1.0 + egim * (DONEM.index(k["donem"]) - b + 1)), 4))
            if DONEM.index(k["donem"]) >= b and k["tip"] == "isyeri" else dict(k)
            for k in kayitlar]



def kavram_kaydir(oz, kayitlar, baslangic="2026-09", yeni_esik=27):
    """KURGU kavram kaymasi: GIRDI AYNI , kural degisiyor (esik 30'dan 27'ye)."""
    b = DONEM.index(baslangic)
    return {(k["abone"], k["donem"]): etiket(
        oz[(k["abone"], k["donem"])],
        yeni_esik if DONEM.index(k["donem"]) >= b else KURAL_ESIK) for k in kayitlar}


def isb(kayitlar, oz, m, donem, et):
    kume = [k for k in kayitlar if k["donem"] == donem]
    return round(sum(1 for k in kume
                     if tahmin(oz[(k["abone"], k["donem"])], m["agirlik"], m["karar"])
                     == et[(k["abone"], k["donem"])]) / len(kume), 4)


def pay(kayitlar, oz, m, donem):
    kume = [k for k in kayitlar if k["donem"] == donem]
    return round(sum(tahmin(oz[(k["abone"], k["donem"])], m["agirlik"], m["karar"])
                     for k in kume) / len(kume), 4)


TUM = satirlar()
OZ = oznitelikler(TUM)
URETIM = kaydir(TUM)                      # uretimde girdi kaymis durumda
OZU = oznitelikler(URETIM)
ET_V = {c: etiket(o) for c, o in OZU.items()}      # veri kaymasi: KURAL AYNI
ET_K = kavram_kaydir(OZ, TUM)                      # kavram kaymasi: kural degisti
TABAN = egit(TUM, OZ, DONEM[1:9], {c: etiket(o) for c, o in OZ.items()})
izl = [k for k in TUM if k["donem"] in IZLEME]
e = [etiket(OZ[(k["abone"], k["donem"])]) for k in izl]
print(f"taban model {TABAN['agirlik']}/{TABAN['karar']} dengeli isabet {TABAN['dengeli']}"
      f" duyarlilik {TABAN['duyarlilik']:.4f} ozgulluk {TABAN['ozgulluk']:.4f}")
print(f"izleme {len(izl)} satir , taban sinif orani {round(1 - sum(e) / len(e), 4)}"
      f" , donem basina 200 satir , isabetin adimi 0.0050")

# Veri kaymali uretimde yeniden egitim: butun etiketler elde olsaydi , yani
# gecikme hic olmasaydi ulasilabilecek EN IYI durum.
print("\npencere  egitim donemi     satir  dengeli isabet  2026-12 isabeti")
for p in (3, 6, 11):
    don = [d for d in DONEM if DONEM.index("2026-11") - p < DONEM.index(d)
           <= DONEM.index("2026-11")]
    m = egit(URETIM, OZU, don, ET_V)
    print(f"{p:>7}  {don[0]}..{don[-1]}  {m['satir']:>5}  {m['dengeli']:>14}"
          f"  {isb(URETIM, OZU, m, '2026-12', ET_V):>15}")
print(f"   eski model                       {TABAN['dengeli']}"
      f"  {isb(URETIM, OZU, TABAN, '2026-12', ET_V):>15}")
taban model (0.6, 0.0, 4)/18 dengeli isabet 0.9864 duyarlilik 1.0000 ozgulluk 0.9728
izleme 1200 satir , taban sinif orani 0.5342 , donem basina 200 satir , isabetin adimi 0.0050

pencere  egitim donemi     satir  dengeli isabet  2026-12 isabeti
      3  2026-09..2026-11    600          0.9824             0.98
      6  2026-06..2026-11   1200            0.98             0.98
     11  2026-01..2026-11   2000          0.9849             0.98
   eski model                       0.9864             0.98

Eğitim penceresi büyüdükçe eğitim üzerindeki dengeli isabet oynar: 0,9824, 0,9800, 0,9849. Bu üç sayı bir seçim yapılabileceği izlenimi verir. Son sütun o izlenimi siler. Üç pencerenin üçü de 2026-12’de 0,9800 verir ve bu, hiç yeniden eğitilmemiş eski modelin sayısıyla birebir aynıdır. Üçü de aynı ağırlığı ve aynı karar eşiğini bulmuştur, çünkü aramanın çözmeye çalıştığı kural değişmemiştir. Girdi kaymıştır, ama etiketi üreten bağıntı yerinde durduğu sürece doğru bir model kaymış girdide de doğru kalır. Kazanılan isabet 0,0000’dır ve eğitim bedeli ödenmiştir.

Tetikleyici mi, Pencere mi

İkinci blok üç tetikleyiciyi iki senaryoda koşturur. Etiket gecikmesi artık uygulanır: bir dönemde tetiklenen yeniden eğitim yalnız iki dönem öncesine kadar etiketli veriyi görür. atesleyen sütunu tetikleyicinin kaç dönemde ateşlediği, yani kaç model eğitildiğidir.

# Bu blok ilk bloktaki TUM , OZ , URETIM , OZU , TABAN , ET_V , ET_K ,
# IZLEME , IZGARA , KARAR_IZGARA , egit , isb ve pay tanimlarini surdurur.
GECIKME, PENCERE, BELLEK = 2, 6, {}


def tetikle(ad, kayitlar, oz, et, simdi, pencere=PENCERE):
    """Etiket gecikmelidir: `simdi` doneminde ancak `simdi - GECIKME` etiketlidir."""
    i = DONEM.index(simdi) - GECIKME
    don = [d for d in DONEM if i - pencere < DONEM.index(d) <= i]
    anahtar = (ad, don[0], don[-1], pencere)
    if anahtar not in BELLEK:
        BELLEK[anahtar] = egit(kayitlar, oz, don, et)
    m = BELLEK[anahtar]
    return m, m["satir"] * len(IZGARA) * len(KARAR_IZGARA)


def sapan(dizi, taban, band=0.05):
    return [d for d, v in dizi if abs(v - taban) / taban > band]


print("senaryo         tetikleyici  atesleyen  puanlanan satir  2026-12  kazanc")
for ad, kay, oz, et in (("veri kaymasi", URETIM, OZU, ET_V),
                        ("kavram kaymasi", TUM, OZ, ET_K)):
    t12 = isb(kay, oz, TABAN, "2026-12", et)
    ti = isb(kay, oz, TABAN, "2026-08", et)
    for t, donemler in (
            ("takvim", list(IZLEME)),
            ("gosterge", sapan([(d, pay(kay, oz, TABAN, d)) for d in IZLEME],
                               pay(kay, oz, TABAN, "2026-08"))),
            ("basarim", sapan([(d, isb(kay, oz, TABAN, DONEM[DONEM.index(d) - GECIKME], et))
                               for d in IZLEME[GECIKME:]], ti))):
        bedel, son = 0, None
        for d in donemler:
            m, b = tetikle(ad, kay, oz, et, d)
            bedel += b
            son = m if DONEM.index(d) < DONEM.index("2026-12") else son
        i12 = isb(kay, oz, son, "2026-12", et) if son else t12
        print(f"{ad:<15} {t:<11}  {len(donemler):>9}  {bedel:>15}  {i12:>7}  {i12 - t12:+.4f}")

print("\nkavram kaymasi , 2026-11'de tetiklenen yeniden egitim: pencere secimi")
for p in (1, 3, 6):
    m, _ = tetikle("kp", TUM, OZ, ET_K, "2026-11", pencere=p)
    i12 = isb(TUM, OZ, m, "2026-12", ET_K)
    print(f"  pencere {p}  {str(m['agirlik']) + '/' + str(m['karar']):<18}"
          f" egitim satiri {m['satir']:>4}  2026-12 isabeti {i12}"
          f"  kazanc {i12 - isb(TUM, OZ, TABAN, '2026-12', ET_K):+.4f}")
senaryo         tetikleyici  atesleyen  puanlanan satir  2026-12  kazanc
veri kaymasi    takvim               6           891000     0.98  +0.0000
veri kaymasi    gosterge             3           486000     0.98  +0.0000
veri kaymasi    basarim              0                0     0.98  +0.0000
kavram kaymasi  takvim               6           891000     0.85  +0.0000
kavram kaymasi  gosterge             3           486000     0.85  +0.0000
kavram kaymasi  basarim              2           324000     0.85  +0.0000

kavram kaymasi , 2026-11'de tetiklenen yeniden egitim: pencere secimi
  pencere 1  (0.6, 0.2, 4)/22   egitim satiri  200  2026-12 isabeti 0.96  kazanc +0.1100
  pencere 3  (0.8, 0.4, 4)/34   egitim satiri  600  2026-12 isabeti 0.85  kazanc +0.0000
  pencere 6  (0.6, 0.0, 4)/18   egitim satiri 1200  2026-12 isabeti 0.85  kazanc +0.0000

Altı satırın altısında da kazanç 0,0000. Toplam 3.078.000 satır puanlanmış, yirmi kez yeniden eğitim koşmuş ve 2026-12’de okunan sayı her seferinde tetikleyicisiz durumun sayısı çıkmıştır. Satırların ayrı ayrı okunması bunun üç ayrı nedeni olduğunu gösterir.

Başarım tetikleyicisi veri kaymasında hiç ateşlemez ve bu doğru karardır: kazanılacak bir şey yoktur, bedeli de 0’dır. Aynı tetikleyici kavram kaymasında ateşler ama iki dönem geç; 2026-09’da düşen isabet ancak 2026-11’de bilinir. Gösterge tetikleyicisi iki senaryoda da aynı üç dönemde ateşler. Zararlı bozulmanın olduğu senaryoyla zararsız olanı ayırt etmez, çünkü baktığı tahmin payı ikisinde de aynı biçimde kaymaktadır. Kursun kuralı bu satırda yazılıdır: bir göstergenin ateşlemesi bozulmanın kanıtı değildir. Takvim tetikleyicisi hiçbir şeye bakmadan en çok modeli eğitir ve en büyük bedeli öder.

Son tablo asıl nedeni verir. Kavram kaymasında 2026-11‘de tetiklenen yeniden eğitim, aynı an, aynı veri ve aynı ızgarayla pencere 6’da 0,8500, pencere 1’de 0,9600 verir; kazanç 0,0000 ile 0,1100 arasında değişir. Pencere 6, biri yeni kurala altısı eski kurala ait dönemleri birlikte görür ve dengeli isabeti en büyükleyen arama çoğunluğu izleyerek eski modeli yeniden bulur. Pencere 1 yalnız yeni kuralın dönemini görür ve başka bir modele iner. Yeniden eğitimin kazandırdığı şey tetikleyici değil, pencerenin hangi kuralın dönemlerini içerdiğidir. Kazanç 0,1100 önceki dersin ayırt edilebilir en küçük farkının çok üstündedir; 0,0000 ise zaten sıfırdır.

Onay akışının ölçülebilir karşılığı buradan çıkar. Bir yeniden eğitim önerisi onaya geldiğinde tek başına “gösterge ateşledi” cümlesi bir gerekçe değildir; kararı verilebilir kılan üç sayı penceresi, adayın eski modelden ayrışan tahmin sayısı ve gölgede ölçülmüş kazancıdır. Üçü yazılmadığında onay, sonucu 0,0000 olan bir eğitimi de onaylar.

Özet

  • Veri kaymalı üretimde üç yeniden eğitim penceresi eğitimde 0,9824, 0,9800 ve 0,9849 verir, ama 2026-12’de üçü de 0,9800’dür — hiç yeniden eğitilmemiş eski modelle birebir aynı. Taban sınıf oranı 0,5342, isabetin adımı 0,0050. Kural değişmediyse yeniden eğitim hiçbir şey kazandırmaz ve eğitim bedeli ödenmiş olur.
  • Üç tetikleyici ile iki senaryonun altı bileşiminin altısında da kazanç 0,0000; karşılığında 3.078.000 satır puanlanır. Takvim tetikleyicisi en pahalısıdır (891.000 satır), başarım tetikleyicisi veri kaymasında hiç ateşlemez ve bedeli 0’dır.
  • Gösterge tetikleyicisi iki senaryoda da aynı üç dönemde ateşler; zararlı bozulmayı zararsızından ayırmaz. Bir göstergenin ateşlemesi bozulmanın kanıtı değildir.
  • Başarım tetikleyicisi kavram kaymasını görür ama iki dönem geç görür; 2026-09’da düşen isabet 2026-11’de tetikler.
  • Kazancı belirleyen tetikleyici değil penceredir: aynı anda tetiklenen yeniden eğitim pencere 6 ile +0,0000, pencere 1 ile +0,1100 verir. Eski kuralın dönemlerini içeren bir pencere, aramayı çoğunluğa uydurup eski modeli yeniden bulur.

Sonraki Adım

Üç derste model gölgede ölçüldü, kanaryaya verildi, deneyle karşılaştırıldı ve yeniden eğitildi. Her adımda ortaya yeni bir model, yeni bir pencere ve yeni bir karar eşiği çıktı. Sorulmayan tek şey, 2026-12’de bir aboneye verilmiş tek bir tahminin aylar sonra kime sorulacağıdır: hangi model üretti, hangi öznitelik değerleriyle, hangi karar eşiğiyle. Sonraki ders bu soruyu bir arama olarak sayar — karar kaydı varken ve yokken bir tahminin nedenini bulmak için kaç satır okunuyor, kanarya döneminde kaç tahmin hiçbir okumayla açıklanamıyor ve kaydın kendisi kaç alan saklamaya mal oluyor.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat