Hoppa till innehållet
AI-grafen
F· AI engineeringai-produktutveckling· ca 90 min· volatil — kontrolleras ofta· verifierad 2026-09-20

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:

TypVad ändrasExempelBotemedel
KovariatdriftP(X)nya användargrupper, ny formuleringträna om på ny data
EtikettdriftP(Y)andelen bedrägerier stigerjustera tröskel/vikter
KonceptdriftP(Y|X)samma indata betyder något annatträ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

Alla källor och licenser