Datadrift och modellförfall
Kunna upptäcka drift och besluta när en modell ska tränas om.
Förkunskaper
Intuition
En modell tränad på gårdagens värld möter morgondagens. Tre sorters förändring, med olika botemedel:
| Typ | Vad ändras | Exempel | Botemedel |
|---|---|---|---|
| Kovariatdrift | P(X) | nya användargrupper, ny formulering | träna om på ny data |
| Etikettdrift | P(Y) | andelen bedrägerier stiger | justera tröskel/vikter |
| Konceptdrift | P(Y|X) | samma indata betyder något annat | träna om — ingen genväg |
Konceptdrift är värst: modellen kan inte upptäcka den själv, eftersom indata ser normal ut. Bara facit avslöjar den — och facit kommer ofta sent.
Kod
import numpy as np
from scipy.stats import ks_2samp, chi2_contingency
def psi(referens, ny, bins=10):
"""Population Stability Index. < 0,1 stabil · 0,1–0,25 måttlig · > 0,25 betydande drift."""
kanter = np.percentile(referens, np.linspace(0, 100, bins + 1))
kanter[0], kanter[-1] = -np.inf, np.inf
r = np.histogram(referens, kanter)[0] / len(referens)
n = np.histogram(ny, kanter)[0] / len(ny)
r, n = np.clip(r, 1e-6, None), np.clip(n, 1e-6, None)
return float(((n - r) * np.log(n / r)).sum())
def driftrapport(ref_df, ny_df, numeriska, kategoriska):
ut = []
for k in numeriska:
p = ks_2samp(ref_df[k], ny_df[k]).pvalue
ut.append({"feature": k, "test": "KS", "p": round(float(p), 5),
"psi": round(psi(ref_df[k], ny_df[k]), 3)})
for k in kategoriska:
tab = np.array([ref_df[k].value_counts().sort_index(),
ny_df[k].value_counts().sort_index()])
ut.append({"feature": k, "test": "chi2", "p": round(float(chi2_contingency(tab).pvalue), 5)})
return sorted(ut, key=lambda r: r.get("psi", 0), reverse=True)
Sätt tröskeln på PSI, inte på p-värdet. Med tillräckligt stora datamängder blir varje test signifikant; PSI mäter hur mycket fördelningen flyttat sig, vilket är det som betyder något.
När ska man träna om? Bestäm regeln i förväg: (1) schemalagt, t.ex. månadsvis, (2) vid PSI > 0,25 på en viktig feature, eller (3) vid mätbar kvalitetsförsämring på en märkt kontrollström. Det tredje är bäst men kräver löpande etiketter — budgetera för att märka 1–2 % av trafiken.
Behärskning innebär
- Skiljer kovariat-, etikett- och konceptdrift
- Upptäcker drift med lämpliga test
- Beslutar när modellen ska tränas om
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- Wikipedia — Concept drift (CC BY-SA 4.0) — CC BY-SA 4.0
- Google — Rules of Machine Learning — CC BY 4.0