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%?
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: , becslése , ahol a szelet mintanagysága. A TPR (true positive rate, szenzitivitás) a tényleges pozitívok eltalálási aránya: . Az FPR (false positive rate) a tényleges negatívok téves pozitív aránya: . A PPV (precision) a pozitív predikciók találati aránya: .
A PPV a prevalenciától függ; a kalibrálásnál használt összefüggés:
Ezért azonos TPR és FPR mellett is más PPV-t kapunk, ha a prevalencia eltér.
A szeletelt arányok mintából számított becslések, ezért van standard hibájuk. Az binomiális arány klasszikus standard hibája:
ahol a becsült arány, a szelet mérete. Kicsi -nél a normál approximáció félrevezető, ezért a Wilson-konfidenciaintervallumot használjuk. mellett:
A CI: . Ez a képlet -ra és -re sem ad [0,1]-en kívüli határt, ezért kis mintán is használható.
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 ; 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 -t osztja el a szeletek számával: . Három szeletnél a korrigált CI-szint , azaz . Ezt az érzékenységi elemzésnél alkalmazzuk.
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.
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:
,
,
;
a fenti képlettel
,
,
azaz
.
A south TPR CI-ja
esetén
.
Ez jól mutatja, hogy a kis csoportban a pontbecslés 0,00 mellett a CI
felső határa is hasznos információ.
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.
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 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.
É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 .
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.
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.
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?
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 , , . mellett:
CI: . 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 és é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é.
„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 és , a Wilson CI a fenti képlettel nem lehet szűkebb, mint a normál approximáció ; számold ki mindkettőt, és ellenőrizd, hogy a Wilson határok [0,1]-ben maradnak.
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.