Feature Engineering и отбор признаков
1) Назначение и принципы
Цель: сконструировать устойчивые, интерпретируемые и экономичные признаки, согласованные между офлайном и онлайном.
Принципы:- Point-in-time: фичи вычисляются из данных, доступных на момент решения, без будущего (anti-leakage).
- Domain-first: фичи отражают бизнес-механики (депозиты, сессии, жанры игр, RG/AML).
- Reuse & Contracts: фичи — версии, владельцы, формулы и SLO в Feature Store.
- Cost-aware: считаем latency и стоимость вычисления/хранения → материализуем только окупаемое.
- Observability: мониторим дрейф/стабильность/калибровку; тест эквивалентности online/offline.
2) Таксономия признаков для iGaming
RFM/поведенческие: recency/frequency/monetary по окнам (10м/1ч/1д/7д/30д).
Сессионные: длительности, паузы, смены устройств/ASN, скорость действий.
Финансовые: депозиты/выводы/чарджбеки, доли методов оплаты, FX-нормализация.
Игровые: жанровые профили, волатильность провайдеров, RTP-кластеры, win-streak.
Маркетинговые: каналы/UTM, отклики на кампании, saturation/cooldown.
RG/AML: лимиты, флаги самоисключений, velocity-паттерны, повторное использование BIN/IP.
Гео/время: локальные календари/праздники, час поясов, вечер/ночь.
Графовые: связи user–card–device–ip, центральности/компоненты, «кольца» фрода.
NLP/тексты: темы и тональность тикетов/чатов; ключевые жалобы.
Операционные: лаг/ошибки провайдеров, стабильность сессий (для SRE-моделей).
3) Окна и агрегаты (point-in-time)
Типовые окна: 10м / 1ч / 24ч / 7д / 30д. Для каждого окна — count/sum/mean/std/last/max/min, ratio и rate.
SQL-шаблон (30д депозиты, без будущего):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) Категориальные кодировки
One-Hot/Hashing: для редких/высоко-кардинальных категорий (игры, провайдеры).
Target Encoding (TE): средние по таргету с k-fold/leave-one-out и time-aware сглаживанием (anti-leakage).
WOE/IV (риск-скоринг): монотонные бины с контролем IV и стабильности.
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) Нормализация и скейлинг
Мин-макс / Robust / Z-score — по тренировочному окну; сохраняем параметры в артефактах.
Лог-преобразования для длинных хвостов сумм/ставок.
Box-Cox/Yeo-Johnson — когда требуется симметризация.
6) Временные и сезонные фичи
Календарные: день недели, час, праздник рынка (ref.calendar), pay-day.
Периодичность: скользящие средние/экспон. сглаживание (EMA), deltas (t − t-1).
Event-based: время с последнего депозита/выигрыша/проигрыша, «охлаждения».
7) Графовые признаки (фрод/AML)
Вершины: user/card/device/ip. Ребра: транзакции/сессии/совместные признаки.
Фичи: размер компоненты, degree, betweenness, pagerank, triads, повторное появление.
Шаблон: nightly batch строит граф → эмбеддинги/центральности → online кэш.
8) NLP-фичи (саппорт/чаты/ревью)
Базово: TF-IDF/NMF темы, sentiment, длина, частоты жалоб.
Продвинуто: эмбеддинги (Sentence-BERT) → усреднение по тикетам за окно.
PII: до- и пост-маскирование (email, PAN, телефоны) по политикам.
9) Гео/ASN и устройства
IP→Geo/ASN: кэшируем и обновляем; не делать синхронных запросов в онлайне без таймаута/кэша.
Фичи: стабильность ASN/DeviceID, частота смен, расстояние между логинами.
10) Anti-Leakage и согласование online/offline
Point-in-time join, никаких будущих событий в окнах/лейблах.
Один код трансформаций (library) для офлайна и онлайна.
Тест эквивалентности: на выборке T сравниваем онлайн-значения фич с офлайном (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) Отбор признаков (feature selection)
11.1 Filter
11.2 Wrapper
RFE/Sequential FS: на маленьких наборах/логистической регрессии.
Stability Selection: устойчивость при бутстрэп-сэмплинге.
11.3 Embedded
L1/Lasso/ElasticNet: разреживание.
Деревья/GBDT: importance/SHAP для отбора и бизнес-интерпретации.
Group Lasso: групповой отбор (наборы бин-фич одной переменной).
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) Устойчивость, дрейф и калибровка
Drift: PSI/KS по фичам и скору; алерты при превышении порогов.
Стабильность: следим за «хрупкими» TE/WOE (кардинальность/сдвиги).
Калибровка: Platt/Isotonic; отчеты reliability.
Slice-анализ: рынки/провайдеры/устройства — бэнчмарки метрик и ожидаемой стоимости ошибок.
13) Cost-инжиниринг и производительность
Cost per Feature (CPF): CPU/IO/сеть/хранение → бюджет на модель.
Материализация: тяжелые offline, легкие online; TTL/кэш для горячих фич.
Удаленные lookups: только async + кэш; p95 < 20–30 мс на фичи в онлайне.
Chargeback: учет стоимости фич/инференса по командам.
14) Feature Store (ядро согласованности)
Реестр: имя, формула, владелец, SLO, тесты, версии.
Online/Offline синхронизация: один код трансформаций, тест равенства.
Логи/аудит: кто менял формулу; влияние версии на метрики модели.
15) Примеры
ClickHouse: минутные агрегаты ставок: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;
Anti-correlation drop (SQL-идея):
sql
-- вычислить корреляции и удалить пары с ρ >0.95, сохранив более «дешевую» фичу
WOE биннинг (эскиз):
python bins = monotonic_binning(x, y, max_bins=10)
woe = compute_woe(bins)
iv = compute_iv(bins)
16) Процессы и RACI
R (Responsible): Data Eng (конвейеры/Feature Store), Data Science (дизайн фич/отбор/метрики).
A (Accountable): Head of Data / CDO.
C (Consulted): Compliance/DPO (PII, residency), Risk/AML/RG (правила), SRE (SLO/стоимость), Security.
I (Informed): Продукт/Маркетинг/Операции/Поддержка.
17) Дорожная карта
MVP (3–5 недель):1. Каталог топ-50 фич (Payments/Gameplay) с point-in-time формулами.
2. Feature Store v1 (online/offline) + тест эквивалентности.
3. Базовый отбор: константы/корреляции → MI → L1/SHAP shortlist (до 60 фич).
4. Мониторинг дрейфа фич и cost-дашборд.
Фаза 2 (5–10 недель):- TE/WOE с time-aware валидацией, графовые и календарные фичи.
- Slice-анализ и fairness, калибровка вероятностей.
- Материализация тяжелых офлайн фич, кэш онлайна, квоты.
- Автогенерация документации фич, stability-selection в CI.
- Авто-деактивация «дорогих и бесполезных» фич (CPF↑, вклад↓).
- A/B сравнение наборов фич, отчеты expected-cost.
18) Чек-лист перед продом
- Все фичи имеют спецификации (owner, формулу, версии, SLO).
- Пройдены тесты point-in-time и эквивалентности online/offline.
- Отбор выполнен: filter → embedded (SHAP/L1) → stability.
- Мониторинг дрейфа и reliability настроен; пороги и алерты есть.
- CPF/latency вписываются в бюджет; тяжелые фичи материализованы.
- ПII-политики соблюдены (CLS/RLS, токенизация, резидентность).
- Документация и примеры использования добавлены в каталог.
19) Анти-паттерны и риски
Лейкедж (будущие события/последствия промо).
Несогласованные online/offline формулы.
Переизбыточные one-hot из высоко-кардинальных категорий без hashing/TE.
«Дорогие» фичи без измеримого прироста качества.
Отсутствие slice/fairness анализа — скрытые деградации.
TE/WOE без time-aware кросс-валидации → переобучение.
20) Итог
Feature Engineering — это управляемая дисциплина: point-in-time, бизнес-смысл, воспроизводимость, мониторинг и экономика. Сильные фичи + строгий отбор (filter/wrapper/embedded) и единый Feature Store дают устойчивые, интерпретируемые и дешевые модели, которые улучшают Net Revenue, снижают фрод и поддерживают RG — прозрачно и комплаентно.