Pakowanie, dokumentowanie i prezentowanie końcowego modelu
Uczestnicy zserializują zwycięski potok, napiszą kartę modelu opisującą dane treningowe, wydajność, ograniczenia i aspekty sprawiedliwości oraz przeprowadzą pięciominutową prezentację demonstracyjną.
Pakowanie, dokumentowanie i prezentowanie końcowego modelu to bezpłatna lekcja Machine Learning Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Machine Learning Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Machine Learning Academy zawiera 4 lekcji w sumie.
Dlaczego pakowanie i dokumentacja mają znaczenie
Model, który istnieje wyłącznie w notatniku Jupyter, nie jest gotowym produktem — jest prototypem. Pakowanie oznacza serializację wytrenowanego potoku do przenośnego artefaktu, który można wczytać i używać bez oryginalnego kodu treningowego. Dokumentacja oznacza przygotowanie karty modelu opisującej działanie modelu, dane użyte do jego trenowania, jego skuteczność, potencjalne obszary błędów oraz osoby, które powinny go używać. Razem pakowanie i dokumentacja przekształcają wyniki badań w odpowiedzialne oprogramowanie produkcyjne.
Serializacja finalnego potoku za pomocą joblib
joblib.dump serializuje dopasowany potok scikit-learn (w tym wszystkie moduły wstępnego przetwarzania i model) do jednego pliku. Plik ten można wczytać w dowolnym środowisku Python z zainstalowaną tą samą wersją scikit-learn. Należy użyć ustrukturyzowanej nazwy pliku zawierającej informacje o projekcie, typie modelu, dacie trenowania i mierniku skuteczności, aby można było zidentyfikować dowolny artefakt bez odczytywania jego dodatkowych metadanych.
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))Zapisywanie dodatkowego pliku metadanych JSON
Obok serializowanego modelu należy zapisać plik metadanych .json opisujący artefakt. Taki dodatkowy plik umożliwia narzędziom do zarządzania modelami indeksowanie ich bez wczytywania pliku binarnego. Należy uwzględnić: datę trenowania, wersję lub hash zbioru danych, wersję scikit-learn, metryki skuteczności z walidacji krzyżowej, nazwy cech oraz hash SHA-256 pliku modelu, aby wykrywać manipulacje lub uszkodzenia.
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))Tworzenie karty modelu
Karta modelu (Mitchell i in., 2019) to krótki dokument — zazwyczaj obejmujący 1–2 strony — opisujący model z myślą o osobach, które będą z niego korzystać lub na które będzie on oddziaływać. Jest podzielona na sekcje: informacje o modelu, przeznaczenie, metryki, dane treningowe, dane ewaluacyjne, kwestie etyczne oraz zastrzeżenia i zalecenia. Karty modeli są obecnie wymagane przez unijny akt w sprawie sztucznej inteligencji dla systemów AI wysokiego ryzyka i zalecane przez głównych dostawców rozwiązań uczenia maszynowego.
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)Generowanie artefaktów skuteczności
Do karty modelu należy dołączyć najważniejsze wizualizacje jako dowody skuteczności. Standardowe artefakty obejmują: krzywą ROC z oznaczoną wartością AUC, krzywą precyzja–czułość (bardziej przydatną w przypadku niezrównoważonych klas), macierz pomyłek przy progu wdrożeniowym oraz wykres beeswarm SHAP przedstawiający globalną ważność cech. Każdy artefakt należy zapisać jako plik PNG, aby można było dołączyć go do repozytorium karty modelu obok artefaktu binarnego.
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)Wersjonowanie za pomocą Git i DVC
Artefakty modeli i zbiory danych powinny być wersjonowane wraz z kodem. Git śledzi kod i pliki JSON z metadanymi. DVC (Data Version Control) śledzi duże pliki binarne (serializowane modele, zbiory danych) oddzielnie, w magazynie obiektowym (S3, GCS), przechowując w Git jedynie niewielki wskaźnik. Zapewnia to pełny ślad audytowy: dla każdego zatwierdzenia w git można odtworzyć dokładny artefakt modelu i zbiór danych, które doprowadziły do jego utworzenia.
# 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.')Pakowanie jako moduł Python
W celu ponownego użycia w wielu usługach należy opakować model w lekki pakiet Python z przejrzystym interfejsem predykcji. Należy zdefiniować funkcję predict(features: dict) -> dict, która wczytuje model raz podczas importowania modułu, sprawdza poprawność danych wejściowych, wykonuje predykcję i zwraca ustrukturyzowaną odpowiedź. Dzięki temu użytkownik interfejsu nie jest zależny od formatu serializacji, a sam interfejs można testować niezależnie od pliku binarnego modelu.
# 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}Przygotowanie pięciominutowej prezentacji demonstracyjnej
Prezentacja podsumowująca projekt musi w ciągu pięciu minut przekazać wartość modelu interesariuszom nietechnicznym. Należy zbudować ją według schematu: (1) Problem — koszt odejść klientów; (2) Rozwiązanie — co przewiduje model; (3) Wyniki — AUC i szacowany wpływ biznesowy; (4) Wyjaśnienie — najważniejsze cechy SHAP budujące zaufanie; (5) Kolejne kroki — plan testu A/B i harmonogram ponownego trenowania. Należy zacząć od wartości biznesowej, a nie od szczegółów algorytmu.
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}')Testowanie spakowanego modelu
Przed uznaniem modelu za gotowy do użycia w środowisku produkcyjnym należy napisać automatyczne testy interfejsu predykcji. Należy sprawdzić, czy predykcje mieszczą się w przedziale [0, 1], brakujące cechy powodują wyświetlenie jasnego błędu, wynik modelu jest deterministyczny w kolejnych wywołaniach, a skuteczność na małym, oznaczonym zbiorze danych testowych odpowiada udokumentowanym metrykom. Testy te są uruchamiane w CI przy każdej zmianie kodu i wykrywają ciche regresje, zanim dotrą one do użytkowników.
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')Konfigurowanie monitorowania przed uruchomieniem
Przed uruchomieniem systemu produkcyjnego należy skonfigurować monitorowanie, aby natychmiast wiedzieć, jeśli skuteczność modelu zacznie spadać. Każdą predykcję (cechy wejściowe, prawdopodobieństwo, decyzję wynikającą z progu i znacznik czasu) należy rejestrować w ustrukturyzowanym magazynie danych. Należy skonfigurować pulpity śledzące: dzienną liczbę predykcji, średnie prawdopodobieństwo w czasie oraz odsetek wyników fałszywie dodatnich na oznaczonej próbce. Należy zdefiniować progi alertów: jeśli średnie prawdopodobieństwo spadnie o więcej niż 0,1 lub tygodniowa wartość AUC spadnie poniżej 0,82, należy automatycznie uruchomić ponowne trenowanie.
# 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.')Pełna lista kontrolna gotowego produktu
Gotowy do użycia w środowisku produkcyjnym produkt uczenia maszynowego składa się z: artefaktu modelu (serializowany potok i metadane JSON), karty modelu (problem, dane, metryki, sprawiedliwość, zastrzeżenia), modułu predykcji (przejrzysty interfejs Python ze sprawdzaniem poprawności danych wejściowych), automatycznych testów (jednostkowych i integracyjnych), artefaktów skuteczności (krzywa ROC, krzywa PR, wykres SHAP), konfiguracji monitorowania (rejestrowanie predykcji i progi alertów) oraz prezentacji dla interesariuszy (pięciominutowa prezentacja demonstracyjna). Razem elementy te sprawiają, że model jest audytowalny, odtwarzalny i możliwy do utrzymania przez cały okres eksploatacji.
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)Szybki test
Sprawdź swoją wiedzę na temat zagadnień związanych z uczeniem maszynowym w języku Python z tego modułu.
Podsumowanie modułu
W tej lekcji nauczyli się Państwo: serializować zwycięski potok za pomocą joblib i zapisywać dodatkowy plik JSON z metadanymi na potrzeby zarządzania, karta modelu opisuje jego zamierzone zastosowanie, metryki, dane treningowe, kwestie sprawiedliwości i ograniczenia z myślą o każdym interesariuszu oraz opakowywać model w przetestowany moduł Python z logowaniem i monitorowaniem przed wdrożeniem. Ukończyli już Państwo całą ścieżkę Machine Learning with Python — od surowych danych aż po udokumentowany, monitorowany model gotowy do użycia w środowisku produkcyjnym. Gratulacje!
Ucz się Python dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 30
- Lekcje
- 120
Często zadawane pytania
Czy lekcja „Pakowanie, dokumentowanie i prezentowanie końcowego modelu” jest bezpłatna?
Tak — pełny tekst „Pakowanie, dokumentowanie i prezentowanie końcowego modelu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Machine Learning Academy, przejdź na CoddyKit PRO. Kurs Machine Learning Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Pakowanie, dokumentowanie i prezentowanie końcowego modelu”?
Uczestnicy zserializują zwycięski potok, napiszą kartę modelu opisującą dane treningowe, wydajność, ograniczenia i aspekty sprawiedliwości oraz przeprowadzą pięciominutową prezentację demonstracyjną. Ćwiczysz Machine Learning Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Machine Learning Academy?
Nie wymagamy żadnego doświadczenia. Machine Learning Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Pakowanie, dokumentowanie i prezentowanie końcowego modelu”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Machine Learning Academy?
Tak. Każda lekcja Machine Learning Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Zakres projektu: określanie problemu i kryteriów sukcesu
- Przygotowanie danych i eksploracyjna analiza danych
- Turniej wyboru modelu: porównanie pięciu algorytmów
- Pakowanie, dokumentowanie i prezentowanie końcowego modelu