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 > 30kuralı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-12isabetine 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 isabet2026-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.