Inżynieria funkcji i wybór funkcji
1) Cel i zasady
Cel: budowa stabilnych, możliwych do interpretacji i ekonomicznych funkcji uzgodnionych w trybie offline i online.
Zasady:- Punkt w czasie: funkcje są obliczane z danych dostępnych w momencie rozwiązania, bez przyszłości (anty-wyciek).
- Domena pierwsza: funkcje odzwierciedlają mechanikę biznesową (depozyty, sesje, gatunki gier, RG/AML).
- Reuse & Contracts: Funkcja Sklep wersje, właściciele, formuły i SLO.
- Świadomi kosztów: rozważamy opóźnienia i koszt obliczeń/przechowywania → urzeczywistnić tylko zwrot.
- Obserwowalność: monitorowanie dryfu/stabilności/kalibracji; test równoważności online/offline.
2) Charakterystyczna taksonomia dla iGaming
RFM/behavioral: recency/frequency/monetary by windows (10m/1h/1d/7d/30d).
Sesja: czas trwania, przerwy, zmiany urządzenia/ASN, szybkość działania.
Środki finansowe: depozyty/wypłaty/obciążenie zwrotne, akcje metod płatności, normalizacja FX.
Gry: profile gatunkowe, zmienność dostawcy, klastry RTP, win-streak.
Marketing: kanały/UTM, reakcje kampanii, nasycenie/cooldown.
RG/AML: limity, flagi samodzielnego wyłączenia, wzory prędkości, ponowne użycie BIN/IP.
Geo/czas: kalendarze lokalne/wakacje, godzina pasa, wieczór/noc.
Wykres: łącza karta-urządzenie-ip, centralność/komponenty, pierścienie oszustwa.
NLP/teksty: tematy i ton biletów/czatów; najważniejsze skargi.
Działanie: błędy lag/provider, stabilność sesji (dla modeli SRE).
3) Okna i agregaty (punkt w czasie)
Typowe okna: 10m/1h/24h/7d/30d. Dla każdego okna - liczba/suma/średnia/std/last/max/min, stosunek i szybkość.
Szablon SQL (depozyty 30d, brak przyszłości):sql
SELECT u.user_pseudo_id, t.asof,
SUM(CASE WHEN e.type='deposit'
AND e.event_time>=t.asof - INTERVAL '30' DAY
AND e.event_time< t.asof THEN e.amount_base ELSE 0 END) AS dep_30d,
COUNT(CASE WHEN e.type='bet'
AND e.event_time>=t.asof - INTERVAL '7' DAY
AND e.event_time< t.asof THEN 1 END) AS bets_7d
FROM silver.fact_events e
JOIN (SELECT user_pseudo_id, DATE(event_time) AS asof
FROM silver.fact_events GROUP BY 1,2) t USING(user_pseudo_id)
JOIN dim.users_scd u ON u.user_pseudo_id=t.user_pseudo_id
AND t.asof >= u.valid_from AND (u.valid_to IS NULL OR t.asof < u.valid_to)
GROUP BY 1,2;
4) Kategoryczne kodowania
One-Hot/Hashing: dla rzadkich/wysokich kategorii kardynalnych (gry, dostawcy).
Kodowanie docelowe (TE): średnie docelowe z k-fold/leave-one-out i świadomy czasu anty-wyciek.
WOE/IV (ocena ryzyka): monotoniczne kosze z kontrolą IV i stabilnością.
python for fold in time_folds:
train_idx, val_idx = split_by_time(fold)
te_map = target_mean(train[["provider_id","label"]])
val["provider_te"] = val["provider_id"].map(te_map).fillna(global_mean)
5) Normalizacja i skalowanie
Min-max/Robust/Z-score - przez okno treningowe; zapisać parametry w artefaktach.
Konwersje dziennika dla długich ogonów sumy/zakładu.
Box-Cox/Yeo-Johnson - gdy wymagana jest symetrizacja.
6) Funkcje tymczasowe i sezonowe
Kalendarz: dzień tygodnia, godzina, wakacje na rynku (kalendarz), dzień płatny.
Częstotliwość: średnie ruchome/wykres. wygładzanie (EMA), delty (t − t-1).
Zdarzenie oparte na: czas od ostatniego depozytu/wygranej/straty, „chłodzenie”.
7) Cechy wykresu (oszustwo/AML)
Piony: użytkownik/karta/urządzenie/ip. Krawędzie: transakcje/sesje/wspólne cechy.
Cecha: rozmiar komponentu, stopień, betweeness, pagerank, triady, ponowny wygląd.
Wzór: partia nocna buduje wykres → osadzanie/centralność → cache online.
8) Funkcje NLP (wsparcie/czaty/recenzje)
Podstawowe: tematy TF-IDF/NMF, sentyment, długość, częstotliwość narzekań.
Zaawansowane: osadzanie (Sentence-BERT) → uśrednianie na biletach na okno.
PII: pre- i post-masking (e-mail, PAN, telefony) według zasad.
9) Geo/ASN i urządzenia
IP → Geo/ASN: buforujemy i aktualizujemy; nie dokonuj synchronicznych żądań online bez czasu/pamięci podręcznej.
Cechy: stabilność ASN/ ID, częstotliwość zmiany, odległość między loginami.
10) Przeciwdziałanie wyciekom i pojednanie online/offline
Dołączyć punkt w czasie, żadnych przyszłych wydarzeń w oknach/etykietach.
Jeden kod transformacji (biblioteka) dla offline i online.
Test równoważności: na próbce T porównujemy online wartości funkcji z offline (MAE/MAPE).
yaml name: deposits_sum_10m owner: ml-risk slo: {latency_ms_p95: 20, availability: 0.999}
offline:
source: silver.payments transform: "SUM(amount_base) OVER 10m BY user_pseudo_id"
online:
compute: "streaming_window: 10m"
tests:
- compare_online_offline_max_abs_diff: 0.5
11) Wybór funkcji
11. 1 Filtr
11. 2 Opakowanie
RFE/Sequential FS: na małych zestawach/regresji logistycznej.
Wybór stabilności: stabilność próbkowania butów.
11. 3 Wbudowane
L1/Lasso/ElasticNet: rarefakcja.
Drzewa/GBDT: znaczenie/SHAP dla wyboru i interpretacji biznesowej.
Grupa Lasso: wybór grupy (zestawy funkcji bin jednej zmiennej).
python
X = preprocess(raw) # one-hot/TE/scale
X = drop_const_and_corr(X, thr=0.95)
rank_mi = mutual_info_rank(X, y)
keep1 = topk(rank_mi, k=200)
model = LGBMClassifier(...)
model.fit(X[keep1], y)
shap_vals = shap.TreeExplainer(model).shap_values(X[keep1])
keep2 = stable_topk_by_shap(shap_vals, k=60, bootstrap=20)
final = keep2
12) Stabilność, dryfowanie i kalibracja
Drift: PSI/KS dla funkcji i prędkości; wpisy w przypadku przekroczenia progów.
Stabilność: zegarek na „kruche” TE/WOE (kardynalność/zmiany).
Kalibracja: Platt/izotoniczna; raporty wiarygodności.
Analiza plasterków: rynki/dostawcy/urządzenia - mierniki i przewidywany koszt błędów.
13) Inżynieria kosztowa i wydajność
Koszt na funkcję (CPF): CPU/IO/network/storage → model budget.
Materializacja: ciężkie offline, światło online; TTL/pamięć podręczna do gorących funkcji.
Remote lookups: tylko async + cache; p95 <20-30 ms na funkcji online.
Obciążenie zwrotne: rozliczanie kosztów funkcji/wniosków według polecenia.
14) Sklep z funkcjami (jądro konsystencji)
Rejestr: nazwa, formuła, właściciel, SLO, testy, wersje.
Synchronizacja online/offline: jeden kod transformacji, test równości.
Dzienniki/audyty: kto zmienił wzór; wpływ wersji na mierniki modelu.
15) Przykłady
ClickHouse: agregaty zakładów minutowych:sql
CREATE MATERIALIZED VIEW mv_bets_1m
ENGINE = SummingMergeTree()
PARTITION BY toDate(event_time)
ORDER BY (toStartOfMinute(event_time), user_pseudo_id)
AS
SELECT toStartOfMinute(event_time) AS ts_min,
user_pseudo_id,
sum(stake_base) AS stake_sum_1m,
count() AS bets_1m
FROM stream.game_events
GROUP BY ts_min, user_pseudo_id;
Spadek antykorelacji (idea SQL):
sql
-- вычислить корреляции и удалить пары с ρ >0.95, сохранив более «дешевую» фичу
Bining WOE (szkic):
python bins = monotonic_binning(x, y, max_bins=10)
woe = compute_woe(bins)
iv = compute_iv(bins)
16) Procesy i RACI
R (odpowiedzialny): Data Eng (pipelines/Feature Store), Data Science (design feature/selection/metrics).
A (Odpowiedzialność): szef danych/CDO.
C (Konsultowane): Zgodność/DPO (PII, miejsce zamieszkania), Ryzyko/AML/RG (polityka), SRE (SLO/koszt), Bezpieczeństwo.
I (Poinformowany): Produkt/Marketing/Operacje/Wsparcie.
17) Plan działania
MVP (3-5 tygodni):1. Katalog top 50 funkcji (Płatności/Gameplay) z formułami point-in-time.
2. Funkcja Sklep v1 (online/offline) + test równoważności.
3. Wybór podstawowy: stałe/korelacje → MI → L1/SHAP shortlist (do 60 funkcji).
4. Monitorowanie funkcji dryfu i desek rozdzielczych.
Faza 2 (5-10 tygodni):- TE/WOE z aktualizacją czasu, wykresem i funkcjami kalendarza.
- Analiza plasterków i uczciwość, kalibracja prawdopodobieństwa.
- Materializacja ciężkich funkcji offline, pamięci podręcznej online, kwot.
- Automatyczna generacja dokumentacji, wybór stabilności w CI.
- Automatyczne dezaktywowanie „drogich i bezużytecznych” funkcji (CPF, vklad, wklad).
- A/B porównanie zestawów funkcji, raporty kosztów oczekiwanych.
18) Lista kontrolna przedsprzedaży
- Wszystkie funkcje mają specyfikacje (właściciel, formuła, wersje, SLO).
- Przeszedł testy równoważności w czasie i online/offline.
- Filtr → osadzony (SHAP/L1) → stabilność zakończona.
- Skonfigurowany monitoring dryfu i niezawodność; progi i wpisy są.
- CPF/latency wpisują się w budżet; ciężkie cechy zmaterializowane.
- Polityka PII spełniona (CLS/RLS, tokenizacja, rezydencja).
- Dokumentacja i przypadki użytkowania zostały dodane do katalogu.
19) Przeciwdziałanie modelom i ryzyku
Lakage (przyszłe wydarzenia/promo następstwa).
Niespójne formuły online/offline.
Oversupplied one-hot z wysokich kategorii kardynalnych bez hashing/TE.
„Drogie” funkcje bez wymiernego wzrostu jakości.
Brak analizy plasterków/uczciwości - ukryta degradacja.
TE/WOE bez czasowej weryfikacji krzyżowej → przekwalifikowanie.
20) Sedno sprawy
Funkcja Inżynieria to dyscyplina zarządzana: punkt w czasie, poczucie biznesu, odtwarzalność, monitorowanie i ekonomia. Silne funkcje + ścisły wybór (filtr/wrapper/wbudowany) i pojedynczy sklep funkcyjny dają stabilne, interpretowalne i tanie modele, które poprawiają przychody netto, zmniejszają oszustwa i wspierają RG - przejrzyste i zgodne.