Machine Learning Academy · leksjon

Pakking, dokumentasjon og presentasjon av den endelige modellen

Serialiser den beste pipelinen, skriv et model card som dokumenterer treningsdata, ytelse, begrensninger og rettferdighetshensyn, og hold en demonstrasjon på fem minutter.

Leksjon 4 av 413 trinn

Pakking, dokumentasjon og presentasjon av den endelige modellen er en gratis leksjon i Machine Learning Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Machine Learning Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Machine Learning Academy inneholder totalt 4 leksjoner.

Hvorfor pakking og dokumentasjon er viktig

En modell som bare finnes i en Jupyter-notatbok, er ikke et leveranseklart produkt – den er en prototype. Pakking betyr å serialisere den trente pipelinen til et portabelt artefakt som kan lastes inn og brukes uten den opprinnelige treningskoden. Dokumentasjon betyr å utarbeide et modellkort som beskriver hva modellen gjør, hvilke data den ble trent på, hvor godt den presterer, hvor den kan feile, og hvem som bør bruke den. Til sammen er pakking og dokumentasjon det som gjør forskning om til ansvarlig produksjonsprogramvare.

Serialisere den endelige pipelinen med joblib

joblib.dump serialiserer en tilpasset scikit-learn Pipeline (inkludert alle forhåndsbehandlere og modellen) til én enkelt fil. Denne filen kan lastes inn i ethvert Python-miljø der samme versjon av scikit-learn er installert. Bruk et strukturert filnavn som inneholder prosjektet, modelltypen, treningsdatoen og ytelsesmålet, slik at De kan identifisere ethvert artefakt uten å lese metadatafilen ved siden av.

import joblib
import json
from datetime import date

# Save the fitted pipeline
model_filename = f'churn_xgboost_{date.today().isoformat()}_auc0883.pkl'
joblib.dump(best_pipeline, model_filename)
print(f'Saved pipeline: {model_filename}')

# Verify round-trip
loaded_pipeline = joblib.load(model_filename)
y_reloaded = loaded_pipeline.predict_proba(X_test[:5])[:, 1]
y_original = best_pipeline.predict_proba(X_test[:5])[:, 1]
print('Predictions match after reload:', all(y_reloaded == y_original))

Skrive en JSON-metadatafil ved siden av modellen

Skriv en .json-metadatafil ved siden av den serialiserte modellen for å dokumentere artefaktet. Denne metadatafilen gjør det mulig for styringsverktøy å indeksere modeller uten å laste inn binærfilen. Inkluder treningsdato, datasettversjon eller hash, scikit-learn-versjon, ytelsesmål fra kryssvalideringen, egenskapsnavn og SHA-256-hashen til modellfilen for å oppdage manipulering eller korrupsjon.

import hashlib, json, sklearn, joblib, os
from datetime import date

def sha256_file(path):
    h = hashlib.sha256()
    with open(path, 'rb') as f:
        for chunk in iter(lambda: f.read(8192), b''):
            h.update(chunk)
    return h.hexdigest()

metadata = {
    'model_type': 'XGBClassifier',
    'task': 'binary_classification',
    'target': 'churn_90d',
    'training_date': date.today().isoformat(),
    'sklearn_version': sklearn.__version__,
    'feature_names': list(feature_names),
    'cv_auc_mean': 0.883,
    'cv_auc_std': 0.007,
    'test_auc': 0.879,
    'sha256': sha256_file(model_filename)
}
with open(model_filename.replace('.pkl', '_metadata.json'), 'w') as f:
    json.dump(metadata, f, indent=2)
print(json.dumps(metadata, indent=2))

Skrive et modellkort

Et modellkort (Mitchell et al., 2019) er et kort dokument – vanligvis på 1–2 sider – som beskriver en modell for personene som skal bruke den eller bli berørt av den. Det er strukturert i seksjoner for modelldetaljer, tiltenkt bruk, måltall, treningsdata, evalueringsdata, etiske hensyn og forbehold/anbefalinger. Modellkort er nå påkrevd av EUs AI-forordning for AI-systemer med høy risiko og anbefales av ledende ML-leverandører.

model_card_template = '''
# Model Card: Customer Churn Predictor v1.0

## Model Details
- Type: XGBoost binary classifier inside a scikit-learn Pipeline
- Task: Predict 90-day customer churn
- Version: 1.0.0 | Training date: 2026-06-25

## Intended Use
- Primary use: Nightly batch scoring to generate a churn risk score per customer
- Out-of-scope: Real-time scoring, non-B2C segments, churn windows != 90 days

## Metrics
- 5-fold CV AUC: 0.883 +/- 0.007
- Held-out test AUC: 0.879
- Precision@threshold=0.4: 0.67 | Recall@threshold=0.4: 0.82

## Training Data
- Source: orders DB + CRM, 2024-01-01 to 2026-04-30
- Samples: 120,000 customers | Churn rate: 8.3%

## Ethical Considerations
- Age and region features audited for demographic parity (difference < 0.03)
- No direct use of protected attributes

## Caveats
- Performance may degrade if product catalogue changes significantly
- Retraining recommended if test AUC drops below 0.85 in monitoring
'''
print(model_card_template)

Generere ytelsesartefakter

Legg ved viktige visualiseringer i modellkortet som dokumentasjon på ytelsen. Standardartefakter omfatter ROC-kurven med angitt AUC, presisjon–dekning-kurven (mer informativ for ubalanserte klasser), forvekslingsmatrisen ved terskelen som skal brukes i produksjon, og et SHAP-biesvermdiagram for global egenskapsbetydning. Lagre hver visualisering som PNG, slik at den kan inkluderes i modellkortlageret sammen med binærartefaktet.

from sklearn.metrics import RocCurveDisplay, PrecisionRecallDisplay, ConfusionMatrixDisplay
import matplotlib.pyplot as plt

fig, axes = plt.subplots(1, 3, figsize=(15, 4))

# ROC curve
RocCurveDisplay.from_predictions(y_test, y_proba, ax=axes[0], name='XGBoost')
axes[0].set_title('ROC Curve')

# Precision-Recall curve
PrecisionRecallDisplay.from_predictions(y_test, y_proba, ax=axes[1], name='XGBoost')
axes[1].set_title('Precision-Recall Curve')

# Confusion matrix at threshold 0.4
y_pred_thresh = (y_proba >= 0.4).astype(int)
ConfusionMatrixDisplay.from_predictions(y_test, y_pred_thresh, ax=axes[2], display_labels=['retained', 'churned'])
axes[2].set_title('Confusion Matrix @ threshold=0.4')

plt.tight_layout()
plt.savefig('model_card_performance.png', dpi=150)

Versjonskontroll med Git og DVC

Modellartefakter og datasett bør versjonskontrolleres sammen med koden. Git sporer kode og JSON-metadatafiler. DVC (Data Version Control) sporer store binærfiler (modellfiler og datasett) separat i objektlagring (S3, GCS), mens bare en lett peker lagres i Git. Dette gir et fullstendig revisjonsspor: For enhver git-commit kan De gjenskape nøyaktig det modellartefaktet og datasettet som produserte resultatet.

# DVC workflow (shell commands — not Python)
# pip install dvc[s3]

# Initialise DVC in the repo
# dvc init

# Add model artifact to DVC tracking
# dvc add churn_xgboost_2026-06-25_auc0883.pkl
# git add churn_xgboost_2026-06-25_auc0883.pkl.dvc .gitignore
# git commit -m 'Add XGBoost churn model v1.0'

# Push artifact to S3
# dvc remote add myremote s3://my-ml-artifacts/churn-model
# dvc push

# To reproduce: checkout a git commit, then:
# dvc pull  # downloads the exact artifact for that commit
print('DVC enables git-compatible versioning of large binary model artifacts.')

Pakke modellen som en Python-modul

For gjenbruk på tvers av flere tjenester pakker De modellen inn i en lett Python-pakke med et ryddig grensesnitt for prediksjon. Definer en predict(features: dict) -> dict-funksjon som laster inn modellen én gang ved import av modulen, validerer inndata, kjører prediksjonen og returnerer et strukturert svar. Dette frikobler forbrukeren fra serialiseringsformatet og gjør det mulig å teste grensesnittet uavhengig av modellens binærfil.

# churn_model/predictor.py
import joblib
import numpy as np
from pathlib import Path

_MODEL_PATH = Path(__file__).parent / 'artifacts' / 'churn_xgboost_latest.pkl'
_PIPELINE = None

def _load():
    global _PIPELINE
    if _PIPELINE is None:
        _PIPELINE = joblib.load(_MODEL_PATH)
    return _PIPELINE

def predict(features: dict) -> dict:
    '''Return churn probability for a single customer feature dict.'''
    pipeline = _load()
    # Convert dict to 2D array in correct feature order
    feature_order = pipeline.feature_names_in_
    X = np.array([[features[col] for col in feature_order]])
    proba = pipeline.predict_proba(X)[0, 1]
    return {'churn_probability': float(proba), 'churn_flag': proba >= 0.4}

Skrive presentasjonen på fem minutter

En avsluttende presentasjon må kommunisere modellens verdi til ikke-tekniske interessenter på fem minutter. Strukturer den slik: (1) Problem – kostnaden ved kundefrafall; (2) Løsning – hva modellen predikerer; (3) Resultater – AUC og estimert forretningseffekt; (4) Forklaring – de viktigste SHAP-egenskapene for å bygge tillit; (5) Neste steg – plan for A/B-test og tidsplan for ny trening. Begynn med forretningsverdien, ikke algoritmedetaljene.

demo_outline = [
    ('Slide 1 — Problem', '30s',
     'Company loses $2.4M/year to churn. We predict who will churn 90 days in advance.'),
    ('Slide 2 — Data', '30s',
     '120k customers, 3 data sources, 8.3% churn rate.'),
    ('Slide 3 — Model',  '45s',
     'XGBoost tournament winner. AUC=0.88: catches 82% of churners with 67% precision.'),
    ('Slide 4 — Explanation', '60s',
     'Top 3 signals: days since last purchase, support tickets, plan type. SHAP beeswarm.'),
    ('Slide 5 — Business impact', '45s',
     'At 15% retention rate from targeted offers: estimated $360k annual recovery.'),
    ('Slide 6 — Next steps', '30s',
     'A/B test for 90 days. Weekly retraining. Fairness audit before full rollout.')
]
for slide, timing, content in demo_outline:
    print(f'{slide} [{timing}]: {content}')

Teste den pakkede modellen

Før De erklærer modellen som klar for produksjon, bør De skrive automatiserte tester for prediksjonsgrensesnittet. Test at prediksjonene ligger i intervallet [0, 1], at manglende egenskaper utløser en tydelig feil, at modellens resultat er deterministisk på tvers av kall, og at ytelsen på et lite, merket testdatasett samsvarer med de dokumenterte måltallene. Disse testene kjøres i CI ved hver kodeendring og oppdager stille regresjoner før de når brukerne.

import pytest
import numpy as np
from churn_model.predictor import predict

def test_output_is_probability():
    sample = {'days_since_last_purchase': 45, 'total_spend_90d': 120.5, 'support_tickets': 2}
    result = predict(sample)
    assert 0.0 <= result['churn_probability'] <= 1.0

def test_missing_feature_raises():
    with pytest.raises(KeyError):
        predict({'days_since_last_purchase': 45})  # missing required features

def test_deterministic():
    sample = {'days_since_last_purchase': 10, 'total_spend_90d': 500.0, 'support_tickets': 0}
    r1 = predict(sample)['churn_probability']
    r2 = predict(sample)['churn_probability']
    assert r1 == r2  # model must not use randomness at inference

print('Run: pytest test_predictor.py -v')

Sette opp overvåking før lansering

Før De slår på produksjonsmodellen, konfigurerer De overvåking slik at De umiddelbart vet om modellen blir dårligere. Logg hver prediksjon (inndataegenskaper, sannsynlighet, terskelavgjørelse og tidsstempel) i et strukturert datalager. Sett opp dashbord som følger med på prediksjonsvolum per dag, gjennomsnittlig sannsynlighet over tid og andelen falske positiver i et merket utvalg. Definer alarmterskler: Hvis gjennomsnittlig sannsynlighet synker med mer enn 0,1, eller ukentlig AUC synker under 0,82, skal en ny treningskjøring startes automatisk.

# Prediction logging middleware
import json
import time
from pathlib import Path

LOG_FILE = Path('/var/log/churn_model/predictions.jsonl')
LOG_FILE.parent.mkdir(parents=True, exist_ok=True)

def predict_and_log(features: dict) -> dict:
    result = predict(features)
    log_entry = {
        'timestamp': time.time(),
        'customer_id': features.get('customer_id'),
        'churn_probability': result['churn_probability'],
        'churn_flag': result['churn_flag']
    }
    with open(LOG_FILE, 'a') as f:
        f.write(json.dumps(log_entry) + '\n')
    return result

print('Prediction logging writes to JSONL; ingest into Grafana or BigQuery for dashboarding.')

Den komplette sjekklisten for leveransen

En produksjonsklar ML-leveranse består av: modellartefakt (serialisert pipeline + JSON-metadata), modellkort (problem, data, måltall, rettferdighet og forbehold), prediksjonsmodul (ryddig Python-grensesnitt med validering av inndata), automatiserte tester (enhets- og integrasjonstester), ytelsesartefakter (ROC-, PR- og SHAP-diagram), oppsett for overvåking (prediksjonslogging + alarmterskler) og presentasjon for interessenter (fem minutters demonstrasjon). Til sammen gjør dette modellen etterprøvbar, reproduserbar og vedlikeholdbar gjennom hele levetiden.

final_checklist = [
    '[x] Trained pipeline serialised with joblib + SHA-256 verified',
    '[x] JSON metadata sidecar with training date, metrics, and feature names',
    '[x] Model card written and reviewed by domain expert',
    '[x] SHAP global importance plot attached to model card',
    '[x] ROC + PR curve + confusion matrix artefacts generated',
    '[x] Fairness audit: demographic parity difference < 0.05',
    '[x] Prediction module with clean API and input validation',
    '[x] 100% test coverage of prediction module (pytest)',
    '[x] Prediction logging middleware deployed',
    '[x] Alert thresholds configured in monitoring dashboard',
    '[x] Stakeholder demo delivered and recorded'
]
for item in final_checklist:
    print(item)

Hurtigsjekk

Test forståelsen Deres av begrepene innen Machine Learning with Python fra denne leksjonen.

Oppsummering av leksjonen

I denne leksjonen har du lært å serialisere den valgte pipelinen med joblib og skrive en JSON-sidecarfil med metadata for styring, at et modellkort dokumenterer tiltenkt bruk, måltall, treningsdata, rettferdighet og forbehold for alle interessenter, og å pakke modellen inn i en testet Python-modul med logging og overvåking før utrulling. Du har nå fullført hele sporet Machine Learning with Python – fra rådata til en dokumentert, overvåket og produksjonsklar modell. Gratulerer!

Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
30
Leksjoner
120

Ofte stilte spørsmål

Er leksjonen «Pakking, dokumentasjon og presentasjon av den endelige modellen» gratis?

Ja – hele teksten i «Pakking, dokumentasjon og presentasjon av den endelige modellen» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Machine Learning Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Machine Learning Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Pakking, dokumentasjon og presentasjon av den endelige modellen»?

Serialiser den beste pipelinen, skriv et model card som dokumenterer treningsdata, ytelse, begrensninger og rettferdighetshensyn, og hold en demonstrasjon på fem minutter. Du øver på Machine Learning Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Machine Learning Academy?

Ingen tidligere erfaring er nødvendig. Machine Learning Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Pakking, dokumentasjon og presentasjon av den endelige modellen»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Machine Learning Academy-leksjonen?

Ja. Alle Machine Learning Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Prosjektavgrensning: definere problemet og suksesskriteriene
  2. Databearbeiding og eksplorativ dataanalyse
  3. Turnering i modellvalg: sammenlign fem algoritmer
  4. Pakking, dokumentasjon og presentasjon av den endelige modellen
← Tilbake til Machine Learning Academy