Ders 12 / 13
Maliyet Yönetimi
Eğitim ile çıkarımın ayrı izlenmesi ve tek toplamın hangi kararı gizlediğinin sayılması: iş birimi bir puan hesabıdır, altı izleme döneminin çıkarımı 1200 puan hesabı tutar ve sıklık ne olursa olsun sabit kalır, bir yeniden eğitim ise 162.000 tutar. Yeniden eğitim sıklığı altı dönemde bire indiğinde eğitim kalemi 162.000'den 972.000'e çıkar, eğitim payı 0,9926'dan 0,9988'e yükselir ve 2026-12 isabeti beş kurulumun beşinde de 0,9800'de kalır; kazanılan isabet 0,0000 olduğu için kazanç başına maliyet tanımsızdır. Toplamdan okunan tahmin başına maliyet 811,00, çıkarımdan okunan 1,00'dir: çıkarımı tümüyle bedavaya indirmek toplamın 0,0012'sini siler, sıklığı bire birden altıya indirmek 0,8323'ünü siler ve karşılığında 0,0000 isabet ödenir. Kesişme noktası dönem başına 27.000 ile 162.000 istek arasındadır.
İçindekiler
Bir önceki ders dışarıya karşı olan borcu alan ve kayıt olarak yazdı: dört yükümlülük sınıfı, karar başına yedi alan, 8402 saklanan değer. Sayılan her şey saklamaya yazıldı. Modeli çalışır tutmanın kendisi, yani her dönem tekrar tekrar yapılan iş, hiçbir satıra girmedi.
O iş tek parça değildir. Bir üretim modeli iki ayrı iş yapar: dönem dönem yeniden eğitilir ve her dönem çıkarım üretir. İkisi genellikle tek bir bütçe kalemine yazılır ve tek bir toplam olarak okunur. Bu ders o toplamı ikiye ayırır, yeniden eğitim sıklığını süpürür ve tek sayıda okumanın hangi kararı görünmez kıldığını sayar.
- MY47. Kaynak, hat, öznitelik yolu, model ve maliyet sayacı kurgudur. Hiçbir bulut servisi, hızlandırıcı, ürün ya da fiyat çağrılmaz; para birimi yazılmaz. Tohum 20260218.
- MY48. İş birimi bir puan hesabıdır: bir satırın özniteliklerinin ağırlıklarla
çarpılıp toplanması. Eğitim de çıkarım da yalnız bunu yapar, bu yüzden ikisi aynı birimle
aynı tabloya girer. Sayaç
puanişlevinin içindedir; maliyet varsayılmaz, ölçülür. - MY49. Süre yazılmaz. Maliyet puan hesabı olarak sayılır, gecikme dönem olarak.
- MY50. Taban çizgisi yeniden eğitimsiz kurulumdur: ilk model bir kez eğitilir ve altı izleme dönemi boyunca hiç değişmez.
- MY51. Üretimde girdi kayıyor:
2026-09’dan sonra işyeri tüketimi dönem başına 0,06 büyüyor. Model(0.6, 0.0, 4), karar eşiği 18, aday 135, eğitim satırı 1600. İzleme altı dönem, taban sınıf oranı 0,5342, dönem isabetinin adımı 0,0050. - MY52. Çıkarım hacmi dönem başına 200 istektir ve son bölümde bir serbest değişken olarak süpürülür.
Tahmin başına maliyet muhasebesi Model API’leri ile Uygulama Geliştirme kursunda ve MLOps Temelleri kursunun ölçekleme dersinde ölçüldü; yordamları tekrarlanmaz ve buradaki ölçü onların üstüne tek bir şey ekler: eğitim ile çıkarım ayrı sayılır.
İki Kalemin Ayrı Sayılması
İlk blok kaynağı, öznitelik yolunu ve modeli kurar, puan işlevine bir sayaç yerleştirir ve
yeniden eğitim sıklığını süpürür.
# KURGUDUR. Kaynak , hattin tuketim asamasi , oznitelik yolu , esik modeli ve # maliyet sayaci ders icinde uretilir; hicbir bulut servisi , hizlandirici , # urun ya da fiyat 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 kaynak_uret(): 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, "birim": "m3"}) return kayit def tuketim(kayit): tablo = {(k["abone"], k["donem"]): k for k in kayit} cikti = [] for k in kayit: i = DONEM.index(k["donem"]) onceki = tablo.get((k["abone"], DONEM[i - 1])) if i else None if onceki is not None: cikti.append(dict(k, m3=int(k["endeks"]) - int(onceki["endeks"]))) return cikti def oznitelikler(kayitlar): """Agirliktan bagimsizdir , bir kez hesaplanir.""" sirali = sorted(kayitlar, key=lambda k: DONEM.index(k["donem"])) ab, bo = {}, {} for k in sirali: ab.setdefault(k["abone"], []).append((DONEM.index(k["donem"]), k["m3"])) bo.setdefault(k["bolge"], []).append((DONEM.index(k["donem"]), k["m3"])) def ortalama(dizi, i): secili = [v for d, v in dizi if d < i] return round(sum(secili) / len(secili), 4) if secili else 0.0 return {(k["abone"], k["donem"]): { "abone_ort": ortalama(ab[k["abone"]], DONEM.index(k["donem"])), "bolge_ort": ortalama(bo[k["bolge"]], DONEM.index(k["donem"])), "isyeri": 1 if k["tip"] == "isyeri" else 0} for k in kayitlar} 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) IZLEME = DONEM[6:] KURAL_ESIK, KURAL_ISYERI = 30, 6 SAYAC = {"puan": 0} # tek is birimi: bir puan hesabi def puan(o, w): SAYAC["puan"] += 1 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 etiket(o, esik=KURAL_ESIK): return 1 if o["abone_ort"] + KURAL_ISYERI * o["isyeri"] > esik else 0 def egit(kayitlar, oz, donemler): """Egitim olcutu dengeli isabet; karar esigi AYRI bir ayardir ve aranir.""" kume = [k for k in kayitlar if k["donem"] in donemler] en = (-1.0, None, None) for w in IZGARA: for karar in KARAR_IZGARA: dp = dn = yp = yn = 0 for k in kume: o = oz[(k["abone"], k["donem"])] t, g = tahmin(o, w, karar), etiket(o) dp, yp, yn, dn = (dp + (t and g), yp + (t and not g), yn + (not t and g), dn + (not t and not g)) d = (dp / (dp + yn) if dp + yn else 0.0) + (dn / (dn + yp) if dn + yp else 0.0) if d / 2 > en[0]: en = (d / 2, w, karar) return {"agirlik": en[1], "karar_esigi": en[2], "dengeli": round(en[0], 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 isabet(kayitlar, m, oz, donem): kume = [k for k in kayitlar if k["donem"] == donem] d = sum(1 for k in kume if tahmin(oz[(k["abone"], k["donem"])], m["agirlik"], m["karar_esigi"]) == etiket(oz[(k["abone"], k["donem"])])) return round(d / len(kume), 4) TEMIZ = tuketim(kaynak_uret()) OZ_T = oznitelikler(TEMIZ) IZL_T = [k for k in TEMIZ if k["donem"] in IZLEME] p1 = sum(etiket(OZ_T[(k["abone"], k["donem"])]) for k in IZL_T) / len(IZL_T) KAYAN = kaydir(TEMIZ) # uretimde girdi kayiyor OZ = oznitelikler(KAYAN) SAYAC["puan"] = 0 ILK = egit(KAYAN, OZ, DONEM[1:9]) ILK_MALIYET = SAYAC["puan"] print(f"taban sinif orani {round(max(p1, 1 - p1), 4)} , izleme donemi {len(IZLEME)} ," f" donem basina istek 200") print(f"ilk egitim: agirlik {ILK['agirlik']} , karar esigi {ILK['karar_esigi']} ," f" satir {ILK['satir']} , aday {len(IZGARA) * len(KARAR_IZGARA)}") print(f"olculen egitim maliyeti (puan hesabi): {ILK_MALIYET}") SAYAC["puan"] = 0 son = isabet(KAYAN, ILK, OZ, "2026-12") print(f"bir donemlik cikarim maliyeti (puan hesabi): {SAYAC['puan']} ," f" 2026-12 isabeti {son}") PENCERE = 6 print("\nsiklik yeniden egitim egitim maliyeti cikarim maliyeti toplam" " egitim payi 2026-12 isabeti") SONUC = [] for f in (0, 6, 3, 2, 1): SAYAC["puan"] = 0 m = ILK if f: for i, d in enumerate(IZLEME): if (i + 1) % f == 0: j = DONEM.index(d) m = egit(KAYAN, OZ, [x for x in DONEM if j - PENCERE < DONEM.index(x) <= j]) egitim = SAYAC["puan"] SAYAC["puan"] = 0 isb = isabet(KAYAN, m, OZ, "2026-12") cikarim = len(IZLEME) * 200 toplam = egitim + cikarim SONUC.append((f, egitim, cikarim, toplam, isb)) print(f"{f if f else '-':>6} {len(IZLEME) // f if f else 0:>14} {egitim:>15}" f" {cikarim:>16} {toplam:>6} {round(egitim / toplam, 4):>11} {isb:>15}")
taban sinif orani 0.5342 , izleme donemi 6 , donem basina istek 200
ilk egitim: agirlik (0.6, 0.0, 4) , karar esigi 18 , satir 1600 , aday 135
olculen egitim maliyeti (puan hesabi): 216000
bir donemlik cikarim maliyeti (puan hesabi): 200 , 2026-12 isabeti 0.98
siklik yeniden egitim egitim maliyeti cikarim maliyeti toplam egitim payi 2026-12 isabeti
- 0 0 1200 1200 0.0 0.98
6 1 162000 1200 163200 0.9926 0.98
3 2 324000 1200 325200 0.9963 0.98
2 3 486000 1200 487200 0.9975 0.98
1 6 972000 1200 973200 0.9988 0.98
İki kalem arasındaki ölçek farkı doğrudan sayaçtan gelir. Bir dönemlik çıkarım 200 puan hesabıdır ve altı dönemde 1200 eder; ilk eğitim 1600 satırı 135 adayla tarar ve 216.000 tutar. Altı dönemlik pencereyle yapılan bir yeniden eğitim 162.000‘dir, yani bütün izleme ufkunun çıkarımının 135 katı. Sıklık sütunu boyunca çıkarım kalemi hiç değişmez; değişen yalnız eğitim kalemidir ve altı dönemde birden her döneme geçildiğinde 162.000’den 972.000’e çıkar.
Son sütun bu artışın karşılığını yazar. 2026-12 isabeti beş kurulumun beşinde de
0,9800’dür — hiç yeniden eğitilmeyen modelinkiyle birebir aynı. Bu, kursun ikinci
iddiasının maliyet tarafındaki karşılığıdır: girdi kaydı, uyarı ateşledi, altı yeniden eğitim
koşuldu ve isabet tek bir adım bile oynamadı. Dönem adımı 0,0050 olduğuna göre 0,0000
gerçekten sıfırdır, ölçülemeyen küçük bir kazanç değil. Kural değişmediği sürece doğru bir
model kaymış girdide de doğru kalır ve yeniden eğitim yalnız bedeli getirir.
Tek Toplamın Gizlediği
İkinci blok aynı sonuçları tahmin başına okur ve çıkarım hacmini süpürür.
# Bu blok ilk bloktaki SONUC , IZLEME , ILK_MALIYET ve PENCERE tanimlarini surdurur. taban_isabet = SONUC[0][4] n_tahmin = len(IZLEME) * 200 print("siklik toplamdan tahmin basina cikarimdan tahmin basina" " kazanilan isabet kazanc basina maliyet") for f, egitim, cikarim, toplam, isb in SONUC: kazanc = round(isb - taban_isabet, 4) bas = "tanimsiz" if kazanc <= 0 else str(round(egitim / kazanc)) print(f"{f if f else '-':>6} {round(toplam / n_tahmin, 2):>22}" f" {round(cikarim / n_tahmin, 2):>24} {kazanc:>16} {bas:>21}") print(f"\ncikarimi tumuyle bedavaya indirmenin toplamdan sildigi pay:" f" {round(SONUC[-1][2] / SONUC[-1][3], 4)}") print(f"siklik 1'den siklik 6'ya inmenin toplamdan sildigi pay:" f" {round((SONUC[-1][3] - SONUC[1][3]) / SONUC[-1][3], 4)}" f" , odenen isabet {round(SONUC[1][4] - SONUC[-1][4], 4)}") print("\ndonem basina istek cikarim (6 donem) egitim siklik 6 egitim siklik 1" " cikarim hangisini gecti") for istek in (200, 2000, 20000, 50000, 200000): c = len(IZLEME) * istek gecen = [str(f) for f, e, _, _, _ in SONUC[1:] if c > e] print(f"{istek:>18} {c:>17} {SONUC[1][1]:>15} {SONUC[-1][1]:>15}" f" {(' , '.join(gecen) if gecen else 'hicbiri'):>23}") print(f"\nkesisme noktasi (donem basina istek): siklik 6 -> {SONUC[1][1] // len(IZLEME)}" f" , siklik 1 -> {SONUC[-1][1] // len(IZLEME)}") # Izlemenin kendi kalemi: uc gosterge her donem hesaplanir. gosterge = len(IZLEME) * 200 # tahmin payi , cikarim tahminleri yeniden kullanilirsa 0 print(f"izleme kalemi (puan hesabi): en cok {gosterge} , cikarim tahminleri" f" yeniden kullanildiginda 0 ; bir yeniden egitim {ILK_MALIYET}")
siklik toplamdan tahmin basina cikarimdan tahmin basina kazanilan isabet kazanc basina maliyet
- 1.0 1.0 0.0 tanimsiz
6 136.0 1.0 0.0 tanimsiz
3 271.0 1.0 0.0 tanimsiz
2 406.0 1.0 0.0 tanimsiz
1 811.0 1.0 0.0 tanimsiz
cikarimi tumuyle bedavaya indirmenin toplamdan sildigi pay: 0.0012
siklik 1'den siklik 6'ya inmenin toplamdan sildigi pay: 0.8323 , odenen isabet 0.0
donem basina istek cikarim (6 donem) egitim siklik 6 egitim siklik 1 cikarim hangisini gecti
200 1200 162000 972000 hicbiri
2000 12000 162000 972000 hicbiri
20000 120000 162000 972000 hicbiri
50000 300000 162000 972000 6
200000 1200000 162000 972000 6 , 3 , 2 , 1
kesisme noktasi (donem basina istek): siklik 6 -> 27000 , siklik 1 -> 162000
izleme kalemi (puan hesabi): en cok 1200 , cikarim tahminleri yeniden kullanildiginda 0 ; bir yeniden egitim 216000
İlk iki sütun dersin sorusunu yanıtlar. Toplam tek bir sayı olarak okunup tahmin sayısına bölündüğünde tahmin başına maliyet 811,00‘dir; aynı hesap yalnız çıkarım kaleminden yapıldığında 1,00. Aradaki 810 katın tamamı eğitimdir ve hiçbir tahmine ait değildir. Bu tek sayıyı gören bir okur, tahminin pahalı olduğu sonucuna varır ve çıkarımı ucuzlatmaya yönelir: toplu istek, önbellek, küçültme. **O yolun tavanı 0,0012’dir** — çıkarım tümüyle bedava olsaydı bile toplamın binde birinden azı silinirdi.
Görünmez kalan karar öbür yöndedir. Sıklığı her dönemden altı dönemde bire indirmek toplamın 0,8323’ünü siler ve karşılığında 0,0000 isabet ödenir. Tek toplam bu kararı gizler, çünkü toplamda eğitim ile çıkarımı birbirinden ayıran hiçbir işaret yoktur; eğitim payı 0,9926 ile 0,9988 arasındadır ve hangi sıklıkta olunduğu toplamdan okunamaz. İki kalem ayrı sayıldığında karar tek satırdır. Kazanç başına maliyet sütunu aynı şeyi bir kez daha söyler: beş kurulumun beşinde tanımsız, çünkü bölen sıfırdır. Bir maliyet kaleminin gerekçesi ancak bir kazançla birlikte yazılabilir; kazancı gösterilmeyen harcama ölçülmemiş sayılır.
Son süpürme kararın hacme bağlı olduğunu gösterir. Dönem başına 200 istekte çıkarım hiçbir eğitim kalemini geçmez; 50.000 istekte yalnız en seyrek sıklığı geçer; 200.000 istekte dördünü birden geçer. Kesişme noktası sıklık 6 için dönem başına 27.000, sıklık 1 için 162.000 istektir. Bu, “eğitim her zaman baskındır” gibi bir sonucun yazılamayacağı anlamına gelir: baskın kalem hacmin hangi yanında durulduğuna bağlıdır ve tek toplam o yanı da göstermez.
İzlemenin kendi kalemi bu tablonun en küçük satırıdır. Üç göstergeyi altı dönem boyunca hesaplamak en çok 1200 puan hesabıdır ve çıkarımda üretilmiş tahminler yeniden kullanıldığında sıfıra iner. Ama izlemenin tetiklediği iş küçük değildir: ateşleyen tek bir uyarının başlattığı yeniden eğitim 162.000’dir. İzlemenin bedeli göstergenin kendisinde değil, göstergeye verilen yanıttadır.
Özet
- İş birimi bir puan hesabıdır ve sayaç
puanişlevinin içindedir; eğitim ile çıkarım aynı birimle aynı tabloya girer. Bir dönemlik çıkarım 200, ilk eğitim 216.000, altı dönemlik pencereyle bir yeniden eğitim 162.000 puan hesabıdır. - Sıklık süpürmesinde çıkarım kalemi 1200’de sabit kalır, eğitim kalemi 162.000’den 972.000’e çıkar ve eğitim payı 0,9926’dan 0,9988’e yükselir.
2026-12isabeti beş kurulumun beşinde de 0,9800’dür. Dönem adımı 0,0050 olduğuna göre kazanılan isabet gerçekten 0,0000’dır ve kazanç başına maliyet tanımsızdır.- Toplamdan okunan tahmin başına maliyet 811,00, çıkarımdan okunan 1,00‘dir. Çıkarımı bedavaya indirmek toplamın 0,0012’sini, sıklığı seyreltmek 0,8323’ünü siler; ikincisi 0,0000 isabete mal olur ve tek toplamda görünmez.
- Kesişme noktası dönem başına 27.000 ile 162.000 istek arasındadır; hangi kalemin baskın olduğu hacme bağlıdır. İzlemenin kendi kalemi en çok 1200’dür, tetiklediği yeniden eğitim 162.000.
Sonraki Adım
İki kalem ayrıldı ve ikisinin de karşılığı yazıldı: yeniden eğitim 0,0000 isabet kazandırıyor, çıkarım ise dönem başına 200 istek karşılığında modelin bütün değerini üretiyor. Bu tabloda eksik olan tek sütun sonun sütunudur. Yeniden eğitim seyreltilebilir, çıkarım ucuzlatılabilir, kayıt kısaltılabilir; ama bir modelin ne zaman biteceği hiçbir yerde yazılı değildir. Sonraki ders emekliye ayırma kararının ölçüsünü kurar ve modeli kaldırmanın geriye dönük ne bıraktığını sayar: kaldırıldığında kaç dönemin kararı açıklanamaz hâle geliyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.