You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# Policyscope: офлайн-оценка рекомендательных систем
1
+
# Policyscope: офлайн‑оценка политик рекомендаций (переиспользуемый пайплайн)
2
2
3
-
**Policyscope** помогает сравнивать рекомендательные модели без запуска дорогостоящих A/B‑тестов.
4
-
Библиотека переиспользует логи текущей политики и оценивает, насколько другая политика могла бы увеличить целевую метрику.
5
-
Все оценщики ведут подробное логирование на русском языке.
3
+
`Policyscope` помогает оценивать новую политику **B** по логам текущей политики **A** без онлайн A/B‑теста.
6
4
7
-
## Как это работает
8
-
9
-
1.**Собираем логи** текущей политики A: какое действие показали, с какой вероятностью и как реагировал пользователь.
10
-
2.**Определяем новую политику B** — например, другую модель рекомендаций.
11
-
3.**Пере‑взвешиваем** наблюдения из логов A и получаем приближённое значение метрики под политикой B.
12
-
13
-
## Реализованные алгоритмы
14
-
15
-
-**Replay** — учитывает только те логи, где B совпадает с A.
16
-
-**IPS** — взвешивает отклики по отношению вероятностей выбора в B и A.
17
-
-**SNIPS** — нормализует веса IPS для меньшей дисперсии.
18
-
-**DM (Direct Method)** — строит модель отклика и прогнозирует исходы под политикой B.
19
-
-**Doubly Robust (DR)** — комбинирует Direct Method и IPS; достаточно корректности хотя бы одной из них.
20
-
-**SN-DR** — нормализует поправку IPS на общий вес, улучшая устойчивость.
21
-
-**Switch-DR** — вариант DR, использующий DM для наблюдений с очень большим весом IPS, чтобы уменьшить разброс.
22
-
23
-
## Предположения и ограничения
24
-
25
-
-**Replay** — новая политика должна часто совпадать со старой, иначе большинство логов отбрасывается.
26
-
-**IPS** — требует точного знания вероятностей действий в обеих политиках; большие веса увеличивают дисперсию.
27
-
-**SNIPS** — нормализует веса IPS и снижает дисперсию, но остаётся чувствительным к ошибкам вероятностей и малым объёмам данных.
28
-
-**DM (Direct Method)** — зависит от точности модели отклика и может смещаться вне обучающей области.
29
-
-**Doubly Robust (DR)** — корректность достигается, если верна хотя бы модель отклика или пропенсити, но метод чувствителен к ошибкам обеих моделей и выбору клиппинга.
30
-
-**SN-DR** — нормализует поправку IPS на общий вес, уменьшает дисперсию DR, но наследует его предположения.
31
-
-**Switch-DR** — отбрасывает экстремальные веса, сочетая DM и DR, но выбор порога влияет на смещение.
32
-
33
-
## Jupyter-туториал
34
-
35
-
Интерактивный ноутбук с теорией и примером расчёта ATE доступен в файле [examples/tutorial.ipynb](examples/tutorial.ipynb).
36
-
В нём разница между политиками вычисляется как `V_DR(B) - V_DR(A)`,
37
-
а истинный эффект оценивается по 100 MC-сэмплам симулятора.
5
+
Главное в текущей версии:
6
+
- API стал **универсальным**: названия колонок (`a_A`, `a_B`, целевая метрика, `user_id`) и список признаков задаются аргументами.
7
+
- Туториал стал короче и практичнее: есть компактный сценарий «взял свой DataFrame → получил все OPE‑оценки».
8
+
- Бутстрэп для DR можно вызывать одной функцией (`dr_with_bootstrap_ci`) без ручной сборки циклов.
В репозитории есть скрипт, который генерирует пользователей и сравнивает две политики.
55
-
56
-
```bash
57
-
python examples/run_synthetic_experiment.py \
58
-
--n_users 50000 \
59
-
--seed 42 \
60
-
--policyA epsilon_greedy --epsilon 0.15 \
61
-
--policyB softmax --tau 0.7 \
62
-
--horizon 90 \
63
-
--weight_clip 20
64
-
```
65
-
66
-
После запуска создаётся папка `artifacts` с логами, оценками и коротким текстовым отчётом.
67
-
68
-
При работе на синтетике полезно сравнивать офлайн‑оценки с истинным эффектом (oracle). Такое сравнение позволяет проверить состоятельность методов OPE и убедиться, что оценщики не дают систематического смещения.
69
-
70
-
## Требования к входным данным
71
-
72
-
Логи политики A должны содержать обязательные поля:
19
+
## Что реализовано
73
20
74
-
-`user_id` — идентификатор пользователя;
75
-
-`a_A` — действие, которое показала политика A;
76
-
-`propensity_A` — вероятность выбора этого действия политикой A;
77
-
-`accept` и/или `cltv` — отклик и ценность;
78
-
-признаки пользователя (возраст, доход и др.), используемые моделью.
21
+
-Replay
22
+
-IPS / SNIPS
23
+
-DM (Direct Method)
24
+
-DR / SNDR / Switch-DR
25
+
-Кластерный и обычный бутстрэп (если `cluster_col=None`)
79
26
80
-
Числовые поля `age`, `risk` и `income` можно передавать в исходном масштабе:
81
-
функции обучения (`train_pi_hat`, `train_mu_hat`) автоматически выполняют их
82
-
нормализацию.
27
+
## Минимальный формат данных
83
28
84
-
## Анализ входных данных
29
+
Нужны:
30
+
- колонка действия, зафиксированного в логах A (по умолчанию `a_A`),
31
+
- целевая метрика (например, `accept`, `cltv` или ваша `reward`),
32
+
- признаки (`feature_cols`),
33
+
- опционально `user_id` для кластерного бутстрэпа.
85
34
86
-
Чтобы быстро проверить логи и понять, какие методы off-policy оценки доступны,
87
-
воспользуйтесь утилитой:
35
+
Дополнительно можно хранить `a_B` (действие рекомендованное B) для диагностики и таблиц в туториале.
88
36
89
-
```python
90
-
from policyscope.report import analyze_logs
91
-
print(analyze_logs(df, policyB))
92
-
```
93
-
94
-
Функция сообщит о наличии ключевых колонок, пересечении политик для Replay и
95
-
подскажет, что требуется для IPS/SNIPS, DM и DR.
96
-
97
-
## Пример применения на своих данных
98
-
99
-
Функции обучения выполняют внутреннюю нормализацию числовых признаков,
100
-
поэтому в DataFrame достаточно сырых столбцов `age`, `risk` и `income`.
37
+
## Универсальный пример на своих данных
101
38
102
39
```python
103
40
import numpy as np
@@ -107,63 +44,81 @@ from policyscope.estimators import (
0 commit comments