26.3 Hibaszeletek és felelős értékelés

26.3.1 Cél és konkrét helyzet

A Northstar modell a rendelés pillanatában becsli, hogy a kézbesítés meghaladja-e a 7 napot. A kalibrált teszt-predikciók már rendelkezésre állnak: minden rendeléshez van y_true, p_hat és a 0,5-ös küszöbből képzett y_pred. A kérdés most az, hogy a modell viselkedése egyenletes-e a region három szeletében: north, central, south.

Bemenet: a teszt halmaz order_id, region, y_true, p_hat, y_pred = (p_hat >= 0.5).astype(int) oszlopokkal. A megfigyelési egység a rendelés; egy ügyfél több rendelést is adhat, ez fontos korlát lesz.

Kimenet: szeletenkénti hibamátrix (confusion matrix), mintanagyság, prevalencia, TPR/FPR, és ezek 95%-os Wilson-konfidenciaintervalluma. Az érzékenységi elemzés a küszöböt és a többszörös összehasonlítást is vizsgálja.

Induló feladat: mielőtt tovább olvasol, gondold végig: miért lehet félrevezető az összesített accuracy, ha a south régióban csak 100 rendelés van, és ott a késések aránya 5%?


26.3.2 Fogalmi magyarázat

26.3.2.1 Szeletelemzés (slice analysis)

A szeletelemzés a modell értékelését egy kategorikus változó értékei szerint bontja részekre. Itt a szelet a teszt halmaz azon rendeléseiből áll, ahol region egy adott értéket vesz fel. A szeletelt hibamátrix minden szeletben megadja:

Ebből számítjuk a feltételes arányokat. A prevalencia a pozitív osztály aránya a szeletben: π=P(Y=1∣szelet)\pi = P(Y=1 \mid \text{szelet}), becslése π̂=(TP+FN)/n\hat\pi = (\text{TP}+\text{FN})/n, ahol nn a szelet mintanagysága. A TPR (true positive rate, szenzitivitás) a tényleges pozitívok eltalálási aránya: TPR=TP/(TP+FN)\text{TPR} = \text{TP}/(\text{TP}+\text{FN}). Az FPR (false positive rate) a tényleges negatívok téves pozitív aránya: FPR=FP/(FP+TN)\text{FPR} = \text{FP}/(\text{FP}+\text{TN}). A PPV (precision) a pozitív predikciók találati aránya: PPV=TP/(TP+FP)\text{PPV} = \text{TP}/(\text{TP}+\text{FP}).

A PPV a prevalenciától függ; a kalibrálásnál használt összefüggés:

PPV=TPR⋅πTPR⋅π+FPR⋅(1−π) \text{PPV} = \frac{\text{TPR}\cdot \pi}{\text{TPR}\cdot \pi + \text{FPR}\cdot (1-\pi)}

Ezért azonos TPR és FPR mellett is más PPV-t kapunk, ha a prevalencia eltér.

26.3.2.2 Kicsi csoportok bizonytalansága és standard error

A szeletelt arányok mintából számított becslések, ezért van standard hibájuk. Az x/nx/n binomiális arány klasszikus standard hibája:

SE(p̂)=p̂(1−p̂)n SE(\hat p) = \sqrt{\frac{\hat p(1-\hat p)}{n}}

ahol p̂\hat p a becsült arány, nn a szelet mérete. Kicsi nn-nél a normál approximáció félrevezető, ezért a Wilson-konfidenciaintervallumot használjuk. z=Φ−1(1−α/2)z = \Phi^{-1}(1-\alpha/2) mellett:

p̂=xn,D=1+z2n,c=p̂+z2/(2n)D,m=zp̂(1−p̂)/n+z2/(4n2)D \hat p = \frac{x}{n}, \quad D = 1 + \frac{z^2}{n}, \quad c = \frac{\hat p + z^2/(2n)}{D}, \quad m = \frac{z\sqrt{\hat p(1-\hat p)/n + z^2/(4n^2)}}{D}

A CI: [c−m,c+m][c-m,\; c+m]. Ez a képlet x=0x=0-ra és x=nx=n-re sem ad [0,1]-en kívüli határt, ezért kis mintán is használható.

26.3.2.3 Többtesztelés

Ha három régió TPR-jét egyszerre vizsgáljuk, a három, egyenként pontosan 95%-os intervallum együttes lefedettsége független lefedési események esetén 0,953≈0,8570{,}95^3 \approx 0{,}857; függő intervallumoknál ez a szorzat nem alkalmazható; a téves különbség észlelésének esélye nő. A Bonferroni-korrekció a családonkénti α\alpha-t osztja el a szeletek kk számával: αkorr=α/k\alpha_{\text{korr}} = \alpha/k. Három szeletnél a korrigált CI-szint 1−0,05/3=0,98331 - 0{,}05/3 = 0{,}9833, azaz z≈2,394z \approx 2{,}394. Ezt az érzékenységi elemzésnél alkalmazzuk.

26.3.2.4 Fairness-metrikák és trade-off

A szeletelt hibamátrixból három gyakori csoport-mérték számítható:

A küszöb mozgatása a TPR–FPR síkon mozgatja a modellt: alacsonyabb küszöb növeli a TPR-t és az FPR-t is. Ha a csoportok score-eloszlása eltér, ugyanaz a küszöb csoportonként más TPR/FPR arányt ad; a csoportok közötti egyenlőség és az összesített pontosság között trade-off lehet. A Northstar region mesterséges üzleti kategória, nem valós védett tulajdonság; a fairness-metrikák itt technikai gyakorlatok, nem jogi audit.


26.3.3 Teljes minimális példa

Készítsünk 9 rendelésből álló kézzel ellenőrizhető adatot:

import pandas as pd
import numpy as np
from scipy.stats import norm

# Kézi kis adat: 9 rendelés, 3 régió
df = pd.DataFrame({
    "order_id": [f"R{i}" for i in range(1, 10)],
    "region":   ["north"]*3 + ["central"]*4 + ["south"]*2,
    "y_true":   [0, 1, 0,   1, 0, 1, 1,   1, 0],
    "p_hat":    [0.30, 0.80, 0.55,   0.70, 0.20, 0.40, 0.90,   0.40, 0.10],
})
df["y_pred"] = (df["p_hat"] >= 0.5).astype(int)

def wilson_ci(x, n, level=0.95):
    """Wilson CI binomiális x/n arányra."""
    z = norm.ppf(1 - (1 - level) / 2)
    p = x / n if n > 0 else np.nan
    D = 1 + z**2 / n
    c = (p + z**2 / (2*n)) / D
    m = z * np.sqrt(p*(1-p)/n + z**2 / (4*n**2)) / D
    return c - m, c + m

rows = []
for region, g in df.groupby("region"):
    n = len(g)
    tp = ((g.y_true == 1) & (g.y_pred == 1)).sum()
    fp = ((g.y_true == 0) & (g.y_pred == 1)).sum()
    tn = ((g.y_true == 0) & (g.y_pred == 0)).sum()
    fn = ((g.y_true == 1) & (g.y_pred == 0)).sum()
    prev = (tp + fn) / n
    tpr = tp / (tp + fn) if (tp + fn) > 0 else np.nan
    fpr = fp / (fp + tn) if (fp + tn) > 0 else np.nan
    tpr_ci = wilson_ci(tp, tp + fn)
    fpr_ci = wilson_ci(fp, fp + tn)
    rows.append((region, n, tp, fp, tn, fn, prev, tpr, fpr, tpr_ci, fpr_ci))

result = pd.DataFrame(rows, columns=[
    "region", "n", "TP", "FP", "TN", "FN",
    "prevalence", "TPR", "FPR", "TPR_CI", "FPR_CI"
])
print(result[["region", "n", "TP", "FP", "TN", "FN", "prevalence", "TPR", "FPR"]])

A kód kimenete az alábbi szemléltető, elméletileg várt táblázat (a kézi adatból számítva, nem futtatott jegyzék):

region n TP FP TN FN prevalence TPR FPR
north 3 1 1 1 0 0,333 1,00 0,50
central 4 2 0 1 1 0,750 0,667 0,00
south 2 0 0 1 1 0,500 0,00 0,00

Kézi kontroll: north-ban a három sor (0,0), (1,1), (0,1), tehát TN=1, TP=1, FP=1, FN=0; az összeg 3. A central TPR CI-ja: x=2,n=3x=2, n=3, p̂=2/3\hat p=2/3, z=1,96z=1{,}96; a fenti képlettel c≈0,573c \approx 0{,}573, m≈0,365m \approx 0{,}365, azaz TPRCI≈[0,21,0,94]\text{TPR}_{\text{CI}} \approx [0{,}21,\; 0{,}94]. A south TPR CI-ja x=0,n=1x=0, n=1 esetén [0,0,79][0,\; 0{,}79]. Ez jól mutatja, hogy a kis csoportban a pontbecslés 0,00 mellett a CI felső határa is hasznos információ.


26.3.4 Labor: három region szelet a Northstar tesztjén

Labor specifikáció. Bemenet: a teszt halmaz y_true, p_hat, region oszlopokkal. A y_pred definíciója p_hat >= 0.5. Kimenet: a fenti táblázat a három régióra, plusz a TPR és FPR Wilson 95% CI; majd érzékenységi elemzés: (1) küszöb 0,35 és 0,65 mellett a TPR/FPR változása; (2) Bonferroni-korrigált 98,3%-os CI a három szelet együttes értékeléséhez; (3) ügyfélszintű klaszterezett bootstrap a TPR-különbségek standard hibájához, mert a rendelések nem függetlenek (visszautalás Függetlenség, kovariancia és függő adat).

# Feltételezzük, hogy test_df már tartalmazza a y_true, p_hat, region oszlopokat.
test_df = test_df.copy()
test_df["y_pred"] = (test_df["p_hat"] >= 0.5).astype(int)

def slice_report(frame, region_col, threshold=0.5, level=0.95):
    frame = frame.copy()
    frame["y_pred"] = (frame["p_hat"] >= threshold).astype(int)
    out = []
    for value, g in frame.groupby(region_col):
        tp = ((g.y_true == 1) & (g.y_pred == 1)).sum()
        fp = ((g.y_true == 0) & (g.y_pred == 1)).sum()
        tn = ((g.y_true == 0) & (g.y_pred == 0)).sum()
        fn = ((g.y_true == 1) & (g.y_pred == 0)).sum()
        n = len(g)
        prev = (tp + fn) / n
        tpr = tp / (tp + fn) if (tp + fn) > 0 else np.nan
        fpr = fp / (fp + tn) if (fp + tn) > 0 else np.nan
        tpr_ci = wilson_ci(tp, tp + fn, level)
        fpr_ci = wilson_ci(fp, fp + tn, level)
        out.append((value, n, prev, tpr, fpr, tpr_ci, fpr_ci))
    cols = ["region", "n", "prevalence", "TPR", "FPR", "TPR_CI", "FPR_CI"]
    return pd.DataFrame(out, columns=cols)

report = slice_report(test_df, "region", threshold=0.5, level=0.95)
print(report[["region", "n", "prevalence", "TPR", "FPR"]])

A fenti kimenet szemléltető, mert a tényleges teszt-predikciók a helyi labor futtatásából származnak. Az ellenőrző invariantok: a három n összege a teljes teszt mérete; minden szeletre TP+FP+TN+FN = n; a TPR_CI és FPR_CI határai mindig [0,1]-en belül vannak; a y_pred előállítása konzisztens a threshold=0.5 értékkel.

Az érzékenységi elemzés kódja:

# 1) Küszöb-érzékenység
for t in [0.35, 0.65]:
    rep_t = slice_report(test_df, "region", threshold=t, level=0.95)
    print(f"threshold={t}")
    print(rep_t[["region", "n", "TPR", "FPR"]])

# 2) Bonferroni-korrigált CI
rep_bonf = slice_report(test_df, "region", threshold=0.5, level=0.9833)
print(rep_bonf[["region", "TPR_CI", "FPR_CI"]])

# 3) Ügyfélszintű klaszterezett bootstrap a TPR standard hibájához
def cluster_bootstrap_se(frame, group_col, n_boot=1000, seed=20261020):
    rng = np.random.default_rng(seed)
    groups = frame[group_col].unique()
    se = []
    for _ in range(n_boot):
        sampled_groups = rng.choice(groups, size=len(groups), replace=True)
        boot = pd.concat([frame[frame[group_col] == g] for g in sampled_groups])
        tp = ((boot.y_true == 1) & (boot.y_pred == 1)).sum()
        fn = ((boot.y_true == 1) & (boot.y_pred == 0)).sum()
        se.append(tp / (tp + fn) if (tp + fn) > 0 else np.nan)
    return np.nanstd(se)

# Feltéve, hogy a test_df tartalmaz customer_id oszlopot
se_cluster = cluster_bootstrap_se(test_df, "customer_id")
print("Klaszterezett bootstrap SE a TPR-re:", se_cluster)

A bootstrap az ügyfél szintjén mintavételez, mert a rendelések nem függetlenek ugyanazon ügyfélnél (Függetlenség, kovariancia és függő adat). A kód nem futtatott; a seed megadása a reprodukálhatóságot szolgálja, de a numerikus kimenet hardverfüggő lehet.


26.3.5 A labor értelmezése

A táblázatot a gyakorlati célhoz képest olvassuk: nem csak azt kérdezzük, hogy a TPR „rossz-e”, hanem azt, hogy a CI milyen széles, és a küszöb változtatása hogyan hat. A south régió kis nn esetén a TPR CI felső határa is fontos: ha a CI [0,00; 0,79], akkor a „rossz modell” állítás nem erős, mert a minta nem dönti el a 0,3 és 0,7 közötti TPR-t sem. A Bonferroni-korrigált CI-k szélesebbek, ezért kevésbé hajlamosak hamis régiós különbséget mutatni.


26.3.6 Feladatok

  1. Értelmezés. A teszt összesített accuracy 0,82. Magyarázd el, miért nem zárható ki, hogy a south régióban a modell gyakorlatilag nem talál el egyetlen késést sem, ha ott a prevalencia 5% és n=100n=100.

  2. Implementálás. Számítsd ki kézzel a minimális példa central régiójának TPR Wilson 95% CI-ját a fenti képlet szerint, és hasonlítsd össze a kód kimenetével. Ellenőrizd, hogy a CI tartalmazza a 2/3 pontbecslést.

  3. Hibadiagnózis. A labor kód valaki által átírt változatában a y_pred a kalibrálatlan modell score oszlopából készült score >= 0.5 szerint, míg a p_hat a kalibrált valószínűség. Mi a következménye a szeletelt TPR/FPR összehasonlításra? Adj egy konkrét javítást.

  4. Transzfer. A minimális példában változtasd a küszöböt 0,35-re. Mennyi lesz a central régió TPR-je és FPR-je? Milyen trade-off figyelhető meg a south régióban?


26.3.7 Megoldások és indoklás

1. A prevalencia 5% azt jelenti, hogy 100 rendelésből csak 5 késő. Ha a modell mindenkit negatívnak mond, az accuracy 95%, mert a 95 nem későt eltalálja, de a TPR 0. Az összesített accuracy-t a gyakori osztály dominálja; a ritka pozitív eset hibája eltűnik benne. Ezért szeletenként kell TPR-t és FNR-t is nézni, nem csak accuracy-t.

2. A central régióban TP=2, FN=1, tehát x=2x=2, n=3n=3, p̂=2/3\hat p=2/3. z=1,96z=1{,}96 mellett:

CI: [0,208,0,938][0{,}208,\; 0{,}938]. A 2/3 pontbecslés benne van. Ellenőrző invariant: a CI szimmetrikus a pontbecslésre? Nem, a Wilson CI a pontbecslés körül aszimmetrikus lehet, de a határok [0,1]-ben vannak; a c−mc-m és c+mc+m értékek a fenti számítást adják.

3. A kalibrálatlan score és a kalibrált p_hat nem azonos skálán van; a score >= 0.5 döntési szabály nem feltétlenül felel meg a kalibrált 0,5-ös küszöbnek. Így a szeletelt TPR/FPR a rossz döntési szabályra vonatkozik, a kalibrált valószínűségek értelmezése elveszik. Javítás: y_pred = (p_hat >= 0.5).astype(int); ha a küszöböt a score-on akarjuk, akkor a kalibrációt is ahhoz kell igazítani, de a Hibaszeletek és felelős értékelés labor a kalibrált valószínűséget használja.

4. A central régióban a p_hat értékek [0,70, 0,20, 0,40, 0,90]; a 0,35 küszöbbel a harmadik sor (0,40) is pozitív lesz. Az y_true [1,0,1,1], így TP=3, FN=0, TPR=1,00; FP=0, TN=1, FPR=0,00. A south régióban p_hat [0,40, 0,10]; a 0,40 >= 0,35, így TP=1, FN=0, TPR=1,00; a második sor negatív marad, FPR=0,00. A trade-off: a küszöb csökkentése növelte a TPR-t, de a north régióban a 0,30-as p_hat továbbra is negatív, tehát ott nincs változás; más adatokon a küszöb csökkentése az FPR-t is növelné.


26.3.8 Gyakori tévedés

„Ha a selection rate egyenlő, akkor a modell fair.” Ez nem igaz. Tekintsünk két csoportot. A modell mindkét csoportban mindenkit pozitívnak prediktál: az SR mindkettőben 1, tehát a demographic parity teljesül. De az egyik csoportban 90 negatív ügyfél van, ott az FPR 1, és a PPV megegyezik a prevalenciával; a modell a negatívokat tömegesen tévesen pozitívnak jelöli. Az SR egyenlősége nem mond semmit a TPR/FPR hibákról. Hasonlóan, az equal opportunity (TPR egyenlőség) mellett az FPR különbözhet, ahogyan a fogalmi részben láttuk. Ezért a Hibaszeletek és felelős értékelés következtetése mindig több metrika és a CI együttes figyelése. Visszautalás Feature-szelekció és magas dimenzió: ahogyan a sok feature közötti keresés hamis felfedezést szül, a sok szelet közötti keresés is; a Bonferroni-korrekció ennek ellenszere.

Önellenőrzés: ha egy szeletben n=2n=2 és p̂=0,5\hat p=0{,}5, a Wilson CI a fenti képlettel nem lehet szűkebb, mint a normál approximáció p±1,96p(1−p)/np \pm 1{,}96\sqrt{p(1-p)/n}; számold ki mindkettőt, és ellenőrizd, hogy a Wilson határok [0,1]-ben maradnak.


26.3.9 Rövid összefoglaló

A szeletelemzés a modell értékelését kategorikus részekre bontja, és minden szeletben hibamátrixot, prevalenciát, TPR-t, FPR-t és ezek konfidenciaintervallumát közli. A kis csoportokban a Wilson CI jobb, mint a normál approximáció, mert a határokat [0,1]-ben tartja. Ha több szeletet vizsgálunk, a többszörös összehasonlítás miatt korrigálni kell a szintet; a Bonferroni-korrekció három régióra 98,3%-os CI-t ad. A fairness-metrikák, mint a selection rate paritás vagy az equal opportunity, önmagukban nem bizonyítják a modell elfogadhatóságát, mert a TPR/FPR trade-off és a PPV prevalenciafüggése külön figyelmet igényel. A következő Robusztusság és korlátokkal írt modellkártya modellkártya ugyanezt a szeletelt bizonytalanságot és korlátot foglalja dokumentált, átadható formába.