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

Merged
lekss361 merged 1 commit from fix/hedonic-correction-off into main 2026-09-16 16:43:13 +00:00
2 changed files with 94 additions and 74 deletions

View file

@ -430,7 +430,27 @@ class Settings(BaseSettings):
# эконом/комфорт/премиум лучше, элит без изменений (no harm). # эконом/комфорт/премиум лучше, элит без изменений (no harm).
# После фактора заново применяется le_asking-кламп (expected_sold ≤ asking). # После фактора заново применяется le_asking-кламп (expected_sold ≤ asking).
# OFF ⇒ точно старое поведение expected_sold. # OFF ⇒ точно старое поведение expected_sold.
estimate_hedonic_correction_enabled: bool = True # ВЫКЛЮЧЕНА 2026-09-16. Замер на проде показал, что коррекция превратилась в
# чистое занижение цены: она двигает точку вниз и НЕ покупает за это точности.
# Контролируемый эксперимент — одна и та же выборка (--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 пункта
# занижения при неизменных MAPE и покрытии. Механика понятна из самих
# коэффициентов: b_larea=0, поэтому фактор = exp(-0.0140 + 0.0769*(year-2000)/20
# - 0.0745*[floor==1]), и для дома 1980 года это 0.913, то есть -8.7%. Жилой фонд
# в выборке преимущественно старый → фактор systematically < 1 → минус к цене.
# Коэффициенты фитили на остатке log(actual_sold/expected_sold) ПРИ ТОЙ базе,
# какая была тогда; база с тех пор уехала (area-бакетный ratio #2620, коэффициент
# asking->sold пересчитан по регионам 15.09), а хедонику не пересчитывали.
# ВКЛЮЧАТЬ ОБРАТНО только вместе с перефитом и замером всех четырёх строк выше.
estimate_hedonic_correction_enabled: bool = False
# #3248 (перефит 2026-08-30, n=1269 из свежей прод-фикстуры ЕКБ 1600 сделок). # #3248 (перефит 2026-08-30, n=1269 из свежей прод-фикстуры ЕКБ 1600 сделок).
# #
# Прежние значения (b0=0.6146, year=0.1220, larea=-0.1603, first=-0.1248) зафичены # Прежние значения (b0=0.6146, year=0.1220, larea=-0.1603, first=-0.1248) зафичены

View file

@ -2,21 +2,21 @@
"calibration": { "calibration": {
"high": { "high": {
"coverage_pct": 75.0, "coverage_pct": 75.0,
"mape_pct": 25.94, "mape_pct": 19.6,
"n": 8, "n": 8,
"n_covered": 6 "n_covered": 6
}, },
"low": { "low": {
"coverage_pct": 87.41, "coverage_pct": 83.59,
"mape_pct": 14.06, "mape_pct": 15.64,
"n": 1562, "n": 1562,
"n_covered": 1076 "n_covered": 1029
}, },
"medium": { "medium": {
"coverage_pct": 73.33, "coverage_pct": 70.0,
"mape_pct": 18.64, "mape_pct": 27.59,
"n": 30, "n": 30,
"n_covered": 22 "n_covered": 21
} }
}, },
"confidence_order": [ "confidence_order": [
@ -26,111 +26,111 @@
], ],
"expected_sold": { "expected_sold": {
"overall": { "overall": {
"mape_pct": 14.28, "mape_pct": 15.88,
"median_bias_pct": -1.61, "median_bias_pct": 2.87,
"n": 1269, "n": 1269,
"n_no_analogs": 0, "n_no_analogs": 0,
"p25_pct": -14.08, "p25_pct": -10.88,
"p75_pct": 14.6 "p75_pct": 22.98
}, },
"per_area_bucket": { "per_area_bucket": {
"0 <30": { "0 <30": {
"mape_pct": 16.51, "mape_pct": 19.76,
"median_bias_pct": -3.13, "median_bias_pct": -1.49,
"n": 161, "n": 161,
"p25_pct": -14.08, "p25_pct": -16.45,
"p75_pct": 22.87 "p75_pct": 34.7
}, },
"1 30-44": { "1 30-44": {
"mape_pct": 14.06, "mape_pct": 15.64,
"median_bias_pct": -2.33, "median_bias_pct": 4.37,
"n": 503, "n": 503,
"p25_pct": -14.49, "p25_pct": -10.58,
"p75_pct": 12.58 "p75_pct": 22.86
}, },
"2 44-62": { "2 44-62": {
"mape_pct": 12.48, "mape_pct": 13.86,
"median_bias_pct": -0.39, "median_bias_pct": 4.15,
"n": 379, "n": 379,
"p25_pct": -11.23, "p25_pct": -7.92,
"p75_pct": 14.65 "p75_pct": 23.85
}, },
"3 62-85": { "3 62-85": {
"mape_pct": 15.24, "mape_pct": 15.97,
"median_bias_pct": -1.94, "median_bias_pct": -2.33,
"n": 179, "n": 179,
"p25_pct": -14.98, "p25_pct": -12.1,
"p75_pct": 15.27 "p75_pct": 18.18
}, },
"4 >=85": { "4 >=85": {
"mape_pct": 20.88, "mape_pct": 20.46,
"median_bias_pct": -10.36, "median_bias_pct": -4.97,
"n": 47, "n": 47,
"p25_pct": -24.08, "p25_pct": -26.03,
"p75_pct": 13.38 "p75_pct": 7.15
} }
}, },
"per_rooms": { "per_rooms": {
"0": { "0": {
"label": "студия", "label": "студия",
"mape_pct": 16.51, "mape_pct": 19.76,
"median_bias_pct": -3.13, "median_bias_pct": -1.49,
"n": 161, "n": 161,
"n_no_analogs": 0, "n_no_analogs": 0,
"p25_pct": -14.08, "p25_pct": -16.45,
"p75_pct": 22.87 "p75_pct": 34.7
}, },
"1": { "1": {
"label": "1к", "label": "1к",
"mape_pct": 14.06, "mape_pct": 15.64,
"median_bias_pct": -2.33, "median_bias_pct": 4.37,
"n": 503, "n": 503,
"n_no_analogs": 0, "n_no_analogs": 0,
"p25_pct": -14.49, "p25_pct": -10.58,
"p75_pct": 12.58 "p75_pct": 22.86
}, },
"2": { "2": {
"label": "2к", "label": "2к",
"mape_pct": 12.48, "mape_pct": 13.86,
"median_bias_pct": -0.39, "median_bias_pct": 4.15,
"n": 379, "n": 379,
"n_no_analogs": 0, "n_no_analogs": 0,
"p25_pct": -11.23, "p25_pct": -7.92,
"p75_pct": 14.65 "p75_pct": 23.85
}, },
"3": { "3": {
"label": "3к", "label": "3к",
"mape_pct": 15.24, "mape_pct": 15.97,
"median_bias_pct": -1.94, "median_bias_pct": -2.33,
"n": 179, "n": 179,
"n_no_analogs": 0, "n_no_analogs": 0,
"p25_pct": -14.98, "p25_pct": -12.1,
"p75_pct": 15.27 "p75_pct": 18.18
}, },
"4": { "4": {
"label": "4+", "label": "4+",
"mape_pct": 20.88, "mape_pct": 20.46,
"median_bias_pct": -10.36, "median_bias_pct": -4.97,
"n": 47, "n": 47,
"n_no_analogs": 0, "n_no_analogs": 0,
"p25_pct": -24.08, "p25_pct": -26.03,
"p75_pct": 13.38 "p75_pct": 7.15
} }
}, },
"per_segment": { "per_segment": {
"бизнес": { "бизнес": {
"mape_pct": 16.86, "mape_pct": 19.58,
"median_bias_pct": -16.84, "median_bias_pct": -19.58,
"n": 144, "n": 144,
"p25_pct": -25.83, "p25_pct": -27.32,
"p75_pct": -9.36 "p75_pct": -12.79
}, },
"комфорт": { "комфорт": {
"mape_pct": 12.14, "mape_pct": 10.68,
"median_bias_pct": -5.9, "median_bias_pct": -5.78,
"n": 425, "n": 425,
"p25_pct": -16.66, "p25_pct": -15.88,
"p75_pct": 4.9 "p75_pct": 4.49
}, },
"премиум": { "премиум": {
"mape_pct": null, "mape_pct": null,
@ -140,18 +140,18 @@
"p75_pct": null "p75_pct": null
}, },
"эконом": { "эконом": {
"mape_pct": 15.17, "mape_pct": 20.17,
"median_bias_pct": 6.26, "median_bias_pct": 18.98,
"n": 697, "n": 697,
"p25_pct": -6.89, "p25_pct": 1.25,
"p75_pct": 28.97 "p75_pct": 41.97
}, },
"элит": { "элит": {
"mape_pct": 31.18, "mape_pct": 36.11,
"median_bias_pct": -31.18, "median_bias_pct": -36.11,
"n": 3, "n": 3,
"p25_pct": -46.94, "p25_pct": -44.21,
"p75_pct": -28.1 "p75_pct": -32.72
} }
} }
}, },
@ -162,9 +162,9 @@
}, },
"range_coverage": { "range_coverage": {
"overall": { "overall": {
"coverage_pct": 87.0, "coverage_pct": 83.22,
"n": 1269, "n": 1269,
"n_covered": 1104 "n_covered": 1056
}, },
"per_confidence": { "per_confidence": {
"high": { "high": {
@ -173,14 +173,14 @@
"n_covered": 6 "n_covered": 6
}, },
"low": { "low": {
"coverage_pct": 87.41, "coverage_pct": 83.59,
"n": 1231, "n": 1231,
"n_covered": 1076 "n_covered": 1029
}, },
"medium": { "medium": {
"coverage_pct": 73.33, "coverage_pct": 70.0,
"n": 30, "n": 30,
"n_covered": 22 "n_covered": 21
} }
} }
}, },