---
title: 'Deney Takibi'
source: 'https://academia.sh/tr/kurslar/mlops-temelleri/deney-takibi'
course: 'MLOps Temelleri'
language: tr
updated: '2026-08-17T18:08:52+00:00'
license: 'CC BY-SA 4.0'
---

# Deney Takibi

Parametre, ölçüt ve çıktı kaydının bir koşumu yeniden bulunabilir kılmasının ölçülmesi: on sekiz koşumluk bir uzayda kayıt tutulmadığında bildirilen bir sayıyı üreten ağırlığı bulmak için 0,8078 hedefinde 3, 0,7955 hedefinde 2, 0,7950 hedefinde 5, 0,8067 hedefinde 1 ve hiç üretilmemiş bir hedefte 18 koşum yeniden koşturuluyor, tam kayıtla beşinde de 0 koşum tekrarlanıyor; sayının kendisi koşumu tanımlamıyor çünkü on sekiz koşumun on dördü 0,8067 veriyor ve yeniden koşturarak bulunan aday on dört adaydan yalnız biri oluyor; kaydın bedeli koşum başına dokuz alan ve toplam 162 alan, yalnız ölçüt kaydeden 36 alanlık defter ise beş aramadan yalnız birini kısaltıyor.

Önceki derste üç koşum yapıldı ve üç ayrı sayı çıktı. Üçünü yan yana görebilmemizin tek sebebi
üçünün de aynı blokta koşturulmuş olmasıydı. Gerçek bir çalışmada bu koşumlar günlere yayılır,
farklı kişiler tarafından yapılır ve geriye yalnız bir sayı kalır: bir sunumda yazılı, bir iletide
aktarılmış ya da bir kişinin hatırladığı bir isabet.

Bu ders o sayının peşine düşer. Elimizde bir koşum uzayı olsun ve birinden şu bilgi gelsin: "bir
koşum 0,8078 verdi". Soru tek: o koşumun ağırlıklarını ve kullandığı kalemleri bulmak ne kadar
işe mal olur. Ölçü, **tekrar koşturulan koşum sayısıdır**.

- **YU12.** Koşum uzayı **on sekiz koşumdur**: altı sabitleme düzeyi (sıfırdan beş kaleme kadar)
  çarpı üç tur. Uzay bir seçimdir ve ona duyarlı her sayı uzay boyutuyla birlikte yazılır.
- **YU13.** **Deney takibi**, bir koşumun parametrelerini, ölçütünü ve çıktısını koşumun kendisiyle
  birlikte saklamaktır. Bir ürün değil, bir **kayıt disiplinidir**.
- **YU14.** Taban çizgisi **kayıtsız kurulumdur**: hiçbir koşum yazılmamıştır, elde yalnız
  bildirilen sayı vardır.
- **YU15.** Kayıtsız aramanın yordamı şudur: uzay **baştan sona sırayla** yeniden koşturulur ve
  bildirilen sayı tuttuğu anda durulur. Tekrar sayısı bu sıraya bağlıdır ve sıra bir **seçimdir**.
- **YU16.** Kaydın bedeli **saklanan alan** olarak sayılır: kayıt başına alan sayısı çarpı koşum
  sayısı. Ham bayt yazılmaz.
- **YU17.** Eğitim pratiği, koşum değişkenliği ve ayar bütçesi Derin Öğrenme kursunda ölçüldü;
  burada **tekrarlanmaz**. Bu ders yalnız **kaydın aramayı ne kadar kısalttığını** sayar.
- **YU18.** Etiket dağılımı önceki derste kurulduğu gibi `{0: 1752, 1: 448}`, **taban sınıf oranı
  0,7964**'tür ve bu dersteki isabet sayıları o oranın üstünde bir başarım iddiası taşımaz.
  Çözünürlük **0,0017**'dir.

## Koşum Uzayı ve Defter

İlk blok önceki dersin kurgu kaynağını, hattını ve modelini aynen yeniden kurar.

```python
# KURGUDUR. Sayac okumalari, hat ve model ders icinde tanimlanir; gercek bir
# ogrenme kitapligi ya da deney takip urunu cagrilmaz.
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 a1_ayikla(kayit):
    ZOR = ("abone", "donem", "bolge", "endeks", "birim")
    tut = [k for k in kayit if all(a in k for a in ZOR)]
    return tut, len(kayit) - len(tut)


def a2_tekille(kayit):
    gor, tut = set(), []
    for k in kayit:
        ad = (k["abone"], k["donem"])
        if ad in gor:
            continue
        gor.add(ad)
        tut.append(k)
    return tut, len(kayit) - len(tut)


def a3_tuketim(kayit):
    tablo = {(k["abone"], k["donem"]): k for k in kayit}
    cikti, dusen = [], 0
    for k in kayit:
        i = DONEM.index(k["donem"])
        if i == 0:
            continue
        onceki = tablo.get((k["abone"], DONEM[i - 1]))
        if onceki is None:
            dusen += 1
            continue
        try:
            f = int(k["endeks"]) - int(onceki["endeks"])
        except (TypeError, ValueError):
            dusen += 1
            continue
        cikti.append(dict(k, m3=f))
    return cikti, dusen


EGITIM = DONEM[1:9]
SINAMA = DONEM[9:]
ESIK = 40


def satirlar():
    v, _ = a1_ayikla(kaynak_uret())
    v, _ = a2_tekille(v)
    v, _ = a3_tuketim(v)
    return v


def etiket(k):
    return 1 if k["m3"] > ESIK else 0


def oznitelikler(kayitlar, pencere=None, basamak=4):
    """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 and (pencere is None or d >= i - pencere))]
        return round(sum(secili) / len(secili), basamak) if secili else 0.0

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


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)]


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


def egit(kayitlar, oz, izgara=None, esik=ESIK, donemler=None):
    izgara = IZGARA if izgara is None else izgara
    donemler = EGITIM if donemler is None else donemler
    kume = [k for k in kayitlar if k["donem"] in donemler]
    en_iyi, en_iyi_w = -1.0, None
    for w in izgara:
        d = sum(1 for k in kume
                if (1 if puan(oz[(k["abone"], k["donem"])], w) > esik else 0) == etiket(k))
        o = d / len(kume)
        if o > en_iyi:
            en_iyi, en_iyi_w = o, w
    return {"agirlik": en_iyi_w, "egitim_isabeti": round(en_iyi, 4),
            "aday": len(izgara), "egitim_satiri": len(kume)}


def sina(kayitlar, model, oz, esik=ESIK, donemler=None):
    donemler = SINAMA if donemler is None else donemler
    kume = [k for k in kayitlar if k["donem"] in donemler]
    d = sum(1 for k in kume
            if (1 if puan(oz[(k["abone"], k["donem"])], model["agirlik"]) > esik else 0)
            == etiket(k))
    return round(d / len(kume), 4)


KALEM = ("veri_surumu", "oznitelik_kodu", "bolunme", "izgara", "yuvarlama")


def kosum(kayitlar, sabit, tur=0):
    """Sabitlenmeyen her kalem tur'a gore degisir."""
    kay = kayitlar if "veri_surumu" in sabit else kayitlar[: len(kayitlar) - 20 * tur]
    pencere = None if "oznitelik_kodu" in sabit else (None if tur == 0 else 12 - tur)
    basamak = 4 if "yuvarlama" in sabit else max(4 - tur, 0)
    izgara = IZGARA if "izgara" in sabit else IZGARA[: len(IZGARA) - 6 * tur]
    donemler = SINAMA if "bolunme" in sabit else DONEM[9 + (tur % 2):]
    oz = oznitelikler(kay, pencere, basamak)
    m = egit(kay, oz, izgara)
    return {"agirlik": m["agirlik"], "egitim": m["egitim_isabeti"],
            "sinama": sina(kay, m, oz, donemler=donemler)}
```

Bir deney kaydı, koşum bittikten sonra yazılan bir satır değildir; koşumun **kendi içinde**
üretilir, çünkü koşumun hangi kalemleri kullandığını yalnız koşumun kendisi bilir. Aşağıdaki
`kayit_uret` bunu yapar: uzaydaki bir koşumu çalıştırır ve o koşumun okuduğu satır sayısını,
denediği aday sayısını, öznitelik penceresini, sınama dönemi sayısını, bulduğu ağırlığı ve elde
ettiği isabeti tek bir kayda yazar.

```python
S = satirlar()
UZAY = [(KALEM[:n], tur) for n in range(6) for tur in range(3)]


def kayit_uret(no):
    """Uzaydaki no'lu kosumu calistirir ve kullandigi kalemleri kaydeder."""
    sabit, tur = UZAY[no - 1]
    r = kosum(S, sabit, tur)
    return {"kosum": no, "sabit": len(sabit), "tur": tur,
            "satir": len(S) if "veri_surumu" in sabit else len(S) - 20 * tur,
            "aday": len(IZGARA) if "izgara" in sabit else len(IZGARA) - 6 * tur,
            "pencere": None if "oznitelik_kodu" in sabit else (None if tur == 0 else 12 - tur),
            "sinama_donemi": len(SINAMA) if "bolunme" in sabit else len(DONEM) - 9 - (tur % 2),
            "agirlik": r["agirlik"], "sinama": r["sinama"]}


DEFTER = [kayit_uret(no) for no in range(1, len(UZAY) + 1)]
print("kosum:", len(DEFTER), " kayit basina alan:", len(DEFTER[0]),
      " saklanan alan:", len(DEFTER) * len(DEFTER[0]))
print()
print(f"{'kosum':<7}{'sabit':>6}{'tur':>5}{'satir':>7}{'aday':>6}{'pencere':>9}{'donem':>7}{'sinama':>9}")
for k in DEFTER[:3] + DEFTER[-3:]:
    print(f"{k['kosum']:<7}{k['sabit']:>6}{k['tur']:>5}{k['satir']:>7}{k['aday']:>6}"
          f"{str(k['pencere']):>9}{k['sinama_donemi']:>7}{k['sinama']:>9.4f}")
say = {}
for k in DEFTER:
    say[k["sinama"]] = say.get(k["sinama"], 0) + 1
print()
print("farkli sinama sayisi:", len(say), " sayi -> kac kosum:", dict(sorted(say.items())))
```

```
kosum: 18  kayit basina alan: 9  saklanan alan: 162

kosum   sabit  tur  satir  aday  pencere  donem   sinama
1           0    0   2200    27     None      3   0.8067
2           0    1   2180    21       11      2   0.7955
3           0    2   2160    15       10      3   0.8078
16          5    0   2200    27     None      3   0.8067
17          5    1   2200    27     None      3   0.8067
18          5    2   2200    27     None      3   0.8067

farkli sinama sayisi: 4  sayi -> kac kosum: {0.795: 2, 0.7955: 1, 0.8067: 14, 0.8078: 1}
```

Defterin ilk üç satırı önceki dersin sabitlemesiz tabanıdır; son üç satırda beş kalemin hepsi
sabitlenmiştir ve üç tur da aynı satırı, aynı adayı, aynı pencereyi ve aynı sınama dönemini
kullanır. Son satır asıl bulguyu verir: on sekiz koşum yalnız **dört ayrı sayı** üretmiştir ve
bunlardan **0,8067 on dört koşumda** çıkmıştır.

## Bir Sayıyı Üreten Koşumu Aramak

Şimdi kaydın işe yaradığı yer ölçülebilir. Kayıtsız kurulumda elde yalnız bildirilen sayı vardır ve
tek yordam uzayı baştan yeniden koşturmaktır. Kayıtlı kurulumda defter okunur. Arada bir üçüncü
durum daha vardır ve pratikte en sık görülen odur: **yalnız ölçüt kaydedilmiştir**, yani koşum
numarası ile isabet yazılmış ama parametreler yazılmamıştır.

```python
HEDEF = (0.8078, 0.7955, 0.7950, 0.8067, 0.8100)


def kayitsiz_ara(hedef):
    """Kayit yok: uzay bastan tekrar kosturulur, sayi tutunca durulur."""
    tekrar = 0
    for sabit, tur in UZAY:
        tekrar += 1
        if kosum(S, sabit, tur)["sinama"] == hedef:
            return tekrar
    return tekrar


OLCUT = [(k["kosum"], k["sinama"]) for k in DEFTER]
print("yalniz olcut kaydi -- alan:", len(OLCUT) * 2, " tam kayit -- alan:",
      len(DEFTER) * len(DEFTER[0]))
print()
print(f"{'hedef':<9}{'kayitsiz':>10}{'yalniz olcut':>14}{'tam kayit':>11}{'ayni sayiyi veren':>19}")
for h in HEDEF:
    a = kayitsiz_ara(h)
    aday = [k["kosum"] for k in DEFTER if k["sinama"] == h]
    o = 0 if not any(s == h for _, s in OLCUT) else a
    print(f"{h:<9.4f}{a:>10}{o:>14}{0:>11}{len(aday):>19}")
print()
print("0,8067 veren kosumlar:", [k["kosum"] for k in DEFTER if k["sinama"] == 0.8067])
```

```
yalniz olcut kaydi -- alan: 36  tam kayit -- alan: 162

hedef      kayitsiz  yalniz olcut  tam kayit  ayni sayiyi veren
0.8078            3             3          0                  1
0.7955            2             2          0                  1
0.7950            5             5          0                  2
0.8067            1             1          0                 14
0.8100           18             0          0                  0

0,8067 veren kosumlar: [1, 4, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
```

İlk sütun kayıtsız kurulumun bedelidir ve hedefe göre 1 ile 18 arasında değişir. Son satır en
pahalısıdır: bildirilen 0,8100 bu uzayda hiç üretilmemiştir, dolayısıyla arama **on sekiz koşumun
tamamını** tekrarlar ve elde hiçbir şey kalmaz. Bu, kayıtsız aramanın en sık karşılaşılan sonucudur,
çünkü bildirilen sayı çoğu zaman uzayın o günkü hâlinden gelir ve uzay değişmiştir.

Üçüncü sütun her hedefte **0**'dır. Tam kayıtla arama bir koşum tekrarı gerektirmez; defter okunur
ve o kadar.

## Sayı Koşumu Tanımlamaz

Tablonun asıl bulgusu son sütunda durur ve tekrar sayılarından daha önemlidir. 0,8067 hedefinde
kayıtsız arama **bir** koşumda "başarılı" olur: uzayın birinci koşumu bu sayıyı verir ve arama
durur. Ama aynı sayıyı **on dört koşum** veriyor. Aramanın bulduğu birinci koşum, bildirilen sayıyı
üreten koşum olmak zorunda değildir; on dört adaydan yalnız biridir.

Bunun sonucu şudur: yeniden koşturma **bir sayıyı** yeniden üretebilir, ama **bir koşumu** teşhis
edemez. Bildirilen sayı 0,8067 ise, o koşumun 2200 satır mı 2160 satır mı okuduğu, 27 aday mı 15
aday mı denediği ve sınamayı üç döneme mi iki döneme mi ayırdığı sayıdan çıkarılamaz. Defter bu
soruların hepsini tek satırda yanıtlar ve on dört adayı birbirinden ayırır. Kaydın verdiği şey
**tekrar tasarrufu değil, teşhistir**; tekrar tasarrufu yan üründür.

## Kaydın Bedeli

Defterin bedeli iki kalemdir. Birincisi **saklanan alandır**: her koşum dokuz alan yazar, on sekiz
koşum **162 alan** tutar. Bu alan koşum sayısıyla doğru orantılı büyür; bir ayar taramasında yüzlerce
koşum yapılırsa defter de o oranda büyür ve bir saklama politikası gerektirir. İkincisi **eklenen
adımdır**: `kayit_uret` koşumun içinde çalışır, yani eğitim hattına bir yazma adımı girer ve o adım
koşumun kullandığı kalemleri okumak zorundadır. Kalemi okuyamayan bir kayıt onu yazamaz.

İkinci sütun bu bedelin nasıl boşa harcanabileceğini gösterir. Yalnız ölçüt kaydeden defter 36 alan
tutar, yani tam defterin beşte birinden azdır, ve beş aramadan **yalnız birini** kısaltır: hiç
üretilmemiş 0,8100 hedefinde on sekiz tekrarı sıfıra indirir. Kalan dört hedefte tekrar sayısı
kayıtsız kurulumla **birebir aynıdır**, çünkü parametre yazılmadığında koşum yine yeniden
koşturulmak zorundadır. Bir defter tutuluyor olması bir güvence değildir; **hangi alanları tuttuğu**
ölçülmedikçe defter bir bedelden ibarettir.

## Özet

- Deney takibi bir koşumun parametrelerini, ölçütünü ve çıktısını koşumun kendi içinde yazmaktır;
  kalemleri yalnız koşumun kendisi bildiği için kayıt sonradan tamamlanamaz.
- On sekiz koşumluk uzay yalnız **dört ayrı sayı** üretir ve **0,8067 on dört koşumda** çıkar.
- Kayıtsız kurulumda bildirilen bir sayıyı üreten koşumu bulmak **1**, **2**, **3**, **5** ya da
  **18** koşum tekrarına mal olur; hiç üretilmemiş bir sayıda uzayın tamamı boşa koşturulur. Tam
  kayıtla beş hedefte de tekrar sayısı **0**'dır.
- Yeniden koşturma bir sayıyı yeniden üretir ama koşumu teşhis edemez: 0,8067 hedefinde arama bir
  tekrarda durur ve bulduğu koşum **on dört adaydan** yalnız biridir.
- Kaydın bedeli koşum başına **dokuz alan**, toplam **162 alan** ve eğitim hattına eklenen bir yazma
  adımıdır.
- Yalnız ölçüt kaydeden **36 alanlık** defter beş aramadan yalnız birini kısaltır; bir defterin
  varlığı değil, **hangi alanları tuttuğu** ölçülür.

## Sonraki Adım

Defter koşumun kullandığı satır sayısını yazdı, ama satırların **hangileri** olduğunu yazmadı. On
sekiz koşumun hepsi verisini aynı yerden okudu ve o yerin adı hiç değişmedi; içeriğinin değişip
değişmediği ise sorulmadı. Bir koşum 2200 satır okuduğunu kaydettiğinde, bir hafta sonraki koşum da
2200 satır okuduğunu kaydeder ve iki sayı aynı görünür. Sonraki ders bu adın altındaki içeriği
ölçer: sürümsüz bir kurulumda kaç koşum aynı adı gösterip farklı sonuç veriyor, sürümle kaç, ve
sürümün kendi bedeli ne kadar.
