import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import pickle
np.random.seed(42)
# === PARAMETRY — zmień tutaj ===
N_NORMAL = 2000 # liczba normalnych transakcji
N_FRAUD = 100 # liczba fraudów
# ===============================
# Normalne transakcje
normal = pd.DataFrame({
'amount': np.random.lognormal(5, 1, N_NORMAL).clip(5, 5000),
'is_electronics': np.random.binomial(1, 0.3, N_NORMAL),
'tx_per_minute': np.random.poisson(3, N_NORMAL),
'fraud': 0
})
# Fraudy
fraud = pd.DataFrame({
'amount': np.random.uniform(2000, 9000, N_FRAUD),
'is_electronics': np.random.binomial(1, 0.7, N_FRAUD),
'tx_per_minute': np.random.poisson(8, N_FRAUD),
'fraud': 1
})
df = pd.concat([normal, fraud], ignore_index=True).sample(frac=1, random_state=42)
print(f"Dataset: {len(df)} wierszy, fraud rate: {df['fraud'].mean():.1%}")Ćwiczenia 2: Model ML, FastAPI i serwowanie predykcji
Studia zaoczne | 1,5h
Cel
- Wytrenowanie modelu detekcji fraudów,
- Serwowanie modelu przez FastAPI,
- Podłączenie do Kafki — scoring w czasie rzeczywistym.
Część 1: Trening modelu (25 min)
Zadanie 1.1 — Przygotuj dane i wytrenuj model
Zadanie 1.2 — Podziel dane, wytrenuj, oceń
features = ['amount', 'is_electronics', 'tx_per_minute']
X = df[features]
y = df['fraud']
# TWÓJ KOD
# 1. train_test_split (80/20, stratify=y)
# 2. RandomForestClassifier(100)
# 3. classification_report
# 4. pickle.dump do 'fraud_model.pkl'Część 2: FastAPI (25 min)
Zadanie 2.1 — Utwórz API serwujące model
%%file fraud_api.py
from fastapi import FastAPI
from pydantic import BaseModel
import pickle, numpy as np
app = FastAPI(title="Fraud Detection API")
model = pickle.load(open('fraud_model.pkl', 'rb'))
class Transaction(BaseModel):
amount: float
is_electronics: int
tx_per_minute: int
# TWÓJ KOD
# Endpoint POST /score
# Przyjmij Transaction, zwróć: {"is_fraud": bool, "fraud_probability": float}Uruchom w terminalu:
uvicorn fraud_api:app --host 0.0.0.0 --port 8001Zadanie 2.2 — Przetestuj API
import requests
# Test normalna
r = requests.post("http://localhost:8001/score",
json={"amount": 150, "is_electronics": 0, "tx_per_minute": 3})
print("Normalna:", r.json())
# TWÓJ KOD — przetestuj podejrzaną transakcję (amount=5500, is_electronics=1, tx_per_minute=12)Część 3: Kafka + ML (25 min)
Zadanie 3.1 — Konsument z scoringiem ML
Napisz konsumenta, który czyta z transactions, odpytuje API i wysyła alerty.
%%file ml_consumer.py
from kafka import KafkaConsumer, KafkaProducer
from datetime import datetime
import json, requests
consumer = KafkaConsumer('transactions', bootstrap_servers='broker:9092',
auto_offset_reset='earliest', group_id='ml-scoring',
value_deserializer=lambda x: json.loads(x.decode('utf-8')))
alert_producer = KafkaProducer(bootstrap_servers='broker:9092',
value_serializer=lambda v: json.dumps(v).encode('utf-8'))
API_URL = "http://localhost:8001/score"
# TWÓJ KOD
# Dla każdej transakcji:
# 1. Wyciągnij cechy (amount, hour z timestamp, is_electronics, tx_per_minute=5 -lub policz)
# 2. requests.post(API_URL, json=features)
# 3. Jeśli is_fraud: wyślij do tematu 'alerts', wypisz ALERTZadanie 3.2 — Uruchom pipeline
W 3 terminalach:
python producer.py(z Ćw. 1)uvicorn fraud_api:app --host 0.0.0.0 --port 8001python ml_consumer.py
Obserwuj alerty.
Praca domowa
- Porównaj wyniki scoringu regułowego (Ćw. 1) vs ML — który lepiej wykrywa?
- Dodaj endpoint
GET /healthdo API. - Wypchnij do Git.
Następne zajęcia: Apache Spark — przetwarzanie na dużą skalę.