fix(mera/estimate): перефит хедоники поверх area-бакетного ratio — крупное жильё занижалось на 21% #3255
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3255
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3248-hedonic-refit"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Перефит хедонических коэффициентов поверх действующего area-бакетного ratio. Крупное жильё занижалось на 21%, а в выкупе занижение — это потерянные сделки.
Причина
Коэффициенты зафичены 27.06.2026 (#2002), когда asking→sold ratio ключевался по комнатам. 05.08.2026 (#2620) ratio переключили на area-бакеты — то есть под хедонику подставили другую базу, а её саму не пересчитали. Хедоника по определению чинит остаток
log(actual_sold / expected_sold)и верна только для той базы, на которой фитилась. Площадь в итоге штрафовалась дважды.larea = 0.0выставлен намеренноЭто не «не задан». Фактический
sold/askпо бакетам — перевёрнутая U:sold/askМонотонный
ln(area)такую форму выразить не может в принципе — он тянет крупное жильё вниз ровно там, где рынок его не дисконтирует. Сам ratio форму уже повторяет (отклонения ≤5%), так что член стал избыточным и вредным. Клэмпle_askingтут ни при чём: для бакета 4 он не срабатывает ни разу.Результат
Худший перекос вдвое меньше, все прочие классы в пределах ±3.1%, покрытие диапазона 86.13% → 87.00%. Цена — +0.38 п.п. общего MAPE: хедоника сжимает разброс за счёт года, и ослабление площадного члена этот эффект чуть уменьшает.
Рассмотренные альтернативы на той же фикстуре:
Критерии приёмки #3248 — выполнены частично
4+по модулю ≤8% — нет, −10.4%Остаток конфигом не закрывается: ratio бакета 4 = 0.8211 при фактических
sold/ask= 0.8640, то есть занижен на ~5% ещё до всякой хедоники. Это пересчёт самой таблицы (app/tasks/asking_to_sold_ratio.py) — отдельной задачей. Считаю правку стоящей мержа как есть: она вдвое сокращает систематическое занижение целого класса и улучшает покрытие, а +0.38 п.п. MAPE — небольшая цена за это.Тесты
Три теста в
test_estimator_hedonic.pyразвязаны от подгоняемых чисел: два проверяют механизм клэмпов и теперь задают коэффициенты явно черезmonkeypatch, третий сверяет наземную скидку со значением настройки, а не с зашитым0.8827. Иначе каждый следующий перефит ломал бы тесты, которые про механизм, а не про подгонку.Test plan
pytest -k "backtest or hedonic or estimator or price_from_inputs"— 622 passed, 1 skippedruff check+ruff format --checkчистоCloses #3248