|
5 | 5 | `Policyscope` — библиотека для **off-policy evaluation** в постановке contextual bandit: |
6 | 6 |
|
7 | 7 | - есть логи поведения политики `A` (behavior/logging policy), |
8 | | -- нужно оценить значение политики `B` (target/candidate policy), |
9 | | -- целевые артефакты: `policy value`, `delta = value(B) - value(A)`, CI, significance metadata (`p-value` или CI-based decision) и диагностика. |
| 8 | +- оценивается политика `B` (target/candidate policy), |
| 9 | +- основные выходы: `policy value`, `delta = value(B) - value(A)`, CI, significance metadata и diagnostics. |
10 | 10 |
|
11 | | -## 2) Доменная модель (phase 1) |
12 | | - |
13 | | -### 2.1 Core entities |
| 11 | +## 2) Доменная модель |
14 | 12 |
|
15 | 13 | 1. **BanditSchema** |
16 | | - Декларирует контракт колонок: действие, награда, признаки, опционально propensity и cluster id. |
| 14 | + Контракт колонок: action, reward, features, опционально propensity и cluster id. |
17 | 15 |
|
18 | 16 | 2. **LoggedBanditDataset** |
19 | | - Лёгкая обёртка над `DataFrame` + `BanditSchema` с базовой валидацией и удобными accessors. |
| 17 | + Обёртка над `DataFrame` + `BanditSchema` с валидацией и accessors. |
20 | 18 |
|
21 | 19 | 3. **Nuisance models** |
22 | | - Модели `pi_hat` и `mu_hat`, используемые point-estimators (IPS/SNIPS/DR/...). |
23 | | - Внутренний reusable bundle-слой собран в `policyscope.nuisance`, чтобы orchestration/inference/diagnostics не дублировали сборку nuisance-объектов. |
| 20 | + `pi_hat` и `mu_hat`, используемые в weighted/model-based OPE-оценках. |
24 | 21 |
|
25 | 22 | 4. **Point estimators** |
26 | | - Оценщики значения политики (`replay`, `ips`, `snips`, `dm`, `dr`, `sndr`, `switch_dr`). |
| 23 | + `replay`, `ips`, `snips`, `dm`, `dr`, `sndr`, `switch_dr`. |
27 | 24 |
|
28 | 25 | 5. **Inference** |
29 | | - Слой построения CI и significance metadata (percentile bootstrap CI + centered paired bootstrap test), независимо от point-estimator. |
| 26 | + CI + significance metadata (включая centered paired bootstrap для проверки `delta=0`). |
30 | 27 |
|
31 | 28 | 6. **Diagnostics** |
32 | | - ESS, clipping/share, устойчивость и sanity-check метрики. |
33 | | - Диагностика обязательна рядом с инференсом, но не заменяет CI/p-value. |
34 | | - Базовые trust/stability diagnostics включают: `ESS`, `ESS/N`, replay overlap, max/p95/p99 importance weights, clip/switch share и простые warning rules. |
| 29 | + Replay overlap, ESS/ESS ratio, weight tails, clip/switch share и warning flags. |
35 | 30 |
|
36 | | -7. **Comparison result** |
37 | | - Сводка по `V_A`, `V_B`, `delta`, CI, `p-value` и диагностике для сравнения A vs B. |
38 | | - Официальный orchestration path: `policyscope.comparison.compare_policies(...)`. |
39 | | - В summary дополнительно нормализованы группы заметок/предупреждений: |
40 | | - `info_notes`, `diagnostic_warnings`, `inference_warnings`, `trust_notes`, и агрегированный `trust_level`. |
| 31 | +7. **Comparison summary** |
| 32 | + Официальный orchestration path: `compare_policies(...)`. |
| 33 | + Summary включает `V_A`, `V_B`, `Delta`, CI/p-value, diagnostics, `trust_level`, notes/warnings. |
41 | 34 |
|
42 | | -8. **Scalar target metric (core abstraction)** |
43 | | - Базовая единица оценки — одна скалярная метрика награды. Несколько метрик поддерживаются как повторные запуски оценки для разных target-колонок, а не как native vector-valued reward. |
44 | | - Для multi-target используется `compare_policies_multi_target(...)` как mapping из target -> single-target summary. |
| 35 | +8. **Scalar target abstraction** |
| 36 | + Базовая единица — одна скалярная reward-метрика. Multi-target режим реализуется как повторные scalar-оценки через `compare_policies_multi_target(...)`. |
45 | 37 |
|
46 | 38 | ## 3) Границы слоёв |
47 | 39 |
|
48 | 40 | ```text |
49 | 41 | Data contract -> Point estimation -> Inference -> Diagnostics/Reporting |
50 | 42 | ``` |
51 | 43 |
|
52 | | -- **Data contract** не знает про алгоритмы оценивания. |
53 | | -- **Point estimation** не должен дублировать логику инференса. |
54 | | -- **Inference** принимает estimator как функцию/метод и не меняет математику estimator. |
55 | | -- **Reporting** собирает результаты в человекочитаемую форму. |
56 | | - |
57 | | -## 4) Статус текущей миграции |
58 | | - |
59 | | -В этой фазе добавлен новый data contract слой (`BanditSchema`, `LoggedBanditDataset`) без массового переписывания estimator-кода. |
60 | | - |
61 | | -Это означает: |
62 | | - |
63 | | -- текущие estimator API остаются рабочими; |
64 | | -- новый слой готов для поэтапного внедрения в точках входа; |
65 | | -- математическая реализация существующих estimators не меняется. |
66 | | - |
67 | | -## 5) Migration strategy (без API-ломки) |
68 | | - |
69 | | -1. Добавить data contract и покрыть тестами. |
70 | | -2. Использовать data contract на внешних границах (tutorial/examples/high-level API). |
71 | | -3. Постепенно адаптировать внутренние вызовы estimator/inference к новому объекту. |
72 | | -4. Удалять дублирующие проверки только после стабилизации миграции. |
73 | | - |
74 | | -## 6) Non-goals этой фазы |
75 | | - |
76 | | -- Полное переписывание всех estimators на новый объект данных. |
77 | | -- Изменение математических формул/предположений существующих OPE методов. |
78 | | -- Большая переработка публичного API за один релиз. |
79 | | - |
80 | | - |
81 | | -## 7) Cross-fitting readiness (incremental) |
82 | | - |
83 | | -Почему это важно: |
84 | | -- при использовании одних и тех же данных для обучения nuisance-моделей (`pi_hat`, `mu_hat`) и финальной оценки возможен дополнительный finite-sample bias; |
85 | | -- out-of-fold предсказания уменьшают этот эффект и подготавливают почву для более строгой cross-fitting схемы. |
86 | | - |
87 | | -Что добавлено сейчас: |
88 | | -- явные структуры предсказаний: `BehaviorPredictions`, `OutcomePredictions`; |
89 | | -- контейнер `CrossFitNuisanceBundle` для fold-aware nuisance артефактов; |
90 | | -- утилиты первого уровня: `make_kfold_indices`, `generate_oof_behavior_predictions`, `generate_oof_outcome_predictions`; |
91 | | -- cross-fitting mode применим для `dm`, `dr`, `sndr`, `switch_dr` (outcome + behavior nuisance) и для `ips`, `snips` (behavior nuisance). |
92 | | -- основной orchestration path (`compare_policies`) поддерживает `use_crossfit=True` и/или внешний `nuisance_bundle` (additive path, без обязательного использования). |
| 44 | +- **Data contract**: схема и валидация входов. |
| 45 | +- **Point estimation**: оценка `V_B` выбранным estimator. |
| 46 | +- **Inference**: uncertainty/significance поверх point-estimator. |
| 47 | +- **Diagnostics/Reporting**: устойчивость и интерпретация результата. |
93 | 48 |
|
94 | | -Что пока не делаем (future work): |
95 | | -- полноценный cross-fitting rollout для каждого estimator и bootstrap-веток; |
96 | | -- жёсткий API-контракт для всех вариантов multi-fold обучения; |
97 | | -- изменение математики уже реализованных OPE-оценщиков. |
| 49 | +## 4) Официальный high-level orchestration path |
98 | 50 |
|
99 | | -Краткая migration note: |
100 | | -- текущий дефолтный workflow не меняется (внутренний fit nuisance работает как раньше); |
101 | | -- при необходимости можно заранее посчитать OOF nuisance-предсказания и передать их в `compare_policies(..., nuisance_bundle=...)`; |
102 | | -- на текущем этапе это интегрировано инкрементально и совместимо с существующим API. |
| 51 | +`compare_policies(...)` — основной entrypoint для сравнения A vs B на пользовательских логах. |
103 | 52 |
|
| 53 | +Практический default-путь: |
| 54 | +- estimator: `dr`, |
| 55 | +- propensity mode: `propensity_source="auto"`, |
| 56 | +- вместе читать `Delta`, CI/p-value, diagnostics и trust metadata. |
104 | 57 |
|
105 | | -## 8) Logged vs estimated propensity (first-class modes) |
| 58 | +## 5) Propensity source modes (logged vs estimated propensity) |
106 | 59 |
|
107 | | -Для weighted-estimators (`ips`, `snips`, `dr`, `sndr`, `switch_dr`) источник propensity теперь является явной частью orchestration: |
108 | | -- `propensity_source="auto"` — по умолчанию: сначала пытаемся взять logged propensity column, затем fallback к estimated `pi_hat`; |
109 | | -- `propensity_source="logged"` — строгий режим только по колонке логов; |
110 | | -- `propensity_source="estimated"` — всегда через behavior model. |
| 60 | +Для weighted methods (`ips`, `snips`, `dr`, `sndr`, `switch_dr`) поддерживаются first-class режимы: |
111 | 61 |
|
112 | | -Это важно методологически: logged и estimated propensity отражают разные допущения о качестве данных и модели поведения, поэтому provenance отражается в structured outputs и diagnostics. |
| 62 | +- `propensity_source="auto"`: использовать logged propensity при валидной колонке, иначе fallback на estimated behavior model; |
| 63 | +- `propensity_source="logged"`: строго использовать logged propensity column; |
| 64 | +- `propensity_source="estimated"`: всегда использовать оценённую behavior model. |
113 | 65 |
|
114 | | -Migration note: текущий API совместим назад (по умолчанию `auto`), а дополнительная metadata (`propensity_source`, `propensity_column`, fallback notes) доступна без изменения формул estimators. |
| 66 | +Эти режимы отражаются в structured output (`propensity_source`, `propensity_column`, warnings/notes). |
115 | 67 |
|
| 68 | +## 6) Nuisance-model quality diagnostics |
116 | 69 |
|
117 | | -## 9) Simulation validation harness |
| 70 | +Помимо overlap/weight diagnostics, summary содержит **nuisance-model quality diagnostics**: |
118 | 71 |
|
119 | | -Добавлен lightweight слой `policyscope.validation` для повторяемой проверки поведения estimators на synthetic-среде с oracle-значениями. |
| 72 | +- behavior-side качество для estimated propensity path; |
| 73 | +- outcome-side качество для DM/DR-family; |
| 74 | +- OOF/provenance markers для cross-fit path. |
120 | 75 |
|
121 | | -Harness поддерживает сравнение методов (`replay`, `ips`, `snips`, `dm`, `dr`, `sndr`, `switch_dr`) в разных режимах (logged/estimated propensity, cross-fit mode, clipping settings) и возвращает структурированные run-level и aggregate метрики (bias/std/RMSE, coverage, significance rate, diagnostic summaries). |
| 76 | +Диагностика — это support-сигналы для интерпретации, а не доказательство корректности результата. |
122 | 77 |
|
123 | | -Назначение — внутренний validation/regression инструмент для развития библиотеки. Это не универсальная гарантия корректности на произвольных real-world логах. |
| 78 | +## 7) Cross-fitting support и ограничения |
124 | 79 |
|
125 | | -Подробнее: `docs/validation_harness.md`. |
| 80 | +Поддерживаются: |
| 81 | +- `BehaviorPredictions`, `OutcomePredictions`, `CrossFitNuisanceBundle`; |
| 82 | +- OOF utilities для behavior/outcome nuisance; |
| 83 | +- `compare_policies(..., use_crossfit=True)` и передача внешнего `nuisance_bundle`. |
126 | 84 |
|
| 85 | +Текущее ограничение: |
| 86 | +- внешний nuisance не переиспользуется в bootstrap-resamples при несовпадении row identity/order (безопасный fallback на внутренний fit). |
127 | 87 |
|
128 | | -## 10) Nuisance-model quality diagnostics |
| 88 | +## 8) Validation harness: роль и ограничения |
129 | 89 |
|
130 | | -Дополнительно к overlap/weight diagnostics введён отдельный слой `nuisance diagnostics` для качества моделей `pi_hat` и `mu_hat`. |
| 90 | +`policyscope.validation.run_simulation_validation(...)` — инструмент synthetic-regression проверки estimator behavior против oracle. |
131 | 91 |
|
132 | | -Зачем: хорошие ESS/overlap сами по себе не гарантируют, что nuisance-модели адекватны. Поэтому в structured outputs добавляются behavior/outcome quality метрики и warning rules. |
| 92 | +Что даёт: |
| 93 | +- run-level и aggregate метрики (bias/error/coverage/significance/diagnostics). |
133 | 94 |
|
134 | | -Ключевые принципы: |
135 | | -- logged propensity path: behavior model quality помечается как not applicable; |
136 | | -- estimated propensity path: behavior quality считается и добавляется в summary; |
137 | | -- cross-fit mode: diagnostics отмечаются как OOF (fold-aware provenance). |
| 95 | +Что не даёт: |
| 96 | +- не является универсальной гарантией корректности для произвольных real-world логов. |
138 | 97 |
|
139 | | -Этот слой не меняет формулы estimators и служит для trust-quality интерпретации результатов. |
| 98 | +## 9) Recommended defaults и trust metadata |
140 | 99 |
|
| 100 | +High-level summary содержит guidance metadata: |
| 101 | +- preferred estimator: `dr`, |
| 102 | +- preferred propensity mode with logged column: `auto`, |
| 103 | +- fallback: `estimated`, |
| 104 | +- trust metadata: `diagnostic_warnings`, `inference_warnings`, `trust_notes`, `trust_level`. |
141 | 105 |
|
142 | | -## 11) Recommended defaults (API-polish) |
| 106 | +Важно: trust metadata — эвристическая поддержка принятия решений, а не замена A/B-тестам. |
143 | 107 |
|
144 | | -Чтобы high-level API был opinionated и безопаснее по умолчанию, в comparison metadata фиксируются рекомендации: |
145 | | -- `preferred_estimator_general_use = "dr"`; |
146 | | -- `preferred_propensity_mode_when_logged_available = "auto"`; |
147 | | -- `preferred_propensity_fallback_when_logged_unavailable = "estimated"`; |
148 | | -- рекомендация cross-fit для `dm/dr/sndr/switch_dr`. |
| 108 | +## 10) Non-goals (scope boundaries) |
149 | 109 |
|
150 | | -Это guidance-слой и metadata; математика реализованных estimators не меняется. |
| 110 | +`Policyscope` не пытается: |
| 111 | +- автоматически заменять продуктовые A/B-эксперименты одним OPE-числом; |
| 112 | +- выдавать «гарантии безопасности» только по CI/diagnostics; |
| 113 | +- менять математическую сущность существующих estimators без явного запроса. |
0 commit comments