GH GambleHub

Feature Engineering et sélection des caractéristiques

1) Désignation et principes

Objectif : Concevoir des caractéristiques durables, interprétables et rentables, harmonisées entre l'offline et l'online.

Principes :
  • Point-in-time : les fiches sont calculées à partir des données disponibles au moment de la décision, sans futur (anti-leakage).
  • Domain-first : les fiches reflètent les mécanismes d'affaires (dépôts, sessions, genres de jeux, RG/AML).
  • Reuse & Contrats : fiches - versions, propriétaires, formules et SLO dans Feature Store.
  • Cost-aware : nous considérons la latency et le coût du calcul/stockage → nous ne matérialisons que ce qui est récupérable.
  • Observability : Surveiller la dérive/stabilité/étalonnage ; test d'équivalence online/offline.

2) Taxonomie des traits pour iGaming

RFM/comportemental : recency/frequency/monetary par les fenêtres (10m/1h/1d/7d/30d).
Session : durées, pauses, changements de périphériques/ASN, vitesse d'action.
Financier : dépôts/conclusions/chargbacks, parts des méthodes de paiement, normalisation FX.
Jeux : profils de genre, volatilité des fournisseurs, clusters RTP, win-streak.
Marketing : canaux/UTM, réponses aux campagnes, saturation/cooldown.
RG/AML : limites, drapeaux d'auto-exclusion, modèles velocity, réutilisation BIN/IP.
Geo/heure : calendriers locaux/vacances, heure de ceinture, soirée/nuit.
Graphiques : liens user-card-device-ip, centrales/composants, « anneaux » frod.
NLP/textes : thèmes et tonalité des tiquets/chats ; plaintes clés.
Exploitation : erreurs de fournisseur, stabilité des sessions (pour les modèles SRE).


3) Fenêtres et agrégats (point-in-time)

Fenêtres types : 10m/1h/24h/7d/30d. Pour chaque fenêtre est count/sum/mean/std/last/max/min, ratio et rate.

Modèle SQL (30d dépôts, sans avenir) :
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) Codages catégoriques

One-Hot/Hashing : pour les catégories rares/haut-cardinales (jeux, fournisseurs).
Target Encoding (TE) : moyenne du ciblage avec k-fold/leave-one-out et time-aware (anti-leakage).
WOE/IV (risque-scoring) : bines monotones avec contrôle IV et stabilité.

TE (pseudo-code, time-aware) :
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) Normalisation et skating

Min-max/Robust/Z-score - par fenêtre d'entraînement ; Nous gardons les paramètres dans les artefacts.
Conversion de journal pour les longues queues de montants/paris.
Box-Cox/Yeo-Johnson - lorsque la symétrie est nécessaire.


6) Fiches temporaires et saisonnières

Calendrier : jour de la semaine, heure, fête du marché (ref. calendar), pay-day.
Périodicité : moyenne mobile/expo. lissage (EMA), deltas (t − t-1).
Event-based : temps du dernier dépôt/gain/perte, « refroidissement ».


7) Caractéristiques graphiques (frod/AML)

Sommets : user/card/device/ip. Côtes : transactions/sessions/signes communs.
Fichi : composants de taille, degree, betweenness, pagerank, triads, réapparition.
Modèle : nightly batch construit un graphique → embedding/centralité → cache en ligne.


8) NLP-fiches (Sapport/chats/rhubarbe)

Base : TF-IDF/NMF sujets, sens, longueur, fréquence des plaintes.
Avancé : Embeddings (Sentence-BERT) → la moyenne des tiquets par fenêtre.
PII : post-masquage (email, PAN, téléphones) selon les politiques.


9) Géo/ASN et appareils

IP→Geo/ASN : mise en cache et mise à jour ; ne pas effectuer de requêtes synchrones en ligne sans délai/cache.
Fichi : stabilité ASN/DeviceID, fréquence des quarts, distance entre les logins.


10) Anti-leakage et négociation en ligne/hors ligne

Point-in-time join, pas d'événements futurs dans les fenêtres/labels.
Un code de transformation (bibliothèque) pour offline et en ligne.
Test d'équivalence : sur l'échantillon T, on compare les valeurs fiches en ligne à offline (MAE/MAPE).

YAML Speck Fichi :
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) Sélection de caractéristiques (sélection de caractéristiques)

11. 1 Filter

Variation/corrélation : on supprime les constantes,ρ>0. 95 doublons.
Information mutuelle (MI) : classement des liens non linéaires.
IV/KS (risque) : pour les targets binaires en AML/RG.

11. 2 Wrapper

RFE/Sequential FS : sur petits ensembles/régression logistique.
Sélection de la stabilité : durabilité dans le butstrap-sampling.

11. 3 Embedded

L1/Lasso/ElasticNet : dilution.
Arbres/GBDT : importation/SHAP pour la sélection et l'interprétation commerciale.
Groupe Lasso : sélection de groupe (ensembles bin-fich d'une seule variable).

Pipline (croquis) :
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) Stabilité, dérive et calibrage

Drift : PSI/KS sur les fiches et la pique ; alerte lorsque les seuils sont dépassés.
Stabilité : suivre les T'/WOE « fragiles » (cardinalité/changements).
Étalonnage : Platt/Isotonic ; les rapports de diligence.
Analyse de slice : marchés/fournisseurs/appareils - métriques de banquette et coût d'erreur attendu.


13) Cost-engineering et performance

Cost per Feature (CPF) : CPU/IO/réseau/stockage → budget par modèle.
Matérialisation : lourd offline, facile en ligne ; TTL/cache pour les fiches chaudes.
Lookups distants : async + cache uniquement ; p95 <20-30 ms par fichi en ligne.
Chargeback : prise en compte du coût de la fich/inference par équipe.


14) Feature Store (noyau de cohérence)

Registre : nom, formule, propriétaire, SLO, tests, versions.
Synchronisation en ligne/hors ligne : un code de transformation, test d'égalité.
Logi/audit : qui a changé la formule ; impact de la version sur les métriques du modèle.


15) Exemples

ClickHouse : unités de mise minutes :
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;
Drop anti-corruption (idée SQL) :
sql
-- вычислить корреляции и удалить пары с     ρ    >0.95, сохранив более «дешевую» фичу
WOE binning (croquis) :
python bins = monotonic_binning(x, y, max_bins=10)
woe = compute_woe(bins)
iv = compute_iv(bins)

16) Processus et RACI

R (Responsible) : Data Eng (convoyeurs/Feature Store), Data Science (conception fich/sélection/métrique).
A (Accountable): Head of Data / CDO.
C (Consulté) : Conformité/DPO (PII, résidence), Risque/AML/RG (règlement), SRE (SLO/coût), Sécurité.
I (Informed) : Produit/Marketing/Opérations/Support.


17) Feuille de route

MVP (3-5 semaines) :

1. Catalogue top 50 fich (Payments/Gameplay) avec formules point-in-time.

2. Feature Store v1 (online/offline) + test d'équivalence.

3. Sélection de base : constantes/corrélations → MI → L1/SHAP shortlist (jusqu'à 60 fich).

4. Surveillance de la dérive fich et cost-dashboard.

Phase 2 (5-10 semaines) :
  • TE/WOE avec validation time-aware, fiches graphiques et calendriers.
  • Analyse slice et fairness, étalonnage des probabilités.
  • Matérialisation d'un trafic lourd hors ligne, cache en ligne, quotas.
Phase 3 (10-16 semaines) :
  • Autogénération de la documentation fich, stabilité-sélection en CI.
  • Auto-désactivation des fiches « coûteuses et inutiles » (CPF↑, vklad↓).
  • A/B comparaison des ensembles de fiches, rapports expected-cost.

18) Chèque-liste avant la vente

  • Toutes les fiches ont des spécifications (owner, formule, versions, SLO).
  • Les tests de point-in-time et d'équivalence online/offline sont passés.
  • Sélection effectuée : filter → embedded (SHAP/L1) → stability.
  • La surveillance de la dérive et de la relativité est configurée ; les seuils et les alertes sont là.
  • Les FPC/latitude s'inscrivent dans le budget ; les fiches lourdes sont matérialisées.
  • Les politiques PII sont respectées (CLS/RLS, Tokenization, résidence).
  • Documentation et exemples d'utilisation ajoutés au catalogue.

19) Anti-schémas et risques

Leukedge (événements futurs/effets promotionnels).
Formule en ligne/offline incohérente.
Hors de prix one-hot des catégories haut-cardinales sans hashing/TE.
Des fiches « chères » sans gain de qualité mesurable.
L'absence d'analyse slice/fairness est une dégradation latente.
TE/WOE sans validation croisée time-aware → rééducation.


20) Résultat

Feature Engineering est une discipline gérée : point-in-time, sens des affaires, reproductibilité, surveillance et économie. Des fiches solides + une sélection rigoureuse (filter/wrapper/embedded) et un seul Feature Store donnent des modèles durables, interprétables et bon marché qui améliorent Net Revenue, réduisent les frondes et soutiennent RG - de manière transparente et compacte.

Contact

Prendre contact

Contactez-nous pour toute question ou demande d’assistance.Nous sommes toujours prêts à vous aider !

Commencer l’intégration

L’Email est obligatoire. Telegram ou WhatsApp — optionnels.

Votre nom optionnel
Email optionnel
Objet optionnel
Message optionnel
Telegram optionnel
@
Si vous indiquez Telegram — nous vous répondrons aussi là-bas.
WhatsApp optionnel
Format : +code pays et numéro (ex. +33XXXXXXXXX).

En cliquant sur ce bouton, vous acceptez le traitement de vos données.