Выключить гедоническую коррекцию — она стала чистым занижением цены #3538

Merged
lekss361 merged 1 commit from fix/hedonic-correction-off into main 2026-09-16 16:43:13 +00:00
Owner

Что происходит

Коррекция #2002 двигает точку expected_sold множителем exp(b0 + b_year*(year-2000)/20 - 0.0745*[floor==1]); b_larea намеренно 0 с #2620. Для дома 1980 года фактор 0.913, то есть −8.7%. Жилой фонд в выборке преимущественно старый → фактор систематически меньше единицы → коррекция просто снимает с цены проценты.

Замер

Контролируемый эксперимент: одна и та же выборка, один seed, меняется ровно эта переменная.
--engine full --sample 2000 --since 2025-06-01 --spread scattered --seed 42 --resolve-house-id

регион ВКЛ (сейчас) bias / MAPE / покрытие ВЫКЛ bias / MAPE / покрытие
77 Москва −9.1 / 20.5 / 69.0 −4.1 / 19.7 / 71.2
50 область −12.1 / 19.4 / 75.4 −10.4 / 19.2 / 74.8
66 область целиком −17.1 / 23.0 / 66.7 −12.4 / 23.2 / 66.2
66 только Екатеринбург −17.4 / 21.2 / 69.8 −14.2 / 21.3 / 69.9

Занижение уходит везде, MAPE и покрытие при этом не двигаются — то есть за занижение не куплено ничего. Последняя строка решающая: Екатеринбург — ровно та выборка, на которой коэффициенты перефитили 30.08.2026 (#3248, n=1269), и даже там выключение снимает 3.2 пункта.

Базлайн двигается в другую сторону — и это ожидаемо

Замороженный backtest_baseline.json пересобран, и он ухудшается: overall bias −1.61 → +2.87, MAPE 14.28 → 15.88, покрытие 87.41 → 83.59.

Это не противоречит замеру, а объясняется тем же. Фикстура содержит ровно 1269 сделок — те самые, на которых коэффициенты и фитили. Гейт на ней меряет качество подгонки на данных подгонки. Помогает в выборке фита, мешает везде вне её — это определение переобучения.

Прошу смотреть на таблицу выше, а не на базлайн: там четыре независимые выборки, включая ту же географию, но другие сделки.

Что НЕ сделано

Коэффициенты не тронуты, флаг оставлен. Включать обратно — только вместе с перефитом на актуальной базе (ratio переехал на area-бакеты в #2620, коэффициент asking→sold пересчитан по регионам 15.09, а хедонику с тех пор не пересчитывали) и повторным замером всех четырёх строк.

Test plan

  • pytest -k "estimator or backtest or quality_gate or spine" → 671 passed, 1 skipped
  • Регресс-гейт зелёный на пересобранном базлайне
  • ruff format + ruff check — чисто
  • После деплоя — контрольный прогон по трём регионам, числа должны совпасть с колонкой ВЫКЛ
## Что происходит Коррекция #2002 двигает точку `expected_sold` множителем `exp(b0 + b_year*(year-2000)/20 - 0.0745*[floor==1])`; `b_larea` намеренно 0 с #2620. Для дома 1980 года фактор 0.913, то есть **−8.7%**. Жилой фонд в выборке преимущественно старый → фактор систематически меньше единицы → коррекция просто снимает с цены проценты. ## Замер Контролируемый эксперимент: одна и та же выборка, один seed, меняется ровно эта переменная. `--engine full --sample 2000 --since 2025-06-01 --spread scattered --seed 42 --resolve-house-id` | регион | ВКЛ (сейчас) bias / MAPE / покрытие | ВЫКЛ bias / MAPE / покрытие | |---|---|---| | 77 Москва | −9.1 / 20.5 / 69.0 | **−4.1 / 19.7 / 71.2** | | 50 область | −12.1 / 19.4 / 75.4 | **−10.4 / 19.2 / 74.8** | | 66 область целиком | −17.1 / 23.0 / 66.7 | **−12.4 / 23.2 / 66.2** | | 66 только Екатеринбург | −17.4 / 21.2 / 69.8 | **−14.2 / 21.3 / 69.9** | Занижение уходит везде, MAPE и покрытие при этом не двигаются — то есть за занижение не куплено ничего. Последняя строка решающая: Екатеринбург — ровно та выборка, на которой коэффициенты перефитили 30.08.2026 (#3248, n=1269), и даже там выключение снимает 3.2 пункта. ## Базлайн двигается в другую сторону — и это ожидаемо Замороженный `backtest_baseline.json` пересобран, и он ухудшается: overall bias −1.61 → +2.87, MAPE 14.28 → 15.88, покрытие 87.41 → 83.59. Это не противоречит замеру, а объясняется тем же. Фикстура содержит ровно **1269** сделок — те самые, на которых коэффициенты и фитили. Гейт на ней меряет качество подгонки на данных подгонки. Помогает в выборке фита, мешает везде вне её — это определение переобучения. Прошу смотреть на таблицу выше, а не на базлайн: там четыре независимые выборки, включая ту же географию, но другие сделки. ## Что НЕ сделано Коэффициенты не тронуты, флаг оставлен. Включать обратно — только вместе с перефитом на актуальной базе (ratio переехал на area-бакеты в #2620, коэффициент asking→sold пересчитан по регионам 15.09, а хедонику с тех пор не пересчитывали) и повторным замером всех четырёх строк. ## Test plan - [x] `pytest -k "estimator or backtest or quality_gate or spine"` → 671 passed, 1 skipped - [x] Регресс-гейт зелёный на пересобранном базлайне - [x] `ruff format` + `ruff check` — чисто - [ ] После деплоя — контрольный прогон по трём регионам, числа должны совпасть с колонкой ВЫКЛ
lekss361 added 1 commit 2026-09-16 16:34:35 +00:00
fix(estimator): выключить гедоническую коррекцию — она стала чистым занижением
All checks were successful
CI Trade-In / backend-tests (pull_request) Successful in 5m3s
CI Trade-In / changes (pull_request) Successful in 12s
CI / changes (pull_request) Successful in 15s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
7472887026
Коррекция #2002 двигает точку expected_sold множителем
exp(b0 + b_year*(year-2000)/20 - 0.0745*[floor==1]); b_larea намеренно 0
с #2620. Для дома 1980 года фактор 0.913, то есть минус 8.7%, а жилой
фонд в выборке преимущественно старый — значит фактор систематически
меньше единицы и просто снимает с цены проценты.

Контролируемый замер на проде: одна и та же выборка, один seed, меняется
ровно эта переменная (--engine full --sample 2000 --since 2025-06-01
--spread scattered --seed 42 --resolve-house-id).

  регион            ВКЛ bias/MAPE/покрытие   ВЫКЛ bias/MAPE/покрытие
  77 Москва          -9.1 / 20.5 / 69.0       -4.1 / 19.7 / 71.2
  50 область        -12.1 / 19.4 / 75.4      -10.4 / 19.2 / 74.8
  66 обл. целиком   -17.1 / 23.0 / 66.7      -12.4 / 23.2 / 66.2
  66 только ЕКБ     -17.4 / 21.2 / 69.8      -14.2 / 21.3 / 69.9

Занижение уходит везде, точность при этом не меняется. Четвёртая строка
решающая: ЕКБ — ровно та выборка, на которой коэффициенты перефитили
30.08.2026 (#3248, n=1269), и даже там выключение снимает 3.2 пункта.

Замороженный базлайн пересобран и двигается В ДРУГУЮ СТОРОНУ: overall
bias -1.61 -> +2.87, MAPE 14.28 -> 15.88, покрытие 87.41 -> 83.59. Это не
противоречие, а та же причина с другой стороны: фикстура содержит ровно
1269 сделок, на которых коэффициенты и фитили, поэтому гейт меряет там
качество подгонки на данных подгонки. Помогает в выборке фита, мешает
везде вне её — это и есть переобучение.

Флаг оставлен, значения коэффициентов не тронуты. Включать обратно только
вместе с перефитом и повторным замером всех четырёх строк.
lekss361 merged commit 31b207be93 into main 2026-09-16 16:43:13 +00:00
lekss361 deleted branch fix/hedonic-correction-off 2026-09-16 16:43:14 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3538
No description provided.