Skip to content

Commit 03624c7

Browse files
committed
Clean architecture docs to stable present-tense wording
1 parent e898152 commit 03624c7

2 files changed

Lines changed: 66 additions & 104 deletions

File tree

README.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,15 @@ print(summary.to_dict())
6868

6969
Это **script-like experiment runners** для пакетных прогонов/артефактов, а не основной обучающий путь. Для обучения и first-run используйте notebook'и из раздела «Быстрый навигатор».
7070

71-
## Legacy tutorial
72-
73-
- `examples/tutorial.ipynb` сохранён как расширенный legacy walkthrough.
74-
- Для новых пользователей рекомендуется начинать с `examples/quickstart_own_data_ru.ipynb`.
71+
## Дополнительный tutorial
7572

73+
- `examples/tutorial.ipynb` сохранён как расширенный walkthrough.
74+
- Для первого запуска рекомендуется `examples/quickstart_own_data_ru.ipynb`.
7675

7776
Для multi-metric сценариев используйте `compare_policies_multi_target` (повторная scalar-оценка по нескольким target).
7877

79-
8078
Propensity source modes: `auto`, `logged`, `estimated` (для взвешенных estimators).
8179

82-
8380
Nuisance model diagnostics возвращаются в summary (`nuisance_diagnostics`) и дополняют overlap/weight diagnostics.
81+
82+
Важно: OPE + diagnostics/trust metadata помогают с offline screening, но не являются автоматической заменой A/B-теста для high-stakes решений.

docs/architecture.md

Lines changed: 61 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -5,146 +5,109 @@
55
`Policyscope` — библиотека для **off-policy evaluation** в постановке contextual bandit:
66

77
- есть логи поведения политики `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.
1010

11-
## 2) Доменная модель (phase 1)
12-
13-
### 2.1 Core entities
11+
## 2) Доменная модель
1412

1513
1. **BanditSchema**
16-
Декларирует контракт колонок: действие, награда, признаки, опционально propensity и cluster id.
14+
Контракт колонок: action, reward, features, опционально propensity и cluster id.
1715

1816
2. **LoggedBanditDataset**
19-
Лёгкая обёртка над `DataFrame` + `BanditSchema` с базовой валидацией и удобными accessors.
17+
Обёртка над `DataFrame` + `BanditSchema` с валидацией и accessors.
2018

2119
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-оценках.
2421

2522
4. **Point estimators**
26-
Оценщики значения политики (`replay`, `ips`, `snips`, `dm`, `dr`, `sndr`, `switch_dr`).
23+
`replay`, `ips`, `snips`, `dm`, `dr`, `sndr`, `switch_dr`.
2724

2825
5. **Inference**
29-
Слой построения CI и significance metadata (percentile bootstrap CI + centered paired bootstrap test), независимо от point-estimator.
26+
CI + significance metadata (включая centered paired bootstrap для проверки `delta=0`).
3027

3128
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.
3530

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.
4134

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(...)`.
4537

4638
## 3) Границы слоёв
4739

4840
```text
4941
Data contract -> Point estimation -> Inference -> Diagnostics/Reporting
5042
```
5143

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**: устойчивость и интерпретация результата.
9348

94-
Что пока не делаем (future work):
95-
- полноценный cross-fitting rollout для каждого estimator и bootstrap-веток;
96-
- жёсткий API-контракт для всех вариантов multi-fold обучения;
97-
- изменение математики уже реализованных OPE-оценщиков.
49+
## 4) Официальный high-level orchestration path
9850

99-
Краткая migration note:
100-
- текущий дефолтный workflow не меняется (внутренний fit nuisance работает как раньше);
101-
- при необходимости можно заранее посчитать OOF nuisance-предсказания и передать их в `compare_policies(..., nuisance_bundle=...)`;
102-
- на текущем этапе это интегрировано инкрементально и совместимо с существующим API.
51+
`compare_policies(...)` — основной entrypoint для сравнения A vs B на пользовательских логах.
10352

53+
Практический default-путь:
54+
- estimator: `dr`,
55+
- propensity mode: `propensity_source="auto"`,
56+
- вместе читать `Delta`, CI/p-value, diagnostics и trust metadata.
10457

105-
## 8) Logged vs estimated propensity (first-class modes)
58+
## 5) Propensity source modes (logged vs estimated propensity)
10659

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 режимы:
11161

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.
11365

114-
Migration note: текущий API совместим назад (по умолчанию `auto`), а дополнительная metadata (`propensity_source`, `propensity_column`, fallback notes) доступна без изменения формул estimators.
66+
Эти режимы отражаются в structured output (`propensity_source`, `propensity_column`, warnings/notes).
11567

68+
## 6) Nuisance-model quality diagnostics
11669

117-
## 9) Simulation validation harness
70+
Помимо overlap/weight diagnostics, summary содержит **nuisance-model quality diagnostics**:
11871

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.
12075

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-сигналы для интерпретации, а не доказательство корректности результата.
12277

123-
Назначение — внутренний validation/regression инструмент для развития библиотеки. Это не универсальная гарантия корректности на произвольных real-world логах.
78+
## 7) Cross-fitting support и ограничения
12479

125-
Подробнее: `docs/validation_harness.md`.
80+
Поддерживаются:
81+
- `BehaviorPredictions`, `OutcomePredictions`, `CrossFitNuisanceBundle`;
82+
- OOF utilities для behavior/outcome nuisance;
83+
- `compare_policies(..., use_crossfit=True)` и передача внешнего `nuisance_bundle`.
12684

85+
Текущее ограничение:
86+
- внешний nuisance не переиспользуется в bootstrap-resamples при несовпадении row identity/order (безопасный fallback на внутренний fit).
12787

128-
## 10) Nuisance-model quality diagnostics
88+
## 8) Validation harness: роль и ограничения
12989

130-
Дополнительно к overlap/weight diagnostics введён отдельный слой `nuisance diagnostics` для качества моделей `pi_hat` и `mu_hat`.
90+
`policyscope.validation.run_simulation_validation(...)` — инструмент synthetic-regression проверки estimator behavior против oracle.
13191

132-
Зачем: хорошие ESS/overlap сами по себе не гарантируют, что nuisance-модели адекватны. Поэтому в structured outputs добавляются behavior/outcome quality метрики и warning rules.
92+
Что даёт:
93+
- run-level и aggregate метрики (bias/error/coverage/significance/diagnostics).
13394

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 логов.
13897

139-
Этот слой не меняет формулы estimators и служит для trust-quality интерпретации результатов.
98+
## 9) Recommended defaults и trust metadata
14099

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`.
141105

142-
## 11) Recommended defaults (API-polish)
106+
Важно: trust metadata — эвристическая поддержка принятия решений, а не замена A/B-тестам.
143107

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)
149109

150-
Это guidance-слой и metadata; математика реализованных estimators не меняется.
110+
`Policyscope` не пытается:
111+
- автоматически заменять продуктовые A/B-эксперименты одним OPE-числом;
112+
- выдавать «гарантии безопасности» только по CI/diagnostics;
113+
- менять математическую сущность существующих estimators без явного запроса.

0 commit comments

Comments
 (0)