Phase 02: ML Fundamentals

Üretimdeki İzleme Modelleri Veriler ve Konsepler

Bir model bir hata mesajı olmadan başarısız olur. Dünya eğitim verilerinden uzaklaşırken puanları geri verir ve sadece izleme boşluğu gösterir.

Type: Build

Languages: Python, TypeScript

Prerequisites: Phase 2, Lessons 09 (Model Evaluation), 16 (Anomaly Detection), and 19 (ML System Design)

Time: ~110 minutes

Öğrenme Hedefleri

  • Dört katmanlı izleme sinyallerini seçin: sistem sağlığı, girişler, tahminler ve sonuçlar
  • Kopaylı sürükleme, önceki sürükleme ve kavram sürüklemeyi, değişen ortak dağılımın parçasıyla ayırt edin
  • Nüfusun Durgunluk Endeksi, Kolmogorov-Smirnov istatistikinin iki örnekle ve çikre testiyi baştan başlatacak.
  • Sıkı bir referans penceresini kaydırıcı akım pencereleri ile karşılaştırın ve pencerenin boyutunun gürültü ve gecikme değişikliklerini açıklayın
  • Yanlış alarmların etki boyutları, birden fazla test doğrultusunda ve ısrar kuralıyla sınırlandırılacağı bir uyarı politikası tasarlayın
  • Hangi sürükleme yeniden eğitime ihtiyacı olduğunu, hangi yeni etiketlere ihtiyacı olduğunu ve hangi hareketlere ihtiyacı olmadığını karar verin.

Sorun

Ödeme risk modeli yüzde 95 doğrulukla canlı yayımlanıyor. İki ay sonra bir pazarlama kampanyası daha büyük sepetlerle uygulama kullanıcılarını içeri getiriyor.

Bu süre boyunca model hizmet her istek için HTTP 200'yi gönderir. Gecikme normaldir ve kayıtlar hata göstermez. Başarısızlığın ilk belirtisi hasarın haftaları sonra geri yükleme hakkında finans raporudur.

Yazılım izleme, bir hizmetin cevap verdiğini kontrol eder. Model izleme, cevapların hala doğru olup olmadığını ve verilerin hala modeli eğitmiş olan verilere benzeyip benzemeyeceğini kontrol eder. Bu ders, ikinci iş için istatistikleri, pencereleri ve uyarı politikasını oluşturur. Onları iki enjekte edilen değişiklikle sentetik akışta çalıştırır ve hangi monitör hangi değişikliğe tepki gösterdiğini izler.

Anlaşım

Neyi izlemek

Dört katmanı izle, ilk üç kat erken uyarılar verir, sadece dördüncü kat doğruyu ölçer ve geç gelir.

LayerSignalsAvailableQuestion it answers
System healthp50 and p99 latency, error rate, throughput, memoryAt onceDoes the service answer?
InputsDistribution of each feature, missing-value rate, schema, new categoriesAt onceDoes live data look like training data?
PredictionsScore distribution, positive rate, share of default answersAt onceDoes the model behave as before?
OutcomesAccuracy, precision, calibration, business metricAfter the label delayIs the model still right?

Bu dersin ana konusu giriş izlemektir, çünkü etiketlerin gelmesinden önce çalışır. Demo'nun gösterdiği bir sınırı vardır: bazı değişiklikler girişleri dokunmadan bırakır.

Üç çeşit sürükleme

Girişlerin ortak dağılımını yazın xve etiketleriyİki şekilde:

P(x, y) = P(x) \cdot P(y \mid x) = P(y) \cdot P(x \mid y)

Her tür sürükleme farklı bir faktörü değiştirir:

DriftWhat changesWhat staysPayment exampleWhich monitor sees it
Covariate driftP(x)P(y | x)More app users with larger basketsInput monitors
Prior driftP(y)P(x | y)The fraud rate doubles during an attack, and fraud looks the samePrediction and outcome monitors
Concept driftP(y | x)Can stayThe same basket now has a different fraud riskOutcome monitors only

Gama et al. bir değişiklik yapın.P(y | x)Gerçek kavram sürüşü.P(x)Bu da bırakıyor.P(y | x)Bu araştırma, sürüşün zaman içinde nasıl gerçekleşeceğine göre de sınıflandırılır: ani, aşamalı, yavaş veya tekrar gelen bir kavram olarak.

Kovariyatif çekim her zaman zarar vermez.P(y | x)Trafik çok az eğitim verisi olan veya karar sınırına yakın bölgelerde hareket ederken yine de doğruluğunu kaybedebilir.

Gecikmiş etiketler

Sonuç tahminden sonra gelir. Gecikme soruna bağlıdır:

ProblemWhen the label arrives
Ad clickSeconds
Churn in the next 30 days30 days
Card fraudWhen the chargeback arrives, often weeks later
Loan defaultMonths or years

Gecikme sırasında, giriş ve tahminleriniz var ama sonuçlar yoktur. Girişleri ve tahminleri izleyin, geldiğinde etiketlere katılın ve sadece etiketlenen bölümde sonuç ölçümlerini hesaplayın. Demo 500 olayın etiket gecikmesini kullanır, bu nedenle sonuç monitörü her zaman 500 olayı geçmişe bakır.

Referans ve mevcut pencereler

Her sürükleme testi iki örnek karşılaştırır:

  • Reference window.Eğitim verileri, ya da elle kontrol ettiğiniz üretim süresi.
  • Current window.En son olaylar, ya da son olaylar.Nolaylar veya son olaylar TSaatler.

Bir kaydırıcı pencerenin boyutundan bir adım daha küçük bir adım ileriye doğru hareket etmesi, böylece ardı ardına pencereler örtüşmektedir. Bir kaydırıcı pencerenin tam boyutuyla hareket etmesi. Pencere boyutu bir değişimdir. Küçük bir pencere hızlı bir şekilde tepki verir, ancak ses çıkışı olarak puanlar. Büyük bir pencere istikrarlıdır, ancak geç bir değişiklik bildirir.

Mevsimsellik saf pencereleri kırar. Pazartesi trafiği birçok üründe Cumartesi trafiğinden farklıdır. İpucu bir döngü kapsamasını tamamlayın veya her pencereni daha önceki döngüdeki aynı döneme karşılaştırın.

Nüfusun Durgunluk Endeksi

PSI kredi puanlamasından gelir. Referans değerlerini kutulara, genellikle referans desillerinde on kutuya ayırın, böylece her kutu referansın yüzde 10'unu tutar.

\text{PSI} = \sum_{\text{bins}} (\text{current\_share} - \text{reference\_share}) \cdot \ln\left(\frac{\text{current\_share}}{\text{reference\_share}}\right)

0'nun payı olan bir bin, günlük sonsuz yapar, bu nedenle her payı 0.0001 gibi küçük bir değere kadar kesin. PSI simetriktir.

Pratikçiler PSI'yi sabit bantlarla okuyor: 0.1'den aşağı sabit, 0.1'den 0.25'e kadar orta bir değişim ve 0.25'den yukarı önemli bir değişimdir. Bu bantları bir test değil bir konvensiyon olarak değerlendirin. PSI kutu sayısıyla büyüyor ve örnek boyutlarıyla küçülüyor.

Kolmogorov-Smirnov istatistikleri

İki örnekli KS istatistikleri Diki empiriyel kumülatüel dağılım fonksiyonu arasındaki en büyük dikey boşluk:

D = \max_x \left\lvert F_{\text{reference}}(x) - F_{\text{current}}(x) \right\rvert

DAynı örnekler için 0 ve üst üste olmayan örnekler için 1'dir.n * m / (n + m)- Evet .

Büyük örnekler için, p değeri hiç kimsenin umurunda olmayan bir boşluk için sıfıra gider.DEfekt boyutu olarak kendini gösterir ve sadece her ikisinin de farkında olduğu zaman uyarılır.Dve p değeri eşiğinin sınırlarını geçiyor.

Kategori özellikleri için Chi-square testi

Ödeme kanalı gibi kategorik bir özelliğe göre, her kategoriye göre iki satır (referans, akım) ve bir sütunlu bir tablo oluşturun.

\begin{aligned} \text{expected}[r][c] &= \text{row\_total}[r] \cdot \text{column\_total}[c] / \text{grand\_total} \\ \text{chi2} &= \sum_{\text{cells}} (\text{observed} - \text{expected})^2 / \text{expected} \end{aligned}

Testin sonucuk - 1kKategori. Sadece mevcut pencerede görünen bir kategori büyük bir terim ekler, bu nedenle test yeni değerlere tepki verir. Cramér'in V'si etki boyutudur.chi2 / grand_total- Evet .

Alarm eşiği ve sahte alarmlar

Her testin yanlış alarm oranı vardır .alphaBu yüzden, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir süre sonra, bir sürece, bir sürece, bir sürece, bir sürece, bir sürecececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececececealpha = 0.05İnsanlar uyarıları daha çok önce okumayı bırakırlar.

Alarm oranını kullanışlı kılan dört kural:

  1. Correct for multiple tests.Bonferroni düzeltmesi bölünür.alphaDemo bir aileyi kullanıyor.alphaİki test üzerinde 0,01'in, bu nedenle her testde 0,005 kullanılır.
  2. Require an effect size.Sadece PSI'de uyarıD, ya da Cramér'in V'si de bir eşiği geçiyor.
  3. Require persistence.Sadece uyarı sonrası kDemos kullanıyor.k = 2- Evet .
  4. Separate warnings from alerts.Bir uyarı bir taklaya, bir uyarı bir kişiye gidiyor.

Demo, 2. kuralın çalışmasını gösteriyor. Bir temiz pencerenin chi-square p değeri 0.0009'dur.alphaCramér'in V oranı 0.1'den aşağı, bu yüzden polis bir uyarı kaydeder, uyarı değil.

Yeniden eğitimin tetikleyicileri

Yeniden eğitim için üç ortak tetikleyici vardır:

  • Schedule.Bu basit ama hiçbir şey değişmediğinde yeniden antrenman yapar ve bir şey olduğunda bekler.
  • Drift.Önemli özellikler üzerinde giriş süresi eşiğin üzerinde kaldığında geri dönüş.
  • Performance.Bir sonuç metrikinin referans değeri eksik bir toleransın altında düştüğünde yeniden eğitil.

Bu tür bir sürükleme yeniden eğitimin ne yapabileceğini belirler:

DriftUseful action
Covariate drift, accuracy stableOften none. Keep watching the outcome metric.
Covariate drift into regions with little dataRetrain on recent data that includes those regions
Prior driftRecalibrate the scores or move the decision threshold
Concept driftCollect new labels first. Retraining on old labels teaches the old concept again.

Yeniden eğitildikten sonra, yeni modeli en son etiketlenmiş verilere test edin. Sistem tasarımı dersi'nden gölge ve kanarya aşamalarıyla birlikte oynatın. Sonra referans penceresini yeni eğitim verilerine yeniden ayarlayın.

Yapın

Kodun içinde .code/main.pySadece standart kütüphaneden kullanıyor.

Adım 1: Kvantil kutular ve PSI

Çöp kenarları referans desillerdir.bisect_rightHer değerin çöplüğünü bulur.

python
def quantile_edges(reference: list[float], bins: int = 10) -> list[float]:
    ordered = sorted(reference)
    n = len(ordered)
    edges = [ordered[min(n - 1, (n * i) // bins)] for i in range(1, bins)]
    return sorted(set(edges))


def psi_from_fractions(expected: list[float], actual: list[float], eps: float = 1e-4) -> float:
    total = 0.0
    for e, a in zip(expected, actual):
        e, a = max(e, eps), max(a, eps)
        total += (a - e) * math.log(a / e)
    return total

Adım 2: KS istatistikleri ve p değeri

Her iki örneği birlikte yürütün. Her farklı değerde, her iki örneğin her kopyasını geçin, sonra iki toplam payı karşılaştırın. Bu, bağları doğru şekilde ele alır.

python
def ks_statistic(sample_a: list[float], sample_b: list[float]) -> float:
    a, b = sorted(sample_a), sorted(sample_b)
    n, m = len(a), len(b)
    i = j = 0
    d = 0.0
    while i < n and j < m:
        x = min(a[i], b[j])
        while i < n and a[i] <= x:
            i += 1
        while j < m and b[j] <= x:
            j += 1
        d = max(d, abs(i / n - j / m))
    return d

P değeri Kolmogorov dağılımında serileri kullanır.2 * sum((-1)^(k-1) * exp(-2 k^2 lambda^2)), ilelambda = sqrt(n * m / (n + m)) * D- Evet .

Adım 3: Chi-square testi

chi2_sfÇiktirilmiş üst eksik gamma fonksiyonu ile chi-square hayatta kalma fonksiyonunu hesaplar. Küçük argümanlar için bir dizi ve büyükler için devamlı bir kırık kullanır. chi_square_testiki sıralı tablo oluşturur, istatistikleri hesaplar ve p değerini ve Cramér'in V'sini gönderir.

python
def chi_square_test(reference_counts: dict[str, int], current_counts: dict[str, int]) -> ChiSquareResult:
    categories = [c for c in sorted(set(reference_counts) | set(current_counts))
                  if reference_counts.get(c, 0) + current_counts.get(c, 0) > 0]
    rows = [[reference_counts.get(c, 0) for c in categories], [current_counts.get(c, 0) for c in categories]]
    row_totals = [sum(r) for r in rows]
    grand = sum(row_totals)
    if len(categories) < 2 or 0 in row_totals:
        return ChiSquareResult(0.0, 0, 1.0, 0.0)
    statistic = 0.0
    for col, _ in enumerate(categories):
        col_total = rows[0][col] + rows[1][col]
        for r in range(2):
            expected = row_totals[r] * col_total / grand
            statistic += (rows[r][col] - expected) ** 2 / expected
    dof = len(categories) - 1
    return ChiSquareResult(statistic, dof, chi2_sf(statistic, dof), math.sqrt(statistic / grand))

Adım 4: Pencere ve sürükleme monitörü

SlidingWindowSonuncusu tutar.sizebir olaydadeque- Evet .DriftMonitorReferans kutularını hesaplar ve bir kez sayar.checkMetot PSI'yi gönderir.D, ve her sayısal özelliğin KS p değeri ve her kategorik özelliğin chi-square sonucu.

Adım 5: Alarm politikası

Politika, her metrik ayarını bir seviyeye dönüştürür ve sinyal başına ardıcıl sürükleme pencerelerini sayır:

python
def level(self, metrics: dict[str, float]) -> str:
    if "psi" in metrics:
        if metrics["psi"] >= self.psi_drift or (metrics["ks"] >= self.ks_drift and metrics["ks_p"] < self.alpha):
            return "drift"
        return "warn" if metrics["psi"] >= self.psi_warn else "ok"
    if metrics["p"] < self.alpha and metrics["v"] >= self.min_cramers_v:
        return "drift"
    return "warn" if metrics["p"] < self.alpha else "ok"

updateDevamıALERTÇizgiyi tamamlayan pencerede veresolvedAlarmdan sonra ilk temiz pencerede.

Adım 6: Enjeksiyonu olan akıntı

Akışta 9000 ödeme olayı var .amount, a channel, ve bir dolandırıcılık .labelDört bölümden oluşuyor:

EventsAmountChannel mix (app, store, web)Label boundaryChange
0 to 2999mean 100, sd 2035, 15, 50 percent120Reference period
3000 to 4999mean 118, sd 2460, 10, 30 percent120Covariate drift
5000 to 6499mean 100, sd 2035, 15, 50 percent120Back to normal
6500 to 8999mean 100, sd 2035, 15, 50 percent105Concept drift

Modeldeki bir eşiğin amountWindows 500 etkinliği düzenler ve 250'e kadar hareket eder.

bash
python3 code/main.py
npx tsx code/main.ts
terminal
  end    PSI   KS D   chi2 p    acc  levels (amount/channel/accuracy)  events
 3000  0.010  0.041  3.0e-01  0.932  ok/ok/ok
 3250  0.152  0.163  7.6e-06  0.924  drift/warn/ok
 3500  0.463  0.298  2.8e-26  0.936  drift/drift/ok                     ALERT amount
 3750  0.609  0.343  3.5e-35  0.942  drift/drift/ok                     ALERT channel
 ...
 5500  0.026  0.044  2.6e-01  0.898  ok/ok/ok                           resolved amount, resolved channel
 ...
 7250  0.040  0.048  7.1e-01  0.848  ok/ok/drift
 7500  0.022  0.039  6.1e-01  0.778  ok/ok/drift                        ALERT accuracy

Sonuçları üç bölümde okuyun:

  • Covariate drift.Drift 3000'de başlar ve amountAlarm 3500'e kadar devam eder.
  • Recovery.Girişler 5000'de normal hale döner ve her iki uyarı da 5500'de çözülür.
  • Concept drift.Drift 6500'de başlar ve giriş monitörleri sessiz kalır çünkü girişler değişmez. Düzgünlük 0.946'dan 0.76 ile 0.79 arasında düşer. Düzgünlik uyarısı 7500'de gelir, değişimden sonra 1000 olay ve etiket gecikmesi 500'ü oluşturur.

Kullan

scipy. scipy.statsBu ders için bir ders programı gerekmez.

python
from scipy import stats

result = stats.ks_2samp(reference_amounts, current_amounts)
print(result.statistic, result.pvalue)

table = [[1000, 700, 300], [140, 290, 70]]
chi2 = stats.chi2_contingency(table)
print(chi2.statistic, chi2.pvalue, chi2.dof)

Kontrol ettik .ks_statisticve chi_square_testKS istatistik, chi-skvadar istatistik ve chi-skvadar p değeri yüzen nokta doğruluğuna eşleşmiştir. 200'den fazla rastgele örnek çiftinden fazla, KS p değerleri scipy'nin değerinin yüzde 18'ine kadar farklıdır. En büyük boşluklar çok küçük p değerlerindeydi.

Bu boşluk yöntemden kaynaklanıyor. kodumuz Kolmogorov sınırlı dağılımını kullanıyor.ks_2sampBu yöntem, her iki örnekten en fazla 10.000 değer olduğu zaman tam bir yöntem kullanır. Asimptotik modunda, yuvarlak etkili örnek boyutu ile sınırlı örnek dağılımını kullanır.chi2_contingencyYates'in süreklilik düzeltmesini varsayılan olarak uyguluyor, bu yüzden istatistikler farklıdır.

Monitoring libraries.Birçok açık kaynaklı kütüphanede bu testler raporlar ve araç tablosu ile paketlenir:

  • Evidently1000 satır veya daha az bir referans için, sayısal sütunlar için KS testi ve kategorik sütunlar için chi kare testi kullanır. Daha büyük veriler için, Wasserstein mesafesini ve 0,1 eşiği olan Jensen-Shannon farklılığını kullanır. PSI seçilebilecek diğer yöntemlerden biridir.
  • NannyMLEtiketlerin gelmesinden önce model performansını tahmin eder. Güvenli Baslı Performance Estimation (CBPE) modelin tahmin edilmiş olasılıklarını kullanır, bu da iyi kalibrelenmelidir. NannyML belgesinde CBPE'nin değişkenlik kaydırmasını hallediğini ancak konsept sürüklenmesiyle başa çıkmadığını belirtiyor. Demo akışı nedenini gösterir: sadece etiketler konsept sürüklenmesini ortaya koydu.
  • TensorFlow Data ValidationKategoriyel özellikler için L- sonsuzluk mesafesini ve sayısal özellikler için yaklaşık Jensen-Shannon farklılığını kullanır.

Bu araçların her birinin hesapladığını gösteren sıfırdan kod, depolama, programlama, araç tablosu ve daha birçok testi ekler.

LLM başvuruları için,LLM observability lessonBu dersdeki fikirler hala bu sistemlerin giriş ve çıkışlarına uygulanmaktadır.

Gönder

Bu ders bize çok yararlı .outputs/skill-drift-monitoring.md. Yetenek, monitörleri yeni bir model için planlıyor ve drift uyarısını seçiyor. Hangi katman ateşlendiğini, hangi tür bir drift'in kanıtlara uygun olduğunu ve doğru eylemin beklemek, yeniden kalibrlemek, etiket toplamak veya yeniden eğitmek olup olmadığını sorar.

Egzersizler

  1. 200 ve 2000 olayları ile akışını çalıştırın.
  2. Yapıştır n_tests=1- Evet .patience=1vemin_cramers_v=0Temizlik döneminde uyarıları 5000 ile 6500 arasında sayın.
  3. Ortalama 100 olay başına 0.01 oranında büyüyen bir özelliği ekleyin. Hangi sinyal, PSI veya KS, önce tepki gösterdiğini bulun.
  4. Jensen-Shannon mesafesini aynı çöp çöplerinde uygulayın ve her pencerede PSI ile karşılaştırın.
  5. Modelin olumlu tahmin oranını gösteren bir monitör ekleyin.

Anahtar Terimler

TermWhat people sayWhat it means
Data drift"The data changed"A change in the distribution of inputs, predictions, or labels compared with a reference window
Covariate drift"New kinds of users"P(x) changes while P(y | x) stays the same
Prior drift"More positives than before"P(y) changes while P(x | y) stays the same, also called label shift
Concept drift"The rules of the game changed"P(y | x) changes, so the same input now has a different correct answer
Reference window"The baseline data"A fixed sample, often the training data, that every current window is compared with
PSI"The stability score"A symmetric sum over bins of (current share minus reference share) times the log of their ratio
KS statistic"The KS test"The largest gap between two empirical cumulative distribution functions
Cramér's V"Effect size for categories"The chi-square statistic scaled to the range 0 to 1
Label delay"Ground truth comes later"The time between a prediction and the arrival of its true outcome
Alert fatigue"Too many pages"People ignore alerts because most of them were false alarms

Daha Fazla Okumak

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.